引言:Java的IO是Java的重中之重,之前一直对各种IO流了解的模模糊糊,今天花了一天时间将所有常用的IO流均复习了以便,遂做以下笔记:
各种流的主要功能:
文件
管道
网络连接
内存缓存
System.in, System.out, System.error(注:Java标准输入、输出、错误输出)
一:字节流:
1.1:字节输入流
- 1:inputStream:所有的字节输入流的父类,
- 2:FileInputStream 基本的介质流,本地文件中读取数据。注意编码问题;
- 3:FilterInputStream:是实现自定义过滤输入流的基类,基本上它仅仅只是覆盖了InputStream中的所有方法。
- 3.1:BufferedInputStream:字节缓冲流;字节装饰流:可以自定义缓冲大小,主要用来提高字节流的读取速度;
- 3.2:DataInputStream:可以使你从输入流中读取Java基本类型数据,而不必每次读取字节数据。你可以把InputStream包装到DataInputStream中,然后就可以从此输入流中读取基本类型数据了
- 3.3:PushbackInputStream:用于解析InputStream内的数据。有时候你需要提前知道接下来将要读取到的字节内容,才能判断用何种方式进行数据解析。PushBackInputStream允许你这么做,你可以把读取到的字节重新推回到InputStream中,以便再次通过read()读取
- 4:ObjectInputStream:主要用来读取对象的;(处理对象的序列化的)前提是:该类需要实现Serializable接口;
- 5:PipedIInputStream:管道流,主要用来同一个进程的不同线程之间进行通信的管道流;一个PipedInputStream需要与一个PipedOutputStream相关联,当这两种流联系起来时,就形成了一条管道;
- 6:SequenceInputStream:组合流:可以将两个字节流组成一个流;把一个或者多个InputStream整合起来,形成一个逻辑连贯的输入流。当读取SequenceInputStream时,会先从第一个输入流中读取,完成之后再从第二个输入流读取,以此推类;
- 7:StringBufferInputStream:该流读取的字节由字符串的内容提供的输入流。应用程序还可以通过使用ByteArrayInputStream.Only字符串中的低八位每个字符都使用这个类读取一个字节数组字节。
PS:这个此类已被Oracle否决,不再被使用。 - 8:ByteArrayInputStream:基本介质流:存在的意义是将内存中的一个byte数组,让它可以通过InputStream的API来操作读取,主要是为了方便;
注意调用它的close方法将不会产生效果,调用close方法之后仍然可以 调用它的其他方法不会抛出异常
1.2:输出流
- 1:FlieOutputStream: 基本的介质流,向本地文件中输出数据。注意编码
- 2:FilterOutputStream:是实现自定义过滤输出流的基类,基本上它仅仅只是覆盖了OutputStream中的所有方法;
- 2.1:BufferedOutputStream:字节输出成缓冲流;字节装饰流:可以自定义缓冲大小,主要用来提高字节流的读取速度;
- 2.2:DataOutputStream:可以使你从输出流中输出Java基本类型数据,而不必每次输出字节数据。你可以把OutputStream包装到DataOutputStream中,然后就可以从此输出流中输出基本类型数据了。
- 2.3:PrintStream:允许你把格式化数据写入到底层OutputStream中。比如,写入格式化成文本的int,long以及其他原始数据类型到输出流中,而非它们的字节数据。
PrintStream包含2个强大的函数,分别是format()和printf()(这两个函数几乎做了一样的事情,但是C程序员会更熟悉printf())。
也可以认为是一个辅助工具。主要可以向其他输出流,或者FileInputStream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以踢出IO 包!System.out 和System.out 就是PrintStream 的实例! - 3:ObjectOutputStream:输出对象(对象序列化):前提是该类实现了Serializable;
- 4:PipedOutputStream:管道流:
主要用于同一个进程里面的两个线程之间进行通信使用的
一个PipedInputStream需要与一个PipedOutputStream相关联,当这两种流联系起来时,就形成了一条管道 - 5:ByteArrayOutputStream:ByteArrayOutputStream 字节输出流可以用来缓存我们读取的数据;方便二次读取。
二:字符流:
2.1:字符输入流
1:Reader:字符输入流的基类,是一个抽象类
- 1.1:BufferedReader:字节输入缓冲流,功能和BufferedInputStream类似,只不过它读取数据是以字符为单位的;
- 1.2:InputStreamReader:字节流转换成字符流;
- 1.2.1:FileReader:能够以字符流的形式读取文件内容。除了读取的单位不同之外,FileReader与FileInputStream并无太大差异,也就是说,FileReader用于读取文本。根据不同的编码方案,一个字符可能会相当于一个或者多个字节.
- 1.3:StringReader:基本的介质流,能够将原始字符串转换成Reader,String中读取数据。
- 1.4:PipedReader:和PipedInputStream类似,管道字符流,
- 1.5:ByteArrayReader:和ByteArrayInputStream:作用类似存在的意义是将内存中的一个byte数组,让它可以通过InputStream的API来操作读取;
- 1.6:FilterReader:是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
- 1.6.1:PushBackReader:作用和PushBackInputStream类似,允许回写;
2.2:字符输出流
1:Writer:所有字符输出流的基类;是一个抽象类;
- 1.1:BufferderWriter:是一个装饰器为Writer 提供缓冲功能。
- 1.2:OutputStreamWriter:字节输出流转换成字符输出流;OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。
- 1.2.1:FileWriter:FileWriter能够把数据以字符流的形式写入文件。同样是处理文件,FileWriter处理字符,FileOutputStream处理字节.根据不同的编码方案,一个字符可能会相当于一个或者多个字节
- 1.3:PrintWriter:和PrintStream 极其类似,功能和使用也非常相似。
- 1.4:StringWriter:能够以字符串的形式从Writer中获取写入到其中数据
- 1.5:PipedWriter:是向与其它线程共用的管道中写入数据,一般和PipedReader结合使用;
- 1.6:CharArrayWriter:基本介质流,向Char 数组中写入数据。能够把字符写入到字符输出流writer中,并且能够将写入的字符转换成字符数组;
当你需要以字符数组的形式访问写入到writer中的字符流数据时,CharArrayWriter是个不错的选择。 - 1.7:FilterWriter:和FilterOutputStream功能类似;装饰流;
- 1.8:LineNumberReader是记录了已读取数据行号的BufferedReader。默认情况下,行号从0开始,当LineNumberReader读取到行终止符时,行号会递增(译者注:换行\n,回车\r,或者换行回车\n\r都是行终止符)。
你可以通过getLineNumber()方法获取当前行号,通过setLineNumber()方法设置当前行数(译者注:setLineNumber()仅仅改变LineNumberReader内的记录行号的变量值,不会改变当前流的读取位置。流的读取依然是顺序进行,意味着你不能通过setLineNumber()实现流的跳跃读取)。
三:关于文件
File对象:
判断文件夹是否存在:得到文件的父目录,如果父目录不存在就创建目录;
File parent = file.getParent File();
if(!parent.exists()){
fileP.mkdirs();
}
判断文件是否存在,如果不存在就创建:
if(!file.exists()){
file.createNewFile();
}
网友评论