Java的IO系统是用来进行输入和输出的,Java系统本身提供了非常丰富的类库,利用这些类库几乎可以进行一切
的IO操作,但要彻底弄明白这些类的用法和它们之间的关系却并还容易,笔者总结了一些学习Java IO的思路,
希望对大家能有帮助。
一、明白Input、Output、Read、Write、Stream的含义。很多时候在Java中使用IO的时候,都是这几个关键字交叉混合使用,一不小心就容易弄迷,要明这四个关键字,就要把握住一点,Java中IO的所有操作就是两类,输入和输出,而所谓的输入、输出都是站在程序的角度而言的。
比如要通过一个程序,往硬盘中写入一个文件,对程序而言,肯定是程序在源源不断的把数据往硬盘上放,对程序而言它是在Output,也就是在往出Write,所以Output总是Write对应,表达的是输出的意思。
反过来,要通过一个程序把内存中的数据取出来,那么程序要做的工作就是源源不断的把内存中的数据往外拿,就要不断的去读,从程序的角度看,是有数据不断的往程序里放,这样就是Input,它在Input的时需要不断的Read,所以Input总是Read对应。
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream都包括Input和Output两种类型。
二、JavaIo的分类
2.1对IO的分类:
所有JavaIO都可以分成两类:
输入流:
输出流:
2.2对输入输出的分类:
所有的输入流、输出流都可以分为字节(输入、输出)流,字符(输入、输出)流,处理字节的主要是(OutputStream/InputStream) 系列,处理字符的,主要是(Reader/Write)系列
2.2.1以字节(Byte)为导向的输入流(InputStream系列):
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream2.2.2以字节(Byte)为导向的输出流(OutputStream系列):
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream:把多个OutStream合并为一个OutStream
2.2.3以Unicode字符为导向的输入流(Reader系列):1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应2.2.4以Unicode字符为导向的输出流(Write系列):
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应
2.3对所有流的修饰、转换、封装而设置的流(Filter系列)“修饰”流(这是我在这里起的一个形象的名字,文献中没有这种叫法)
输入系列:
2.3.1 用于封装以字节为导向的,以下主要是用来修饰InputStream系列的各种输入
1) DataInputStream: 从stream中读取基本类型(int、char等)数据。
2) BufferedInputStream: 使用缓冲区
3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
4) PushbackInputStream: 很少用到,一般用于编译器开发
2.3.2 用于封装以字符为导向的,以下主要是用来修饰Reader系列的各种输入
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
2) BufferedReader:与BufferedInputStream对应
3) LineNumberReader:与LineNumberInputStream对应
4) PushBackReader:与PushbackInputStream对应
输出系列:2.3.3 用于封装以字节为导向的,主要用来修饰OutputStream系列的各种输出
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
2) BufferedOutStream:使用缓冲区
3) PrintStream:产生格式化输出2.3.4 用于封装以字符为导向的,主要用来修饰Write系列的各种输出
1) BufferedWrite:与对应
2) PrintWrite:与对应
三、一个特殊的类:RandomAccessFile
针对这个类,记住以下几点:
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置四、总结:
4.1、节点流类型(一根管直接插到下面的类型上,下面的管道指的是线程和线和之间的通讯)
4.2、分类表:
类型 字符流 字节流
File FileReader FileInputStreamFileWriter FileOutputStream
Memory Array CharArrayReader ByteArrayInputStream
CharArrayWriter ByteArrayOutputStream
Memory String StringReader StringWriter
Pipe(管道) PipedReader PipedInputStream
PipedWriter PipedOutputStream4.3、缓冲流要"套接"在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效
对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内在中的数据立刻写出
4.4、转换流
InputStreamReader和OutputStreamWriter用与字节数据到字符数据之间的转换
InputStreamReader需要和InputStream"套接"
OutputStreamReader需要和OutputStream"套接"
在下一篇文章中,会找一些关于JavaIO操作的实际代码,可以参考学习