博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
File,FileInputStream,FileReader,InputStreamReader,BufferReader 的区别使用
阅读量:6489 次
发布时间:2019-06-24

本文共 3358 字,大约阅读时间需要 11 分钟。

  1. File 类介绍

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

  2. FileInputStream 类

    以字节为单位的流处理。字节序列:二进制数据。与编码无关,不存在乱码问题。主要方法有read(),read(byte[] b),read(byte[],int off,int len),available()

    File 类与 FileInputStream 类的区别:

    流类关注的是文件内容,而 File 类关注的是文件在磁盘上的存储.File 不属于文件流 , 只能代表一个文件或是目录的路径名而已.FileInputStream的构造函数,可以为File对象,或者该File的String地址

  3. InputStreamReader 类

    以文本格式输入 / 输出,可以指定编码格式,构造函数参数为inputstream和编码格式;主要方法: getEncoding (),read();

  4. FileReader 类

    把文件转换为字符流读入,InputStreamReader 类的子类,所有方法(read ()等)都从父类 InputStreamReader 中继承来;与 InputStreamReader 类的区别:主要不同在于构造函数!

    FileInputStream类与 FileReader类的区别:

    两个类的构造函数的形式和参数都是相同的,参数为 File 对象或者表示路径的 String 。区别在于:Reader类及其子类提供的字符流的读取char,char[],inputStream及其子类提供字节流的读取byte,byte[];

    InputStreamReader可以将stream转换成reader方式,是reader和stream之间的桥梁,如果要指定编码格式,则只能用InputStreamReader

    不指定编码时如下 

  5. 1
    2
    3
    4
    5
    6
    7
    FileReader fr = 
    new 
    FileReader(
    "ming.txt"
    );   
    char
    [] buffer = 
    new 
    char
    [
    1024
    ];   
    int 
    ch = 
    0
    ;   
    while
    ((ch = fr.read())!=-
    1 
    )   
    {   
        
    System.out.print((
    char
    )ch);   
    }

    指定编码时如下

  6. 1
    2
    3
    4
    5
    InputStreamReader isr = 
    new 
    InputStreamReader(
    new 
    FileInputStream(
    "ming.txt"
    ));   
    while
    ((ch = isr.read())!=-
    1
    )   
    {   
        
    System.out.print((
    char
    )ch);   
    }
  7. BufferedReader 类

    BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。

  8. 1
    2
    3
    4
    5
    6
    BufferedReader br = 
    new 
    BufferedReader(
    new 
    InputStreamReader(
    new 
    FileInputStream(
    "ming.txt"
    )));   
    String data = 
    null
    ;   
    while
    ((data = br.readLine())!=
    null
    )   
    {   
        
    System.out.println(data);   
    }

总结以上内容,得出比较好的规范用法:

1.  

1
2
3
4
File file = 
new 
File (
"hello.txt"
);   
FileInputStream in=
new 
FileInputStream(file);   
InputStreamReader inReader=
new 
InputStreamReader(in);   
BufferedReader bufReader=
new 
BufferedReader(inReader);

2.

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

3.

1
2
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,然后用第三种方式也行,但似乎这适合有用户界面的情况,把异常抛出在客户端在处理。

写文件的方式和读文件差不多也差不多,类就不介绍了,仅贴出代码,

1
2
3
4
5
6
 
String sql=
"sdfsdf"
;
 
FileOutputStream fileOutputStream = 
new 
FileOutputStream(
"d:/test/cell1.txt"
); 
 
OutputStreamWriter oWriter = 
new 
OutputStreamWriter(fileOutputStream);
 
BufferedWriter bw = 
new 
BufferedWriter(oWriter);
 
bw.write(sql);
 
bw.flush();

记住,最后的BufferedWriter 一定要记得flush才能写入文件

读取文件,大概就这样子了。

终于觉得自己也理清楚了,

      本文转自布拉君君 51CTO博客,原文链接:http://blog.51cto.com/5148737/1754150,如需转载请自行联系原作者

你可能感兴趣的文章
ES6(正则扩展)
查看>>
从零玩转jQuery-核心函数和静态方法
查看>>
8月3日科技联播:新型VR头盔可令盲人重获光明 ,联通阿里成立合资企业“云粒智慧”...
查看>>
Jeknins的Pipline方式构建任务
查看>>
Python全栈 项目(电子词典、协程、pdb调试)
查看>>
(周期计划-7)常用集合的源码分析:ArrayList
查看>>
“分叉并商品化”,GitLab 和 Elastic 炮轰 AWS 的开源方法
查看>>
MKVToolNix v33.0.0 发布,MKV 视频编辑工具软件
查看>>
Egg 2.19.0 发布,阿里开源的企业级 Node.js 框架
查看>>
CentOS7.4安装Gitlab10.5.1及汉化
查看>>
Virtualbox以及VWare在Win10下的不兼容
查看>>
Github上如何在Fork到的开源项目中提交Pull requests?
查看>>
Java单向链表反转
查看>>
一些开发遇到的"小问题",你能答对多少?
查看>>
面对前车之鉴的AR,现在的VR要做些什么?
查看>>
自然语言理解势头正强劲,可总还是缺点啥
查看>>
【python图像处理】给图像添加透明度(alpha通道)
查看>>
区块链与微服务天生是一对
查看>>
VDI市场:探寻企业影子IT风险来源|
查看>>
阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术
查看>>