1.Input/Output Streams
java中input stream是我们用来读取数据字节的对象;output stream是我们用来输出数据字节的对象。输入输出流关注的是数据的读写过程,而具体数据存储可以在文件中,网络中,也可以在内存中。
抽象类InputStream和OutputStream是基本类。
字节流byte stream处理Unicode数据不方便,所以有专门的Reader和Writer来处理字符,基于char,而非byte。
读写字节:
InputStream中有read方法,返回读取的字节对应的int值,到末尾返回-1:
abstract int read()
不同的子类根据需要重写该方法,比如FileInputStream从文件中读取,http://System.in从控制台或重定向文件中读取。
InputStream中还有其他的读方法,比如readAllBytes,都是在read基础上的扩展。
OutputStream中有write方法,每次将一个字节写入:
abstract void write (int b)
也可以传入一个字节数组,一次写入。
in.transferTo(out)将输入数据传递到输出。
read和write在没有完成工作时会阻塞,使用available检查可读数据数目,可以避免线程阻塞。
完成读写任务后,需要调用close来关闭资源,否则会浪费系统的I/O资源。调用close会自动flush输出的缓冲区,因为字节先被放在缓冲区,收集打包后再传递。所以关闭时会自动flush,也可以手动flush。
I/O流家族:
java根据流的使用方式,将流分为不同的类别。比如Date前缀允许以二进制读写基本类型流;Zip前缀,根据压缩格式读写数据;对于Unicode文本,使用Reader和Writer,不同之处在于读写方法处理char(UTF-16)。
还有四个额外的接口,Closeable,Flushable,Readable,Appendable。
Closeable包含void close() throws IOException方法,Flushable包含void flush()方法。java.io.Closeable接口继承自java.lang.AutoCloseable接口,可以使用try-with语句来控制资源。
Readable接口包含int read(CharBuffer cb)方法,CharBuffer支持连续或随机访问。
Appendable接口包含append(char c)和append(CharSequence s)用于处理字符串,String,CharBuffer,StringBuffer,StringBuilder实现了该接口。
使用过滤器:
FileInputStream和FileOutputStream将输入输出绑定到文件,通过传入文件路径到构造器,获取流对象。io包使用相对路径,通过System.getProperty("user.dir")获取工作目录。注意\在字符串中表示转义,需要\\来表示。
文件I/O也只提供字节处理。而Date前缀I/O可以直接处理类型。可以通过构造器将两者结合,将一个文件I/O通过构造器传入数据I/O进行处理,实现了获取与处理的分离。
数据I/O要先实现FilterInputStream和FilterOutputStream,过滤器提供了处理(process)加工字节流的方法。
使用Buffered缓冲I/O先将文件加载到内存,可以提高操作效率。
Pushback前缀允许读后一位read或者unread将其返回。
通过链式构造器,获取想要的I/O。
文本I/O:
保存数据有两种方式,一种是二进制字节流,另一种是字符串。当使用字符串时,需要注意编码格式(character encoding),java语言常用的是以char为基础的UTF-16编码,而网络上流行的编码是UTF-8。
OutputStreamWriter将Unicode编码的输出流转变为字节流,根据选择的编码方式,InputStreamReader将字节流转化为字符流,在构造方法中传入编码方式。
写入文本输出&#x