关于java中的文件读写java io【复习1】

来源:互联网 发布:淘宝基础版不能设背景 编辑:程序博客网 时间:2024/06/03 19:57

原文一:点击打开链接

原文二:点击打开链接



java io体系介绍

Java语言的I/O库提供了四大等级结构:InputStream,OutputStream,Reader,Writer四个系列的类。

InputStream和OutputStream处理8位字节流数据;

Reader和Writer处理16位的字符流数据;

InputStream和Reader处理输入;

OutputStream和Writer处理输出。

为了方便比较这几种类型,顺便附上Java语言的I/O层次结构图:

Java语言的I/O层次结构图

下面的图表示:以InputStream和OutputStream形成的层次关系




 下面的图表示:以Reader和Writer形成的层次关系


体系解读:

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:

1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系

2. 原始处理器(适配器:接收的是“流源对象”:String,byte数组等)与链接流处理器(装饰器:接收的是“流对象”:stream类)【具体是什么, 原文一 中有介绍】

a.基类:

InputStream和OutputStream是所有字节输入输出流的基抽象类,同时也是适配器(原始处理器)需要适配的对象,也是装饰器(链接流处理器)装饰对象的基类;

b.原始处理器

原始流处理器接收Byte数组对象,String对象,FileDescriptor对象将其适配成InputStream,以供其他装饰器使用,他们都继承自InputStream 包括如下几个:

ByteArrayInputStream: 接收Byte数组为流源,为多线程通信提供缓冲区操作功能

FileInputStream: 接收一个File作为流源,用于文件的读取

PipedInputStream: 接收一个PipedOutputStream,与PipedOutputStream配合作为管道使用

StringBufferInputStream: 接收一个String作为流的源(已弃用)

c. 链接流处理器

链接流处理器可以接收另一个流处理器(InputStream,包括链接流处理器和原始流处理器)作为源,并对其功能进行扩展,所以说他们是装饰器.

1) FilterInputStream继承自InputStream,是所有装饰器的父类,FilterInputStream内部也包含一个InputStream,这个InputStream就是被装饰类--一个原始流处理器,它包括如下几个子类:

BufferedInputStream: 用来将数据读入内存缓冲区,并从此缓冲区提供数据

DataInputStream: 提供基于多字节的读取方法,可以读取原始数据类型(Byte, Int, Long, Double等等)

LineNumberInputStream:  提供具有行计数功能的流处理器

PushbackInputStream:  提供已读取字节"推回"输入流的功能

2) ObjectInputStream: 可以将使用ObjectOutputStream写入的基本数据和对象进行反串行化

3) SequenceInputStream: 可以合并多个InputStream原始流,依次读取这些合并的原始流

对于OutputStream, Reader, Writer的体系结构也跟InputStream的结构类似


部分IO类的简介:

InputStream: 所有字节输入流的超类,这个类的父类是Object,且实现了Closeable(表明是可以关闭的数据源或目标);

FileInputStrean:继承InputStream,操作文件的,有三个构造方法:传入一个File对象,传入一个FileDescriptor对象,传入一个文件的路径;

FilterInputStream:是一个装饰器类,包含其他一些输入流,它将这些流作为基本数据源,它可以直接传输数据或提供一些额外的功能。

PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。

SequenceInputStream:按照顺序读取一个集合中所有的文件,从第一个开始读到该文件最后一个字节,然后继续读取下一个文件,直到将这个集合中所有的文件读取完;

StringBufferInputStream:已过时

ObjectInputStream:对对象反序列化。例如,某个对象实现了Serializable,表明这个对象可以被序列化,然后我们使用ObjectOutputStream将这个对象进行序列化,之后我们就可以使用ObjectInputStream将这个对象再还原回来(反序列化)。

BufferdInputStream:为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。

PushBackInputStream:为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。

LineNumberInputStream:已过时 ,提供跟踪当前行号的附加功能。

DataInputStream:可以读取JAVA的基本数据类型,int,float。boolean都可以,但是对文件就不可以了。

其他的都类似,比如对于OutputSteeam。与InputStrean相比较,,一个是字节输出流,一个是字节输入流。


file(内存)----输入流---->【程序】----输出流---->file(内存)

当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader, 它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。

使用FileReader读取文件:

public class FileTest01 {/* * 使用FileReader读取文件 */public static void main(String[] args) throws IOException {File file = new File("E:/data.txt");FileReader fr = new FileReader(file);char ch;System.out.println();while (fr.read() != -1) {ch = (char) fr.read();System.out.println(ch);}fr.close();}}

其中read()方法返回的是读取得下个字符。当然你也可以使用read(char[] ch,int off,int length)这和处理二进制文件的时候类似。

事实上在FileReader中的方法都是从InputStreamReader中继承过来的。read()方法是比较好费时间的,如果为了提高效率我们可以使用BufferedReader对Reader进行包装,这样可以提高读取得速度,我们可以一行一行的读取文本,使用readLine()方法。

使用BufferedReader读取文件:

public class FileTest02 {public static void main(String[] args) throws IOException {/* * 使用BufferdReader进行读取文件操作 */File file = new File("E:/data.txt");/* * 第一种 */BufferedReader br1 =new BufferedReader(new FileReader(file));while((br1.readLine() != null)){ System.out.println(br1.readLine());}/* * 第二种 */BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));while(br.readLine()!=null){System.out.println(br.readLine());}}}
这个程序的运行结果会有点小问题,可以参考:点击打开链接


我写了两种,都能读取出来。 不知道这两个有什么区别??【等有结果了在更新】


了解了FileReader操作使用FileWriter写文件就简单了,这里不赘述。

综合实例:

public class FileTest03 {public static void main(String[] args) throws Exception {//创建一个文件File file = new File("E:/data.txt");file.createNewFile();//向文件中写入内容FileWriter fw = new FileWriter(file);BufferedWriter bw = new BufferedWriter(fw);String str = "迷人的大狼狗";bw.write(str);bw.close();//从文件中读取内容FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);String val = null;while((val = br.readLine()) != null){System.out.print(val);}br.close();}}

未完待续.......