`
shameant
  • 浏览: 59067 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 基础之IO---温故

阅读更多

1.  File类
  
1 ) File 类介绍

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

分享到:
评论

相关推荐

    积分管理系统java源码-new-and-old:实习过程中的温故知新

    温故: 资源的释放问题: java中需要手动释放的资源目前接触的主要有 1)io流资源 2)jdbc资源 关闭原则主要是先开后关,从里到外。 具体实现方法为放在try-catch-finally语句块中。 其中对于流的关闭,jdk1.7以上...

    mtk实例教程(新手入门-老手温故)

    3. **编程基础**:教程会深入讲解MMI的编程语言和语法,可能是Java或者特定于MediaTek的API。内容可能涵盖变量、控制结构、函数、异常处理等基本概念。 4. **UI设计**:MMI提供了丰富的界面元素和布局管理工具,...

    Python 温故-作者:赖勇浩

    ### Python 温故知识点解析 #### 一、数值类型 在Python中,数值类型...以上是对《Python 温故》一文中提到的部分知识点的详细解释和示例展示,这些基础知识对于任何想要深入学习Python的开发者来说都是非常重要的。

    java7源码-coder-tools:开发者的工具箱,包含各种第三方类库,示例

    java7 源码 coder-tools是程序员对一些新类库、新技术、新特性研究的笔记,为了让您更快更容易对这些新东西入手,时间久了可以达到温故而知新 jvm-library design-pattern 包含23种设计模式 structure-arithmetic ...

    12-历史温故小程序.zip

    1、资源内容:毕业设计lun-wen word版10000字+;开题报告,任务书 2、学习目标:快速完成相关题目设计; 3、应用场景:课程设计、diy、毕业、参赛; 4、特点:直接可以编辑使用; 5、使用人群:设计参赛人员,学生,...

    java版斗地主源码-Programming-and-non-programming-materials-for-myself:编程和非编程材

    java版斗地主源码 编程、非编程资料(自留阅读) 目录 个人 专业 工具 团队 商业 国家 趋势 前言 无意间看到的文章, 在这篇文章中,看到了stackoverflow上的两个讨论: , 翻译了中文版本: , 翻译了中文版本: ...

    温故而知新,分享知识,快乐编码~.zip

    项目目录数据结构与算法会议算法基础数据结构JVM自定义类加载器最终同步易挥发的线程的创建与执行Java 并发设备中科院不安全生产者-消费者模型网络一个类实现RPC框架设计模式创造型模式(Creative)工厂简单模式...

    java多线程设计模式详解(PDF及源码)

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    java经典算法案例

    通过深入学习和实践这些Java经典算法案例,不仅能提升编程技巧,还能培养良好的问题解决思路,为成为一名优秀的Java开发者奠定坚实基础。无论是初级程序员还是经验丰富的工程师,都应该不断学习和温故这些算法知识,...

    JavaHub:Java程序员学习之路,持续更新原创内容,欢迎Star

    Java基础 网络基础 Linux MySQL基础 MySQL架构学习笔记 温故而知新-MySQL数据类型 MySQL索引实战经验总结 提高篇 源码阅读 源码阅读之Vector 源码阅读之ArrayList 并发编程 高并发编程-AQS深入解析 高并发编程-...

    电子基础知识(温故而知新)

    很基础的电子基础东西,相信很多朋友是不需要的,不过还是放上去,有需要回顾一下的~~~~~~~ 请看这里!

    java多线程设计模式及源码

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...

    开源bbs源码java-enjoy-php:小白PHP修炼秘笈

    学JAVA的狂赞JAVA在服务器端的运行效率和跨平台优势,学C#的向人们深情款款的介绍宇宙间最强大的IDE(VS系列),学c/c++的试图让人们看清楚,c才是运行效率最好的语言,没有之一。python的拥护者试图用20代码来完成用c...

    java代码-04林兆辉

    本文所关注的,是一份名为“java代码-04林兆辉”的资源,它不仅是一个编程范例,也是通往Java编程高手之路的一块垫脚石。 在讨论这份资源之前,我们先来揭开“main.java”这个文件的神秘面纱。在Java语言中,每一个...

    韩顺平Sqlhelper.java

    韩顺平Sqlhelper.对初学者或者老鸟都是很有帮助的东西。温故而知新。韩顺平Sqlhelper.java

    java多线程同步例子

    java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料

    指尖疯Android4.4视频第20集:File和IO存储

    文件和I/O存储,其实说白了属于java体系范畴,之所以还要拿到android体系中说道一下,是因为文件和I/O存储是非常经典的存储方式,在手机开发中应用也非常的广泛,所以疯兄这里也顺带讲解一番,如果已经有了java的...

    CPU 技术温故而知新(之三).pdf

    CPU 技术温故而知新(之三).pdf

    实战无线通信应知应会——新手入门,老手温故.pdf

    本书深入浅出地讲解了无线通信的基础理论与实践操作,从无线通信的本质出发,探讨了信号在无线信道中的传输机制,以及如何克服干扰与提高信息传送效率的关键技术。 ### 无线通信的本质 无线通信的核心在于信号的...

Global site tag (gtag.js) - Google Analytics