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

 更新时间:2015年12月22日 09:40:10   投稿:mrr  
这篇文章主要介绍了InputStreamReader 和FileReader的区别及InputStream和Reader的区别的相关资料,需要的朋友可以参考下

首先给大家介绍InputStreamReader 和FileReader的区别,具体内容如下所示:

InputStreamReader 和 BufferedReader 。其中最重要的类是 InputStreamReader ,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等。

FileReader 与 InputStreamReader 涉及编码转换 ( 指定编码方式或者采用 os 默认编码 ) ,可能在不同的平台上出现乱码现象!而 FileInputStream 以二进制方式处理,不会出现乱码现象 .

FileInputStream字节流是 以一个一个字节来读。

FileReader字符流是 以一个一个字符来读取的。

BufferedReader bufReader = null;
InputStreamReader isr = null;
FileReader fr = null;
try {
for(String fileName:fileNames){
  方法一:
  isr = new InputStreamReader(new FileInputStream("D:\test.txt"), "utf-8");
  bufReader = new BufferedReader(isr);
  方法二:
  fr = new FileReader("D:\test.txt");
  bufReader = new BufferedReader(fr);
  while (bufReader.ready()) {
   // 1. 得到每一行数据 
   String dataLine = bufReader.readLine();
   }
}

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);

相关文章

  • jsp页面中获取servlet请求中的参数的办法详解

    jsp页面中获取servlet请求中的参数的办法详解

    在JAVA WEB应用中,如何获取servlet请求中的参数,本文讲解了jsp页面中获取servlet请求中的参数的办法
    2018-03-03
  • 聊聊SpringBoot中组件无法被注入的问题

    聊聊SpringBoot中组件无法被注入的问题

    这篇文章主要介绍了SpringBoot中组件无法被注入的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot实现License生成和校验的过程详解

    SpringBoot实现License生成和校验的过程详解

    在我们向客户销售商业软件的时候,常常需要对所发布的软件实行一系列管控措施,诸如验证使用者身份、软件是否到期,以及保存版权信息和开发商详情等,所以本文给大家介绍了SpringBoot实现License生成和校验的过程,需要的朋友可以参考下
    2024-09-09
  • 轻松掌握Java适配器模式

    轻松掌握Java适配器模式

    这篇文章主要帮助大家轻松掌握Java适配器模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • idea启动spring项目中文乱码的解决方法

    idea启动spring项目中文乱码的解决方法

    本文主要介绍了idea启动spring项目中文乱码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • CGLIB代理的使用与原理解析

    CGLIB代理的使用与原理解析

    这篇文章主要介绍了CGLIB代理的使用与原理解析,静态代理和JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理,这就是Cglib代理,需要的朋友可以参考下
    2023-09-09
  • Java日志软件Log4j的基本使用教程

    Java日志软件Log4j的基本使用教程

    这篇文章主要介绍了Java日志软件Log4j的基本使用教程,包括回滚和发送日志邮件等基本功能使用的讲解,需要的朋友可以参考下
    2015-12-12
  • Spring cloud Feign 深度学习与应用详解

    Spring cloud Feign 深度学习与应用详解

    这篇文章主要介绍了Spring cloud Feign 深度学习与应用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 使用Java实现简单的区块链程序的方法

    使用Java实现简单的区块链程序的方法

    这篇文章主要介绍了使用Java实现简单的区块链程序的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 详解spring boot starter redis配置文件

    详解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通过配置RedisConnectionFactory中的相关参数去实现连接redis service。下面通过本文给大家介绍在spring boot的配置文件中redis的基本配置,需要的的朋友参考下
    2017-07-07

最新评论