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

java中FileInputStream,FileReader等的区别(转)

    博客分类:
  • java
 
阅读更多

最近操作写java IO相关的代码,网上搜到一篇文章不错。

源地址:http://hi.baidu.com/watashi/item/753dd682375cbf5d26ebd9be

 

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

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

分享到:
评论

相关推荐

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

    Java中的`FileReader`和`FileWriter`是用于读写文件的基本类,它们分别继承自`InputStreamReader`和`OutputStreamWriter`。这两个类是Java IO流模型中的字符流(Character Stream)部分,处理数据的方式是以字符为...

    Java使用FileInputStream流读取文件示例详解

    JAVA中针对文件的读写操作设置了一系列的流,其中主要有FileInputStream、FileOutputStream、FileReader、FileWriter四种最为常用的流。 二、FileInputStream 1. FileInputStream概念 FileInputStream流被称为文件...

    java I/o操作

    BufferedReader FileInputStream FileReader java序列化 java I/O流操作

    java中文乱码

    Java 读写文件最常用的类是 FileInputStream/FileOutputStream 和 FileReader/FileWriter。其中 FileInputStream 和 FileOutputStream 是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的 ...

    Java中的FileInputStream 和 FileOutputStream 介绍_动力节点Java学院整理

    Java中的`FileInputStream`和`FileOutputStream`是用于处理文件输入和输出操作的基本类,它们分别继承自`InputStream`和`OutputStream`。这两个类在Java I/O系统中扮演着核心角色,提供了对文件进行字节级读写操作的...

    Java-Io流,练习

    Java的IO流是Java编程语言中的重要组成部分,它主要用于数据的输入和输出操作。在Java中,IO流被设计为处理任何类型的数据,包括字符、字节甚至对象。本练习旨在帮助初学者理解和掌握Java IO流的基础知识。 一、IO...

    Java面试题大汇总(2021年Java面试题大全带答案)

    * Java文件操作:Java中提供了多种文件操作方式,包括使用File类、FileInputStream、FileOutputStream、FileReader、FileWriter等。 Java高级面试题 * Java集合框架:Java集合框架提供了多种数据结构,包括...

    Java中文1.6API

    还有FileInputStream、FileOutputStream、FileReader、FileWriter等用于文件操作的流,以及BufferedInputStream、BufferedReader等缓冲流,提高读写效率。 5. **多线程**:Thread类和Runnable接口是Java实现多线程...

    java的文件操作汇总

    FileInputStream和FileReader之间的主要区别在于,FileInputStream是字节流,直接处理文件的字节内容,适合处理任何类型的数据,而FileReader是字符流,适用于读取文本内容,它依赖于系统默认的字符编码。...

    java.io.Reader 和 java.io.InputStream 的区别

    1. **`FileInputStream`**:从文件中读取字节数据,类似于`FileReader`但更通用,因为它可以读取任何类型的数据,而不仅仅是文本。 2. **`ByteArrayInputStream`**:从内存中的字节数组读取数据,适用于需要将字节...

    java 统计指定文件中的字符个数

    在Java编程语言中,统计指定文件中的字符个数是一项常见的任务,这主要涉及到文件I/O操作和字符流处理。下面将详细讲解如何实现这个功能,以及相关的重要知识点。 首先,要进行文件I/O操作,Java提供了`java.io`包...

    Java_IO(输入输出)

    以下是关于Java IO中的几个关键类——FileInputStream、FileOutputStream、FileReader和FileWriter,以及异常处理机制try{}catch{}finally{}的详细解释。 1. **FileInputStream** 类:这是Java中的字节输入流类,...

    Java 中关于文件的操作

    在Java编程语言中,文件操作是一项基础且实用的技术,它涉及到读取、写入、创建、删除、重命名等文件及目录的相关操作。文件操作在各种应用开发中都发挥着关键作用,例如数据持久化、资源管理、日志记录等。下面我们...

    java 输入输出流

    9. **IOException**:在进行I/O操作时,可能会遇到各种错误,如文件未找到、权限不足等,这些异常由`java.io.IOException`及其子类抛出,需要在代码中进行捕获和处理。 10. **示例代码**:在提供的部分内容中,可以...

    JAVA IO流文件读写大全下载

    JAVA IO流是Java语言中对输入/输出(Input/Output)操作的抽象表示。它提供了多种流机制来实现文件的读写操作。本文将对JAVA IO流文件读写的知识点进行详细的解释和分析。 1. JAVA IO流的分类 JAVA IO流可以分为两...

    JAVA 文件读取示例

    在Java编程语言中,文件读取是常见的操作,无论是在处理配置文件、日志记录,还是进行数据交换,都离不开对文件的操作。本教程将详细讲解如何在Java中实现文件读取,以“JAVA 文件读取示例”为主题,通过实际代码...

    java读取dlt645所需文件

    5. **Java数据类型和位运算**:在解析二进制数据时,可能会用到Java的byte、short、int等数据类型以及位运算符(如&、|、、>>等),以提取和处理数据中的特定位。 6. **异常处理**:在读取文件或处理通信协议时,...

    流与文件 JAVA文件操作

    在Java中,我们可以使用`java.io.FileInputStream`和`java.io.FileOutputStream`来实现这个功能。我们先打开源文件的输入流,然后创建目标文件的输出流,接着通过循环读取源文件的字节并写入目标文件,最后关闭流。 ...

    解决Linux操作系统下Java的中文乱码问题

    在Linux操作系统中,Java应用程序处理中文字符时可能会遇到乱码问题。这主要涉及到编码格式的不匹配,因为Linux系统默认采用UTF-8编码,而某些Java应用或文件可能使用了GB2312、GBK或其他编码。本篇将详细介绍如何...

    JAVA7种IO流的基本使用

    在这个话题中,我们将深入探讨Java中的七种主要IO流及其基本用法,包括BufferedWriter、FileReader、转换流(InputStreamReader/OutputStreamWriter)以及缓存流(BufferedInputStream/BufferedOutputStream)。...

Global site tag (gtag.js) - Google Analytics