`
大侠放了我吧
  • 浏览: 1440 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

InputStream和Reader的区别

阅读更多

java.io下面有两个抽象类:InputStream和Reader
InputStream是表示字节输入流的所有类的超类
Reader是用于读取字符流的抽象类
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。
即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
弄清了两个超类的根本区别,再来看他们底下子类的使用,这里只对最常用的几个说明

InputStream 
   | __FileInputStream 


FileInputStream 从文件系统中的某个文件中获得输入字节。
构造方法摘要  
FileInputStream (File  file) 
          通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象 file 指定。 
FileInputStream (FileDescriptor  fdObj) 
          通过使用文件描述符 fdObj 创建一个 FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。 
FileInputStream (String  name) 
          通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。 
 
 
Reader

   |——BufferedReader 
   |___InputStreamReader 
         |__FileReader 


BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
 
构造方法摘要  
BufferedReader (Reader  in) 
          创建一个使用默认大小输入缓冲区的缓冲字符输入流。 
BufferedReader (Reader  in, int sz) 
          创建一个使用指定大小输入缓冲区的缓冲字符输入流。 
BufferedReader (Java Platform SE 6) 
BufferedReader的最大特点就是缓冲区的设置。通常Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求,如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。 
使用BufferedReader可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 
因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)。例如, 
 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
 将缓冲指定文件的输入。 
InputStreamReader (Java Platform SE 6) 
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 
 
构造方法摘要  
InputStreamReader (InputStream  in) 
          创建一个使用默认字符集的 InputStreamReader。 
InputStreamReader (InputStream  in, Charset  cs) 
          创建使用给定字符集的 InputStreamReader。 
InputStreamReader (InputStream  in, CharsetDecoder  dec) 
          创建使用给定字符集解码器的 InputStreamReader。 
InputStreamReader (InputStream  in, String  charsetName) 
          创建使用指定字符集的 InputStreamReader。 
 
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: 
 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader最大的特点是可以指转换的定编码格式
,这是其他类所不能的,从构造方法就可看出,
这一点在读取中文字符时非常有用

FileReader
1)FileReader类介绍:
InputStreamReader类的子类,所有方法(read()等)都从父类InputStreamReader中继承而来;
2)与InputStreamReader类的区别:
构造方法摘要  
FileReader (File  file) 
          在给定从中读取数据的 File 的情况下创建一个新 FileReader 。 
FileReader (FileDescriptor  fd) 
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader 。 
FileReader (String  fileName) 
          在给定从中读取数据的文件名的情况下创建一个新 FileReader  

该类与它的父类InputStreamReader的主要不同在于构造函数,主要区别也就在于构造函数!
从InputStreamReader的构造函数中看到,参数为InputStream和编码方式,可以看出,
当要指定编码方式时,必须使用InputStreamReader
类;而FileReader构造函数的参数与FileInputStream同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;
我想FileReader子类的作用也就在于这个小分工吧。该类与它的父类InputStreamReader
的主要不同在于构造函数,主要区别也就在于构造函数!
从InputStreamReader
的构造函数中看到,参数为InputStream和编码方式,可以看出,
当要指定编码方式时,必须使用InputStreamReader
类;而FileReader构造函数的参数与FileInputStream
同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;
我想FileReader子类的作用也就在于这个小分工吧。
二 联系与区别 
(1)字符与字节: 
FileInputStream 类以二进制输入/输出,I/O速度快且效率搞,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读,而且无法直接对文件中的字符进行操作,比如替换,查找(必须以字节形式操作);
而Reader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循环来读取文件;可以使用BufferedReader的readLine()方法一行一行的读取文本。
(2)编码
InputStreamReader ,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。 
FileReader与InputStreamReader 涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream 以二进制方式处理,不会出现乱码现象. 
因此要指定编码方式时,必须使用InputStreamReader 类,所以说它是字节转换为字符的桥梁;
(3) 缓存区
    BufferReader类用来包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)。
(4)规范用法
总结以上内容,得出比较好的规范用法: 
1) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
2) File file = new File ("hello.txt"); 
FileInputStream in=new FileInputStream (file); 
InputStreamReader inReader=new InputStreamReader (in,"UTF-8"); 
BufferedReader bufReader=new BufferedReader(inReader); 
3) File file = new File ("hello.txt"); 
FileReader fileReader=new FileReader(file); 
BufferedReader bufReader=new BufferedReader(fileReader);

分享到:
评论

相关推荐

    java.io.Reader 和 java.io.InputStream 的区别

    综上所述,`java.io.Reader`和`java.io.InputStream`之间的主要区别在于它们处理数据的方式。`Reader`专注于字符数据,尤其是Unicode编码的文本,而`InputStream`则更加通用,处理包括二进制数据在内的各种字节数据...

    java 文件存储 Inputstream outputstream reader writer的用法

    `InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的用法,并提供实际的代码示例,帮助初学者更好地理解和应用。 1. `InputStream`...

    InputStreamReader 和FileReader的区别及InputStream和Reader的区别

    对比InputStream和Reader,两者的主要区别在于处理的数据类型和层次结构。InputStream处理字节流,Reader处理字符流。字节流适用于处理任何类型的二进制数据,而字符流则专为文本数据设计,能够处理字符编码问题。...

    IO流文档InputStream / OutputStream

    IO流是Java中的一种基本的数据交换方式,通过InputStream和OutputStream可以实现数据的读取和写入,而Reader和Writer可以实现字符流的读取和写入。IO流的知识点很多,需要认真学习和掌握。 InputStream的类型: * ...

    CSV-Parsing:使用InputStream类解析csv文件

    2. **创建Reader**:为了读取文本内容,我们需要将`InputStream`转换为`Reader`。可以使用`InputStreamReader`实现,指定适当的字符编码,如UTF-8: ```java InputStreamReader isr = new InputStreamReader(bis, ...

    java_csvReader

    这两个类也可以设计成具有通用性,可以接受不同的文件路径,或者直接操作`InputStream`和`OutputStream`,以适应各种场景。 总的来说,理解和使用`CsvReader.java`和`CsvWriter.java`需要掌握Java的文件I/O操作、...

    B08输入输出及数据库操作ppt课件(全).ppt

    在这四个抽象类中,InputStream和Reader定义了完全相同的接口:int read() int read(char cbuf[]) int read(char cbuf[], int offset, int length)而OutputStream和Writer也是如此:int write(int c) int write...

    JAVA程序员笔试面试题汇总及答案.pdf

    Reader 和 InputStream 的区别 Reader 和 InputStream 都是 JAVA 中的输入流,但它们有着不同的特点。Reader 用于读入 16 位字符,也就是 Unicode 编码的字符,而 InputStream 用于读入 ASCII 字符和二进制数据。...

    java的文件操作汇总

    Java中的文件操作涉及到了多种流类型,包括字节流(InputStream)和字符流(Reader)。InputStream是处理8位字节的流,适用于处理ASCII字符和二进制数据,而Reader则是处理16位Unicode字符的流,更适合处理文本数据...

    Java中Reader类.pdf

    `Reader`类的层次结构复杂且灵活,通过继承和组合,可以构建出各种适应不同需求的字符输入流。在实际开发中,我们通常会根据具体需求选择合适的`Reader`子类,结合Java的异常处理机制,实现安全、高效的字符输入操作...

    软件工程师-浅谈Java的输入输出流技术步骤说明.pdf

    Java 中的流都是从四个抽象类派生出来的:InputStream、OutputStream、Reader 和 Writer。 InputStream 和 OutputStream 是基于字节流的,它们是 Java 中最早的输入/输出流接口。Reader 和 Writer 是基于字符流的,...

    IO流体系继承结构图_动力节点Java学院整理

    Reader和Writer体系与InputStream和OutputStream类似,只是它们处理的是字符流。Reader是所有字符输入流的基类,Writer是所有字符输出流的基类。它们也有类似的原始处理器和装饰器结构,如CharArrayReader、...

    javaio流学习总结.docx

    1. 按流的方向:Java IO流分为输入流(InputStream和Reader)和输出流(OutputStream和Writer)。输入流用于从数据源读取数据,而输出流则用于向目标位置写入数据。 2. 按数据单位:流可以分为字节流(Byte Stream...

    java_io.doc

    在处理文本数据时,应优先考虑使用Reader和Writer,只有在特定场景下(如处理二进制数据或特定字节格式)才使用InputStream和OutputStream。 8. **其他类和接口**: Java I/O还包括随机访问文件的RandomAccessFile,...

    java_io.pdf

    InputStreamReader和OutputStreamWriter是两个关键的转换器,分别将InputStream和OutputStream转换为Reader和Writer,以支持字符流操作。Reader和Writer的使用通常是首选,因为它们能更好地处理国际化的字符编码。 ...

    java输入输出流.ppt

    Java的I/O流系统主要由两个核心接口构成:InputStream和OutputStream用于处理字节流,Reader和Writer则用于处理字符流。这些接口提供了基本的读写方法,例如read()和write(),允许程序从输入源读取数据或向输出目标...

    10.尚硅谷_java基础_IO

    IO 概述 File 类 IO 流分类 InputStream & Reader OutputStream & Writer RandomAccessFile 类 对象的序列化

    607.605.JAVA基础教程_IO流与网络编程-复习:IO流概述(607).rar

    在Java中,IO流分为字符流和字节流两大类,每类又包含输入流(InputStream/Reader)和输出流(OutputStream/Writer)。本教程主要针对IO流的概述进行复习,帮助学习者理解和掌握这一关键概念。 1. 字节流:字节流...

    全面总结java IO体系

    - **按流向**:分为输入流(InputStream/Reader)和输出流(OutputStream/Writer)。输入流只能读取数据,而输出流只能写入数据。这里的“输入”和“输出”是相对于程序运行的内存环境来说的。 - **按操作单元**:...

Global site tag (gtag.js) - Google Analytics