File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别

详解在linux上安装vpn客户端 阅读详情

引言:
    
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 ,它们到底有何区别

呢?

l         Readers and Writers work only on line based character data, so plain text files.
For anything else, you MUST use Streams.

l         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 .

l         FileInputStream :以字节流方式读取; FileReader :把文件转换为字符流读入;
l        InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出

来的是char数组或者String ,使用InputStream读取出来的是byte数组。
l        Reader类及其子类提供的字符流的读取char(16位,unicode编码),inputStream及其子类提供字节

流的读取byte(8位),所以FileReader类是将文件按字符流的方式读取,FileInputStream则按字节流的方式

读取文件;InputStreamReader可以将读如stream转换成字符流方式,是reader和stream之间的桥梁
l  最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。
  
l         FileInputStream 类以二进制输入 / 输出, I/O 速度快且效率搞,但是它的 read ()方法读到

的是一个字节(二进制数据),很不利于人们阅读。

l         而 FileReader 类弥补了这个缺陷,可以以文本格式输入 / 输出,非常方便;比如可以使用

while((ch = filereader.read())!=-1 ) 循环来读取文件;可以使用 BufferedReader 的 readLine() 方法一

行一行的读取文本。

l         当我们读写文本文件的时候,采用 Reader 是非常方便的,比如 FileReader ,

InputStreamReader 和 BufferedReader 。其中最重要的类是 InputStreamReader ,它是字节转换为字符的桥

梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等

l         FileReader 与 InputStreamReader 涉及编码转换 ( 指定编码方式或者采用 os 默认编码 ) ,可

能在不同的平台上出现乱码现象!而 FileInputStream 以二进制方式处理,不会出现乱码现象 .

3 )自己的领会:

l         如果处理纯文本文件,建议使用 FileReader ,因为更方便,也更适合阅读;但是要注意编码问题


l   其他情况(处理非纯文本文件),FileInputStream是唯一的选择;FileInputStream是进Socket通讯时会

用到很多,如将文件流是Stream的方式传向服务器!
  
3.       FileReader 类

1)    FileReader 类介绍:

InputStreamReader 类的子类,所有方法( read ()等)都从父类 InputStreamReader 中继承而来;

2)    与 InputStreamReader 类的区别:

l         自己的领会:

该类与它的父类 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);
   }

4.       InputStreamReader 类

l         以文本格式输入 / 输出,可以指定编码格式;

l         主要方法:

getEncoding (),read();

l         一般用法:

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
   while((ch = isr.read())!=-1)
   {
    System.out.print((char)ch);
   }

5.       BufferedReader 类

l         Jdk5 api :

Read text from a character-input stream, buffering characters so as to provide for the efficient

reading of characters, arrays, and lines.
l    BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,

读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。
l  一般用法:
    
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);

7.一些写法的区别:
1)
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in);
BufferedReader bufReader=new BufferedReader(inReader);

2)
FileInputStream in=null;
File file = new File ("hello.txt");
in=new FileInputStream(file);
BufferedReader bufReader=new BufferedReader(new InputStreamReader(in));

3)
File file = new File ("hello.txt");
BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

上述两种写法的微小区别:
a)第二种方式中把“FileInputStream in=null;”定义单独放在开始处,说明下面应该还有要用到in对象变量的地方;(BufferedReader处用了)

b)第二种方式没有定义InputStreamReader的对象变量,直接在BufferedReader的构造函数中new一个,
这种方式与第一种方式的主要区别:InputStreamReader对象只使用一次!

这对于在这里只需要使用一次这个InputStreamReader对象的应用来说更好;无需定义InputStreamReader的对象变量,接收由new返回的该对象的引用,因为下面的程序中不需要这个InputStreamReader的对象变量,所以无需定义;所以这种情况下,第二种方式比第一种更好一些。

c)第三种方式中,典型的三层嵌套委派关系,清晰看出Reader的委派模式(《corejava》12章有图描述该委派关系),FileInputStream和InputStreamReader都没有定义变量,new生成的对象都只是使用一次。

d)三种方式的区别也就在于FileInputStream和InputStreamReader对象是否都只使用一次,是否需要定义它们的对象变量,以及个人的编码习惯。

e)但是要注意异常处理,FileInputStream(file)会抛出NotFileFoundException,如果采用surround方式
(try&catch)处理,应该用第二种方式,这样可以用System.out.println提示文件未找到;
当然在函数名后使用throws Exception,然后用第三种方式也行,但似乎这适合有用户界面的情况,把异常抛出在客户端在处理。
异步FIFO的隐形陷阱:复位信号同步化实战解析 本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。 阅读详情

相关推荐

PCIe网卡驱动实现分析(三)--- cache一致性

在现代处理器系统中,CPU的主频远高于主存读写速度,主存的读写速度成为程序执行效率的瓶颈;为了解决这个问题,在CPU主存之间引入了Cache存储器,基于程序执行的局部性原理,在程序执行时,将正在使用的数据从主存拷贝一份到Cache,这样CPU就可以直接从Cache读写数据以改善主存读写速度慢的问题;

a935854743的博客 1755

BufferedReader、BufferedWriter

/* 字符流的缓冲区:目的是为了提高流的读写效率,所以流要先存在。 1、BufferedWrite 2、BufferedReader */ import java.io.*; class BufferedWriterDemo { public static void main(String[] args) throws IOException { FileWriter fw = n

面朝大海,春暖花开 649

Claude Code 官方文档+3 个高活跃社区+5 个可复用开源项目:14.4 节持续学习资源实测清单

揭示 Claude Code 的核心交互范式是「状态机驱动的对话式编程」,强调官方文档实为配置契约、社区是直觉验证场、开源项目是配置能力校准器;通过真实故障案例解析上下文丢失根源,提出以工程化方式管理 claude.config.json、CLAUDE.md 技能配置。

weixin_28728443的博客 285

java 基础之IO---温故

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

shameant 277

FileReaderInputStreamReader

今天梳理IO笔记时发现一个问题–FileReader是鸡肋吗,它有用吗??? 在使用字符流读取文本文件时(且不使用包装流时),有两种类提供读取文件方法,分别是InputStreamReaderFileReader,后者为前者子类。 引言–当文本文件编码与编译工具默认编码不同时,FileReader类的方法读取文件会出现乱码的情况,这时需要用到转换流InputStreamReaderInputStreamReader(InputStream in, String charsetName) 方法。 作为转换

weixin_43858012的博客 1443

InputStreamReader FileReader区别InputStreamReader的区别

首先给大家介绍InputStreamReader FileReader区别,具体内容如下所示: InputStreamReader BufferedReader 。其中最重要的类是 InputStreamReader ,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等。 FileReader 与 I

顶峰 4507

FileReader BufferedReader的比较

例如:BufferedReader br = new BufferedReader(new InputStreamReader(适用场景:如果你需要读取大文件,或者你需要按行读取文件,并且你希望提高读取效率,那么。使用缓冲可以减少与底层数据源(如文件)的交互次数,从而提高读取效率。的一个装饰器(wrapper)类,它提供了缓冲字符输入的功能。的构造函数,以便使用默认字符编码读取文件,或者你可以使用。)上,以提供缓冲行读取的功能。方法,可以方便地按行读取文本。

weixin_44627292的博客 778

File,FileInputStream,FileReader,InputStreamReader,BufferedReader使用区别

File类 1 ) File 类介绍 File 类封装了对用户机器的文件系统进行操作的功能。例如,可以用 File 类获得文件上次修改的时间移动, 或者对文件进行删除、重命名。换句话说,流类关注的是文件内容,而 File 类关注的是文件在磁盘上的存储 Fi

alex_sym的专栏 733

InputStreamReader,FileInputStream FileReader区别

一、InputStreamReader的区别 InputStreamReader都可以用来读数据(从文件中读取数据或从Socket中读取数据),最主要的区别如下:InputStream用来读取二进制数(字节流),而Reader用来读取文本数据,即Unicode字符。那么二进制数与文本数据有什么区别呢?从本质上来讲,所有读取的内容都是字节,要想把字节转换为文本,需要指定一个编码方法。而...

weixin_30445169的博客 619

InputStreamReader FileReader区别

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

iteye_13151的博客 286

Java中InputStreamReaderFileReader之间的一些区别

对象时,它会自动使用平台的默认字符编码来打开文件。这意味着如果你的文件编码与系统默认编码不符,可能会遇到乱码问题。提供的数据,并且允许你指定字符集编码。如果没有指定编码,则会使用平台的默认字符编码。如果你只是想简单地读取一个本地文件,且文件使用的是系统默认编码,那么使用。则提供了更简单的接口,适用于读取本地文件并且使用系统默认编码的情况。通常用于读取网络或资源中的数据,这些数据可能以不同的编码格式存储。如果你想从一个文件中读取数据,并且知道文件的编码,你可以使用。中,但这也限制了你对编码的控制。

Liang_z_的博客 955

FileReaderInputStreamReader关系

FileReader继承InputStreamReader,可以有以下两种读文件方法: BufferedReader bufReader = null; InputStreamReader isr = null; FileReader fr = null; try { for(String fileName:fileNames){    方法一:     isr = new Inpu

u010619243的博客 439

java IO(四):FileReaderInputStreamReaderStreamDecoder

之所以把这三个放在一起说,是因为他们密切相关。 首先要说明为何在有FileInputStream的情况下,jdk还要设置这几个流。 实际测试中发现,除了ascii码编码的字符(如英文字符、数字字符)外,对于其他字符(如汉字字符、阿拉伯语字符),如果使用FileInputStream流来读取这些字符,就会导致乱码。 public class Test { public stat...

weixin_30512043的博客 623

InputStreamReader FileReader联系与区别

两者关系: FileReader继承自InputStreamReader ; 区别InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要

CFZero的专栏 1678

FileReader FileInputStream InputStreamReader BufferedReader 作用与区别详解

ava.io下面有两个抽象类:InputStreamReader InputStream是表示字节输入流的所有类的超类 Reader是用于读取字符流的抽象类 InputStream提供的是字节流的读取,而非文本读取,这是Reader类的根本区别。 即用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。 弄清了两个超类的根本区别,再来看他...

Andrelia的博客 1345

FileReader,BufferedReader,OutputStreamWriter,FileWriter

FilereaderInputStreamReader的子类,该类只能使用本地平台字符编码进行读取,不能指定其他的字符编码类型(System.out.println()System.getProperty("file.enconding")//获得本地平台的编码类型)。构造方法:read():每次读取一个字符,返回值为读取内容的ASCII码/Unicode编码,十进制,读取到末尾,返回-1。

2401_89004553的博客 533

InputStreamReaderFileReader区别

/* BufferedReader InputStreamReader 转换流 */ import java.io.*; public class BufferedReaderTest02 { public static void main(String[] args) throws Exception{ /*...

weixin_30432007的博客 497

input 上传文件并回显 FileReader

<input type="file"> 说一下思路 1、上传文件到服务器,然后获取到线上图片地址,将抵制放到img的src里就可以了 2、不通过服务器,本地显示,通过H5的FileReader 现在主要说一下第二种用法 上代码 <input type="file" id="myFile"> <div id="show"></div> var my...

zcy_csdn123的博客 3684

游泳者溺水视频样本30个mp4文件

下载说明:请务必确认是否为自己要的,压缩包仅仅包含30段视频文件博客地址:blog.csdn.net/FL1623863129/article/details/136285420

台达DVP全系列PLC解密.rar

台达DVP全系列PLC解密软件,很流行的解密软件,如果PLC的版本高于2.00那必须要拆机解。如果是2.00及以下版本可以用软件直接解密,不需要拆机。具体可以查看“参考”的链接。

上一篇: BasicStroke的用法
下一篇: 例解基于UML的面向对象分析与设计
studious_cat
博客等级 码龄17年 14粉丝 13原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值