java之I/O流

简介:

数据流(Stream)是指数据通信的通道。

      Java程序中对数据的输入、输出操作是以流的方式进行的,JDK又提供了各种流类,来获取不同种类的的数据。

      流的分类:

      按流向分

           ·输入流:从文件、网络、内存等(数据源)到程序中,是read的过程,是input的过程,处理这样事物的流,是输入流。

           ·输出流:从程序到文件,网络,内存等,是写的过程这样的流是输出流。

      按传输的单位:

           ·字节流:以字节为传输的单位。8bit = 1byte 处理二进制文件,包括mp3,jpg,exe,doc,ppt,pdf...Java中以Stream结尾的流都是字节流。

           ·字符流:以字符为传输的单位。以reader结尾的流是输入字符流,以writer结尾的流是输出字符流。

      按功能(层次):

           ·节点流:用于直接操作目标设备的流。

           ·处理流:对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大,灵活的读写功能。

JDK提供的相关类:InputStreamOutStreamReaderWriter。四个都是抽象类。


字节流

字符流

输入流

InputStrean

Reader

输出流

OutputStream

Writer

    可以这样理解类中含有Stream的是字节流,含有ReaderWriter的是字符流,带有InputReader的是输入流,带有OutputWriter的是输出流。

InputStream:继承此类的流都是输入流。数据读取的单位是一个字节(8位)。

    public abstractint read() throws IOException:从输入流中读取数据的下一个字节。读到末尾返回-1

    public intread(byte[] b) throws IOException:从输入流中读取b.length 个字节的数据并存储到缓冲区数组b.返回的是实际读到的字节总数。

    public voidclose() throws IOException:关闭此输入流并释放与此流关联的所有系统资源。

OutputStream:继承此类的都是输出流,数据单位是字节(8位)。

    public abstractvoid write(int b) throws IOException:将指定的字节写入此输出流

    public voidwrite(byte[] b) throws IOException:将 b.length个字节从指定的 byte 数组写入此输出流

    public voidflush() throws IOException:刷新此输出流并强制写出所有缓冲的输出字节。如果输出的,要立即看到结果。需要使用此方法,因为在输出流没有关闭前,不一定写到文件。

    pulbic voidclose() throws IOException:关闭此输出流并释放与此流有关的所有系统资源(含刷新操作)

Wiriter:继承此类的都是输出字符流,且字符的单位是字符(16位)。

    public voidwrite(int c) throws IOException

写入单个字符

    public voidwrite(char[] cbuf) throws IOException

写入字符数组

    public voidwrite(String str) throws IOException:写出字符串到关联的数据源中去

    public abstractvoid close() throws IOException:关闭此流,但要先刷新它

    public abstract voidflush() throws IOException:刷新该流的缓冲,将缓冲的数据全写到目的地。

Reader:继承此类的流大多是输入字符流。单位是字符。

常用的方法:

    abstract int read(char[] buf, int offset, int count):读取指定字符偏移量offset最多count个到buf的字符数组中。

I/O流之节点流

节点流分为文件流、内存流、管道流。

      文件流主要用来操作文件,主要以FileXxx的类,是文件流。比如FileInputStreamFileOutputStreamFileReaderFileWriter

      内存流主要用来操作内存的。ByteArrayInputStream 和 ByteArrayOutputStream 

处理流又称过滤流。缓冲流:提高数据流的读写效率。

节点流又分为文件流和内存流。

文件流主要类有FileInputStreamFileOutputStreamFileReaderFileWriter

内存流主要用来操作内存,ByteArrayInputStream(内存输入流,主要完成将内容从内存读入程序之中)和ByteArrayOutputStream(内存输出流,主要是将数据写入到内存中)。ByteArrayOutputStream类中有一个方法toByteArray(),可以将刚写入到内存中的数据流,返回一个byte类型的字节数组。

处理流又称过滤流,大致可以分为缓冲流,Object流,打印流,转换流,数据流。

缓冲流是处理流的一种,建立在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,还增加了一些新的方法。相关的类有

1.  BufferedInputStream 可以对任何的InputStream流进行包装。

2.  BufferedOutputStream 可以对任何的OutputStream流进行包装。

3.  BufferedReader 可以对任何的Reader流进行包装。新增了readLine()方法用于一次读取一行字符串(以‘\r’或‘\n’认为一行结束)返回一行如果没有返回null

4.  BufferedWriter 可以对任何的Writer流进行包装,新增了newLine()方法用于写入一个行分隔符。

对于缓冲输出流,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据立刻写出。关闭过滤流时,会自动关闭过滤流所包装的所有底层流。

Object流(对象流):JDK提供的ObjectOutputStream ObjectInputStream 类是用于存储和读取基本数据类型或对象的过滤流。

1.  ObjectOutputStream类保存基本数据类型或对象的机制叫序列化。

2.  ObjectInputStream类读取基本数据类型或对象的机制叫反序列化。

能被序列化的对象所对应的类必须实现java.io.Serializable这个标识性接口

打印流:PrintStreamPrintWriter都属于输出流,分别针对字节和字符。PrintStreamPrintWriter类都提供了一系列重载的printprintln方法来输出各种类型的数据。

转换流:在IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换流。转换流用于在字节流和字符流之间转换。

JDK提供了两种转换流:

A.  InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。InputStreamReader需要和InputStream“套接”,它可以将字节流中读入的字节解码成字符。

B.  OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。OutputStreamWriter需要和OutputStream“套接”,它可以将要写入字节流的字符编码成字节。

数据流:DataInputStreamDataOutputStream。要注意,读写字符串的方法readUTF()writeUTF();

在众多的流操作中,各种流之间要结合使用,同时也要注意读取和写入效率,比如:在读取或者写入的文件较大时,就要考虑使用缓冲流;或者定义一个缓冲字节数组,提高流的操作效率。

还要注意,关闭流时,一定要考虑清楚,因为,关闭高级流会把相关的第一流关闭掉,这样再对流进行操作,会出现异常。流一旦关闭,则同一个流无法再开启。

本文转自 墨宇hz 51CTO博客,原文链接:http://blog.51cto.com/zzhhz/1628960



相关文章
|
4月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java输入输出:什么是NIO(New I/O)?
33 1
|
7月前
|
Java
63.【Java I/O 操作】(一)
63.【Java I/O 操作】
39 0
|
1月前
|
Java
【Java】深入了解Java I/O 流
【Java】深入了解Java I/O 流
31 0
|
7月前
|
Java
63.【Java I/O 操作】(三)
63.【Java I/O 操作】
27 0
|
6月前
|
Java
Java I/O流知识点总结分享
Java I/O流知识点总结分享
|
6月前
|
Java 程序员 数据处理
【Java 多线程编程 | 从0到1】线程I/O模型
【Java 多线程编程 | 从0到1】线程I/O模型
85 0
|
7月前
|
Java
63.【Java I/O 操作】(四)
63.【Java I/O 操作】
31 0
|
7月前
|
Java
63.【Java I/O 操作】(二)
63.【Java I/O 操作】
34 0
|
8月前
|
存储 Java
[java]I/O
[java]I/O
44 0
|
8月前
|
存储 Java