`
hanhan8020
  • 浏览: 45687 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

阅读更多

参考资料:

《core java》12章

使用Java操作文本文件的方法详解http://java.ccidnet.com/art/3737/20041108/523627_1.html

FileReader 是什么类?和 FileInputStream 有什么不同???

http://book.hackbase.com/ask2/ask107572.htm

自己的整理和领会:

引言:

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的方式传向服务器!

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

  }

4. InputStreamReader类

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

? 主要方法:

getEncoding(),read();

? 一般用法:

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));

  while((ch = isr.read())!=-1)

  {

   System.out.print((char)ch);

  }

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

分享到:
评论

相关推荐

    InputStreamReader和BufferedReader用法及实例讲解

    结合使用InputStreamReader和BufferedReader: 通常,为了提高效率,我们会在InputStreamReader之上使用BufferedReader。例如,当从文件或网络读取数据时,可以首先创建一个InputStreamReader对象,然后将其传递给...

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

    在实际应用中,当需要读取文件时,通常会结合使用FileInputStream(或FileOutputStream)与BufferedInputStream(或BufferedOutputStream)来提高性能,同时使用InputStreamReader和BufferedReader来处理字符编码和...

    java io 类 小结 代码

    代码直接使用 InputStream OutputStream Reader Writer FileInputStream FileOutputStream FileReader FileWriter InputStreamReader OutputStreamWriter BufferedReader BufferedWriter ...

    java文件读写宣贯.pdf

    本文将深入探讨Java如何读写文本文件,重点介绍Reader、Writer、InputStreamReader、FileReader、BufferedReader以及Writer的相关类和方法。 1. **Reader 和 Writer 类**: Java最初并不直接支持文本文件操作,...

    Java实现文件复制,File文件读取,写入,IO流的读取写入

    在Java中,我们可以使用`java.io`包中的`BufferedReader`和`BufferedWriter`或者`FileInputStream`和`FileOutputStream`来实现。例如,使用`FileInputStream`和`FileOutputStream`的方法如下: ```java File ...

    prg.zip_reading

    9. **编码问题**:如果文件不是使用系统默认编码,而是其他编码(如UTF-8),则需要使用`InputStreamReader`和`BufferedReader`配合,指定合适的编码。例如:`new InputStreamReader(new FileInputStream(file), ...

    java文件读写代码.pdf

    文件读写是Java中非常基础且常见的操作,它主要涉及到java.io包下的几个核心类,包括File、FileInputStream、FileReader、BufferedReader等。从提供的文件内容中,我们可以看到如何用Java进行文件的读取操作,分别是...

    Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理

    总的来说,`FileReader`和`FileWriter`是Java中简单的文本文件读写工具,但实际开发中,为了更好的性能和健壮性,往往会选择使用更高级的流类,如`BufferedReader`和`BufferedWriter`,并结合异常处理和资源管理策略...

    File手机文件操作

    例如,使用`FileInputStream`可以读取二进制文件,而`FileReader`适用于文本文件。`BufferedReader`或`DataInputStream`等类可以提高读取效率,通过缓冲区一次性处理大量数据。 ```java FileInputStream fis = ...

    FileIO.rar_FileIo_andriod driver_android_android 文件_android 读

    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line; while ((line = reader.readLine()) != null) { // 处理每一行数据 } reader.close(); ``` 对于大...

    java IO流的使用

    BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); ``` - `readLine()`方法会...

    读取文件 小程序 代码 Java

    如果文件使用特定编码(如UTF-8),需要使用`InputStreamReader`并指定编码,如`new InputStreamReader(new FileInputStream(file), "UTF-8")`。 9. **文件操作的最佳实践** 总是推荐使用`try-with-resources`语句...

    Java读取TXT的方法

    InputStreamReader read = new InputStreamReader(new FileInputStream(file), "GBK"); ``` 5. **创建缓冲读取器**: `InputStreamReader`处理字节流,但更方便的方式是使用`BufferedReader`来处理字符流,因为...

    JAVA读取文件——以行为单位读取

    总的来说,Java中以行为单位读取TXT文件是通过组合使用`FileReader`、`BufferedReader`和`readLine()`方法实现的。这种方式既简单又高效,适用于大多数文本处理需求。在实际项目中,你可以根据需要扩展这个基础示例...

    fileReader

    如果需要指定特定的编码,可以使用`InputStreamReader`,将`FileInputStream`作为参数,然后传入指定的编码集,如`"UTF-8"`。 5. **异常处理**: 使用`FileReader`时,需要注意处理可能抛出的`IOException`,包括`...

    Java 文件读取器

    总结起来,Java的`InputStream`和`FileReader`分别用于处理二进制数据和文本数据的读取,而`InputStreamReader`允许你在读取文件时指定字符编码。在用户界面中选择文件时,尽管`FileDialog`在早期版本中被使用,但...

    Java基本IO使用

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\SomeFile"))); ``` 现在,你可以使用`br`对象来按行读取和处理文件内容了。 总结来说,Java的IO系统通过字节流、缓冲流...

    Java文件读写操作函数实现

    * 操作可能开销很高的 Reader(如 FileReader和 InputStreamReader)。 * BufferedReader流能够读取文本行,通过向BufferedReader传递一个Reader对象 * ,来创建一个BufferedReader对象,之所以这样做是因为...

    java 字符集的解码方法

    Java中进行字符集解码主要使用`InputStreamReader`和`BufferedReader`类。`InputStreamReader`是字符流的基础类,它可以接受一个`InputStream`并指定字符集。例如,如果我们有一个字节输入流`byteInputStream`,我们...

    Java IO知识点

    例如,读取文件时,先创建FileInputStream,然后通过InputStreamReader转换为字符流,最后通过BufferedReader进行高效阅读。写文件则相反,从BufferedWriter开始,通过OutputStreamWriter转为字节流,然后通过...

Global site tag (gtag.js) - Google Analytics