在咱们的平常开发中 I/O
涉及到咱们开发的方方面面,虽然早在 JDK1.5
就新增了 NIO
的概念,可是 java.io
的使用以及技巧在咱们的平常开发中仍是占据很高的比重。java
最基本的I/O
流是 java.io
包中的抽象类 java.io.InputStream
和 java.io.OutputStream
。s有预留的设计比较早,所以并无采用如今流行的面向接口的编程思路,而是采用了抽象类。新增的I\O
相关的API则大量使用了接口。若是留的实现只是对使用者暴漏字节这个层次的细节,则能够直接集成InputStream 或 OutputStream 类,而且提供本身二外的能力。编程
在接下来的几个章节中,会逐章记录
如下各类流类的详细使用方法数组
BufferedInputStream
, BufferedOutputStream
缓冲复用流ByteArrayInputStream
, ByteArrayOutputStream
byte数组缓冲流DataInputStream
, DataOutputStream
java原生数据流ObjectInputStream
, ObjectOutputStream
对象序列化流PushbackInputStream
, PushbackOutputStream
推回流PipedInputStream
, PipedOutputStream
管道流SequenceInputStream
, SequenceOutputStream
序列流和字符流类和字符流的的装饰类性能
Reader
, Writer
InputStreamReader
, InputStreamWriter
StringReader
, StringWriter
BufferedReader
, BufferedWriter
CharArrayReader
, CharArrayWriter
同时也会记录一些 java8 融入 Google guava
类库对 流类的支持。设计
输入流 InputStream
类中包含两类功能code
public abstract int read() throws IOException
public int read(byte b[]) throws IOException
public int read(byte b[], int off, int len) throws IOException
比较常见的操做流的方式就是 建立一个字节数组做为缓冲区,而后循环读取,直到read方法返回-1或抛出 java.io.IOException 异常。read方法的返回值是每次调用中成功读取的字节数。
须要要注意的是在读取的过程当中,对read方法调用是阻塞的。当流中没有数据可用时,对read方法的调用须要等待。这种阻塞式的特性可能会成为应用中的性能瓶颈。对象
若是不使用字节数组,那么read方法每次只能读取到一个字节,再有缓冲区的状况下虽然InputStream类每次也只是读取一个字节,可是 InputStream类的子类通常会接受一个缓冲区最为参数的read方法提供更高效的实现。接口
正像他的名字同样,字节流是流动的,像流水同样。刘中的字节一旦流过去,就没法从新使用。ip
控制流的功能。开发
close
关闭功能try-with-resource
语句来使用流。能够避免显示的调用close方法。javatry ( FileInputStream fInput = new FileInputStream(new File("path/to/exists_file")); FileOutputStream fOutput = new FileOutputStream(new File("path/to/new_file")); ) { // ....fInput -> read -> fOutput } catch (IOException e) { ..... } catch (FileNotFoundException e) { ..... }
skip
跳过若干个字节。至关于保留当前的位置日后移动若干个字节,这个功能能够经过skip方法来实现并非全部的InputStream累都支持skip方法。
mark
读取位置标记
reset
读取位置重置available
获取当没有阻塞状况下,当前流中还有多少字节可供读取。若是咱们每次读取调用available方法获取到的字节书,不如在读取一个大文件的同时对文件的内容进行处理,若是每次读取是都不发生阻塞,就能够比较好的平均数据读取和处理的时间。与InputStream类相对应的OutputStream类表示基本的输出流,用来把数据从程序输出到其余地方。基本OutputStream类的对象也是在本身这个层次上操做。其中最主要的是写入数据的write方法。
write 写入方法。public abstract void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void write(byte b[], int off, int len) throws IOException
write 方法也有3种相似的重载形式,能够每次写入一个字节,也能够写入一个字节数组中所有或部份内容。
控制方法
close
方法flush
方法 强制要求OutputStream类对象对暂时保持内部缓冲区中的内容当即进行实际的写入操做。由于有些OutputStream类的子类会在内部维护一个缓冲区,经过write方法写入的数据会被首先放在这个缓冲区中,而后再摸个适合的实际执行已经缓冲的内容的写入操做。在通常的场景中OutputStream对象的使用者通常不须要直接调用flush方法保证内部缓冲区数据成功写入。这是由于当OutputStream类对象内部的缓冲区满了之后,会自动执行写入操做。OutputStram类的对象被关闭时,flush方法通常也会被自动调用。