java中FileInputStream,FileReader等的区别

FileInputStream,FileReader

C语言只需要一个File*就可以了,与C不同,java有一系列流类型,其数量超过60种。类库的设计者声称:”有足够的理由为用户提供丰富的流类型的选择:这样做可以减少程序的错误。”例如,在C语言种,许多人认为”将输出流写入一个只读模式的文件”是很常见的错误。(事实上,这并不常见。)

我们认为在C++语言中,流接口设计者避免程序出错的主要”工具”是小心谨慎的态度,在java语言中更是如此。流库的高度复杂性迫使程序设计人员谨小慎微。

  1. File类
    1)File类介绍(《core java》638页)
    File类封装了对用户机器的文件系统进行操作的功能。例如,可以用File类获得文件上次修改的时间移动,或者对文件进行删除、重命名。换句话说,流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
    File类的主要方法有:getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath()等;

2)File类与FileInputStream类的区别:
流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。

File不属于文件流,只能代表一个文件或是目录的路径名而已。

提示:(《core java》639页)
如果处理文件或者目录名,就应该使用File对象,而不是字符串。例如,File类的equals方法知道一些文件系统对大小写是敏感的,目录尾的”/”字符无关紧要。

自己的领会:
FileInputStream类或者FileReader类的构造函数有多个,其中典型的两个分别为:一个使用File对象为参数;而另一个使用表示路径的String对象作为参数;自己以前一直觉得直接用了String指定路径就可以了,一直不明白为什么很多人都先构造一个File对象,现在终于明白了,”如果处理文件或者目录名,就应该使用File对象,而不是字符串。”!
2. FileInputStream类
1)FileInputStream类介绍:
以字节为单位(非unicode)的流处理。字节序列即:二进制数据。与编码无关,不存在乱码问题。
FileInputStream类的主要方法有:
Read(),read(byte[] b),read(byte[],int off,int len),available();

2)FileInputStream类与FileReader类的区别:
两个类的构造函数的形式和参数都是相同的,参数为File对象或者表示路径的String,它们到底有何区别呢?
 Readers and Writers work only on line based character data, so plain text files.

For anything else, you MUST use Streams.

 JDK5 API:
FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader.

FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider using a FileInputStream.

 FileInputStream:以字节流方式读取;FileReader:把文件转换为字符流读入;
 InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
 Reader类及其子类提供的字符流的读取char(16位,unicode编码),inputStream及其子类提供字节流的读取byte(8位),所以FileReader类是将文件按字符流的方式读取,FileInputStream则按字节流的方式读取文件;InputStreamReader可以将读如stream转换成字符流方式,是reader和stream之间的桥梁
 最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。
 FileInputStream类以二进制输入/输出,I/O速度快且效率搞,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读。
 而FileReader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循环来读取文件;可以使用BufferedReader的readLine()方法一行一行的读取文本。
 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader, InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。
 FileReader与InputStreamReader涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream以二进制方式处理,不会出现乱码现象.

3)自己的领会:
 如果处理纯文本文件,建议使用FileReader,因为更方便,也更适合阅读;但是要注意编码问题!
 其他情况(处理非纯文本文件),FileInputStream是唯一的选择;FileInputStream是进Socket通讯时会用到很多,如将文件流是Stream的方式传向服务器!

  1. FileReader类
    1) FileReader类介绍:
    InputStreamReader类的子类,所有方法(read()等)都从父类InputStreamReader中继承而来;
    2) 与InputStreamReader类的区别:
     自己的领会:
    该类与它的父类InputStreamReader的主要不同在于构造函数,主要区别也就在于构造函数!从InputStreamReader的构造函数中看到,参数为InputStream和编码方式,可以看出,当要指定编码方式时,必须使用InputStreamReader类;而FileReader构造函数的参数与FileInputStream同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;我想FileReader子类的作用也就在于这个小分工吧。
    3) 一般用法:
    FileReader fr = new FileReader(“ming.txt”);
    char[] buffer = new char[1024];
    int ch = 0;
    while((ch = fr.read())!=-1 )
    {
    System.out.print((char)ch);
    }
  2. InputStreamReader类
     以文本格式输入/输出,可以指定编码格式;
     主要方法:
    getEncoding(),read();
     一般用法:
    InputStreamReader isr = new InputStreamReader(new FileInputStream(“ming.txt”));
    while((ch = isr.read())!=-1)
    {
    System.out.print((char)ch);
    }
  3. BufferedReader类
     Jdk5 api:
    Read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.

 BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。
 一般用法:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(“ming.txt”)));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
6. 总结以上内容,得出比较好的规范用法:
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);
BufferedReader bufReader=new BufferedReader(inReader);
3) File file = new File (“hello.txt”);
FileReader fileReader=new FileReader(file);
BufferedReader bufReader=new BufferedReader(fileReader);

Original: https://www.cnblogs.com/JemBai/archive/2012/08/24/2654472.html
Author: 草原和大树
Title: java中FileInputStream,FileReader等的区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538686/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Kubernetes-Daemonset

    1. 简介 DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会…

    Java 2023年6月7日
    087
  • leetcode 637. Average of Levels in Binary Tree 二叉树的层平均值(简单)

    一、题目大意 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root = [3,…

    Java 2023年6月14日
    099
  • 重构聚合支付案例教你如何写出高扩展性易读的代码

    人间清醒 以下代码逻辑为:按照不同的支付方式调用不同支付方式的逻辑流程。痛点: /** * 旧的支付 * * @param mode 模式 * @param payVO 支付签证官…

    Java 2023年6月5日
    0101
  • java中远程调用第三方接口

    一、概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信…

    Java 2023年5月29日
    087
  • 最好的Java开发工具—IDEA

    IDEA的使用 IntelliJ IDEA工具的使用 1. 常见的Java集成开发工具 Eclipse IBM团队研发的一个开源的非常好用的集成开发环境。寓意:吞并Sun公司。不过…

    Java 2023年6月7日
    085
  • idea创建类报错:This template did not produce a Java class

    在idea.exe.vmoptions 或 idea64.exe.vmoptions中加入配置-Djdk.util.zip.ensureTrailingSlash=false重启,…

    Java 2023年5月29日
    065
  • Spring IoC 的实现机制

    Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 <span>interface<span> <span>Fruit<spa…

    Java 2023年5月30日
    067
  • Java中的List<Integer>里有可能存String类型元素吗?

    这其实是我遇到的一个线上bug,在这里分享给大家。 如果是用反射,那就很简单了,毕竟泛型只是在编译期进行约束,对运行期是无能为力的。 想想看,如果不使用反射,有没有办法做到呢? 问…

    Java 2023年6月9日
    096
  • 我的虚拟机挂了!怎么把镜像里面的数据找回来?

    创建了一个虚拟机,不知道为什么挂了,重启也启动不了,VNC也登不上去,强行关机后再也启动不起来了,开机一大堆错误,可是里面还有很重要的数据啊,怎么办,怎么办,谁能救救我! 下面分析…

    Java 2023年5月30日
    093
  • JAVA 8与JAVA 11到底该怎么选?

    很多初学Java的小伙伴经常咨询: 到底该安装哪个版本的JDK比较好? Java 8到底还够不够用? Java 11究竟有什么改进? 是不是Java版本越新越好? …&…

    Java 2023年5月29日
    0103
  • springboot2 整合发送邮件的功能

    1,你需要申请一个邮箱 1,申请一个 163 的邮箱并登入,这个很简单 2,如下图进入设置 3,确定下图中的选项为开启状态,切记,开启功能的时候,系统会给你分配一个授权码,只会显示…

    Java 2023年5月30日
    066
  • Docker实用篇

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月13日
    076
  • JAVA复习总体大纲

    1 java基础. [1].变量— 数据类型 变量名=值;数据类型:1.基本数据类型. byte[1字节] short[2字节] int[4字节] long[8字节] …

    Java 2023年6月5日
    071
  • web 开发常用字符串表达式匹配

    记录一下 web 开发中常用的一些字符串模式,这是我遇到的一些,后面如果还有的话,欢迎大神提出,会继续更新。 这个主要用在前端的验证,nginx 路径匹配,shell 脚本文本处理…

    Java 2023年6月5日
    091
  • Spring Boot自动装配原理

    Spring Boot相对于Spring的一大改变或者优势来说就是”约定大于配置”的思想,不像Spring一样所有的配置都需要我们自己去实现,Spring …

    Java 2023年5月30日
    063
  • Java判定一个数值是否在指定的开闭区间范围内

    对于开闭区间,在数学中的表示方式通常为 () 和 [],小括号代表开放区间,中括号代表封闭区间,而它们的区别主要在于是否包含 = 等于号,开闭区间通常会分为以下一些情形: (1, …

    Java 2023年6月8日
    053
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球