Java IO - omigaw/spring- GitHub Wiki
JAVA的I/O大概可以分为以下几类:
- 磁盘操作:File
- 字节操作:InputStream 和 OutputStream
- 字符操作:Reader 和 Writer
- 对象操作:Serializable
- 网络操作:Socket
- 新的输入/输出:NIO
File类可以用于表示文件和目录的信息,但是它不表示文件的内容。 从Java7开始,可以使用Paths和Files代替File。
Java IO 使用了装饰者模式来实现。以InputStream为例
- InputStream是抽象组件
- FileInputStream是InputStream的子类,属于具体组件,提供了字节流的输入操作。
- FilterInputStream属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能。例如BufferedInputStream为FileInputStream提供缓存的功能。
编码与解码: 编码就是把字符转换为字节,解码就是把字节重新组合成字符。
- GBK:中文两个字节,英文一个字节
- UTF-8:中文三个字节,英文一个字节
- UTF-16be:中文两个字节,英文两个字节 char这种类型使用UTF-16be进行编码。char类型占16位,也就是两个字节,Java使用这种双字节编码是为了让一个中文或者英文都能使用一个char来存储。 String的编码方式: String可以看成一个字符序列,可以指定一个编码方式将它编码为字节序列,也可以指定一个编码方式将它编码为字符序列。 getBytes()的默认编码方式与平台有关,一般为UTF-8。
序列化: 序列化就是将一个对象转换成字节序列,方便存储和传输。
- 序列化:ObjectOutputStream.writeObject()
- 反序列化:ObjectInputStream.readObject() 序列化的类需要实现Serializable接口,它只是一个标准,没有任何方法需要实现,但是如果不去实现它而进行序列化,会抛出异常。 transient:transient关键字可以使一些属性不会被序列化。 ArrayList中存储数据的数组elementData是用transient修饰的。
网络操作: Java中的网络支持:
- InetAddress
- URL
- Sockets
- Datagram
NIO: 新的输入、输出(NIO)库是在JDK1.4中引入的,弥补了原来的I/O的不足,提供了高速的、面向块的I/O。 流与块: I/O与NIO最重要的区别是数据打包和传输的方式,I/O以流的方式处理数据,而NIO以块的方式处理数据。 NIO与普通I/O的区别主要有以下两点:
- NIO是非阻塞的。
- NIO面向块,I/O面向流。 NIO包括:Channel Selector Buffer
C10k-problem