Java流-总结

引言: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();
}

推荐阅读更多精彩内容

  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 1,898评论 3 10
  • Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符...
    布鲁斯不吐丝阅读 552评论 0 4
  • 注册登录系统对于每一个网站或者应用的成长,获取稳定的用户是至关重要的。那么,一个应用应该如何将一个访客转化为用户呢...
    龙隐阅读 10,583评论 3 17
  • 今天,与一位朋友说笑。她对我说有关于男生的话题,然后我就笑话说:你一天到晚谈论的都是男生。突然我想起来,说了一句:...
    miss琴先生阅读 136评论 0 1