黑马程序员技术交流社区

标题: 几个IO中读写文件类的区别 [打印本页]

作者: zjm10zj    时间: 2013-4-6 19:51
标题: 几个IO中读写文件类的区别
本帖最后由 zjm10zj 于 2013-4-6 22:21 编辑

Reader,Writer,
InputStream,OutputStream,
FileInputStream,FileOutputStream
InputStreamReader,OutputStreamReader
BufferedWriter,BufferedReader,
RandomAccessInputStream,
PrintWriter,PrintStream
几个IO中读写文件类的区别、在什么情况下,使用哪一种流!

作者: 刘吉庆    时间: 2013-4-6 20:12
1. Reader,Writer 抽象基类定义基本功能,不能使用;
2. File———实现类能够实现某些功能;
3. Buffered ——高效实现某些功能
4. 字符流用于操作————文本文件——GBK
5. 字节流用于操作————非文本文件——ASCII
RandomAccessInputStream, PrintWriter,PrintStream我也不太了解
作者: 张先龙    时间: 2013-4-6 20:48
你问的这个问题三眼两语可回答不了 几乎整个IO的知识都被你全部问了
作者: 王大伟    时间: 2013-4-6 21:06
1、

Reader是所有的输入字符流的父类,它是一个抽象类
Writer是所有的输出字符流的父类,它是一个抽象类

java.io.Reader和java.io.Writer支持Unicode标准字符集(Character Set)(字节流则只支持ISO-Latin-1 8-bit)。在处理流数据时,会根据系统默认的字符编码来进行字符转换,
Reader和Writer是抽象类,在进行文本文件的字符读写时真正会使用其子类,子类通常会重新定义相关的方法。

2、

InputStream是所有的输入字节流的父类,它是一个抽象类
OutputStream是所有的输出字节流的父类,它是一个抽象类

InputStream根据名字就知道它是输入类,OutputStream是输出类 InputStream之所以叫输入类,是因为它要把要需要读取的内容转化成输入流,再从它那里进行读取,而OutputStream之所以叫输出类,是因为它首先需要与写入的目的地相关联,然后通过它进行写入。输入是:把要读取的内容输入到输入流,在从输入流进行读取,所以是read()。输出是:把要输出的东西通过输出流输出到目的地,所以是write()

3、
FileInputStream与从指定的文件中读取数据至目的地有关。
FileOutputStream主要与从来源地写入数据至指定的文件中有关。

FileInputStream 用于从文件系统中的某个文件中获得输入字节,通常用于读取诸如图像数据之类的原始字节流。
FileInputStream是InputStream类(字节流输入)的子类,以字节流方式读取文件;FileInputStream的构造函数参数可以是File文件,也可以是字符串,但实际上使用File文件会更加规范。

FileOutputStream 是用于将数据写入 File或 FileDescriptor的输出流,通常用于写入诸如图像数据之类的原始字节的流。
FileOutputStream是OutputStream类的子类,以字节流方式写入文件。

4、
OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。

从JDK文档中可以知道FileOutputStream是OutputStream 的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件中的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚地发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入/输出流的。

5、
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了
该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。


BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。

6、RandomAccessFile类的主要功能是完成随即读取功能,可以读取指定位置的内容

7、
PrintStream类和PrintWriter类
PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。

PrintStrean是写入一串8bit的数据的。
PrintWriter是写入一串16bit的数据的。

PrintStream是用来操作byte,
PrintWriter是用来操作Unicode,
一般需要处理中文时用PrintWriter好


作者: zjm10zj    时间: 2013-4-6 22:21
王大伟 发表于 2013-4-6 21:06
1、

Reader是所有的输入字符流的父类,它是一个抽象类

谢谢,很详细




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2