链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100f628.html

最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。
java.io下面有两个抽象类:InputStream和Reader
InputStream是表示字节输入流的所有类的超类
Reader是用于读取字符流的抽象类
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
弄清了两个超类的根本区别,再来看他们底下子类的使用,这里只对最常用的几个说明

InputStream
   | __FileInputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。
构造方法摘要
FileInputStream (File  file)
          通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream (FileDescriptor  fdObj)
          通过使用文件描述符 fdObj 创建一个 FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream (String  name)
          通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。

Reader

|——BufferedReader
   |___InputStreamReader
         |__FileReader

BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法摘要
BufferedReader (Reader  in)
          创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader (Reader  in, int sz)
          创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedReader (Java Platform SE 6)
BufferedReader 的最大特点就是缓冲区的设置 ;通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求,如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
使用BufferedReader可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)。例如,
BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。

InputStreamReader (Java Platform SE 6)
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

构造方法摘要
InputStreamReader (InputStream  in)
          创建一个使用默认字符集的 InputStreamReader。
InputStreamReader (InputStream  in, Charset  cs)
          创建使用给定字符集的 InputStreamReader。
InputStreamReader (InputStream  in, CharsetDecoder  dec)
          创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader (InputStream  in, String  charsetName)
          创建使用指定字符集的 InputStreamReader。

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader最大的特点是可以指转换的定编码格式
,这是其他类所不能的,从构造方法就可看出,
这一点在读取中文字符时非常有用

FileReader
1)FileReader类介绍:
InputStreamReader类的子类,所有方法(read()等)都从父类InputStreamReader中继承而来;
2)与InputStreamReader类的区别:
构造方法摘要
FileReader (File  file)
          在给定从中读取数据的 File 的情况下创建一个新 FileReader 。
FileReader (FileDescriptor  fd)
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader 。
FileReader (String  fileName)
          在给定从中读取数据的文件名的情况下创建一个新 FileReader

该类与它的父类InputStreamReader的主要不同在于构造函数,主要区别也就在于构造函数!
从InputStreamReader的构造函数中看到,参数为InputStream和编码方式,可以看出,
当要指定编码方式时,必须使用InputStreamReader
类;而FileReader构造函数的参数与FileInputStream同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;
我想FileReader子类的作用也就在于这个小分工吧。该类与它的父类InputStreamReader
的主要不同在于构造函数,主要区别也就在于构造函数!
从InputStreamReader
的构造函数中看到,参数为InputStream和编码方式,可以看出,
当要指定编码方式时,必须使用InputStreamReader
类;而FileReader构造函数的参数与FileInputStream
同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;
我想FileReader子类的作用也就在于这个小分工吧。
二 联系与区别
(1)字符与字节:
FileInputStream 类以二进制输入/输出,I/O速度快且效率搞,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读,而且无法直接对文件中的字符进行操作,比如替换,查找(必须以字节形式操作);
而Reader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循环来读取文件;可以使用BufferedReader的readLine()方法一行一行的读取文本。
(2)编码
InputStreamReader ,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。
FileReader与InputStreamReader 涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream 以二进制方式处理,不会出现乱码现象.
因此要指定编码方式时,必须使用InputStreamReader 类,所以说它是字节转换为字符的桥梁;
(3) 缓存区
    BufferReader类用来包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)。
(4)规范用法
总结以上内容,得出比较好的规范用法:
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,"UTF-8");
BufferedReader bufReader=new BufferedReader(inReader);
3) File file = new File ("hello.txt");
FileReader fileReader=new FileReader(file);
BufferedReader bufReader=new BufferedReader(fileReader);[size=x-large] [/size][size=large][/size]

java读文件的几个类的更多相关文章

  1. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

  2. JAVA一个文件写多个类

    JAVA一个文件写多个类,并且是同级类,需注意: 在一个.java文件中可以有多个同级类,  其修饰符只可以public/abstract/final/和无修饰符 public修饰的只能有一个,且必须 ...

  3. Java读文件写入kafka

    目录 Java读文件写入kafka 文件格式 pom依赖 java代码 Java读文件写入kafka 文件格式 840271 103208 0 0.0 insert 84e66588-8875-441 ...

  4. java中文件操作的工具类

    代码: package com.lky.pojo; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...

  5. java 读文件 解析

    [Java]读取文件方法大全   1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {     /**     ...

  6. Java读文件

    public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileB ...

  7. Java读文件夹

    使用JAVA读取文件夹中的多个文件 package hx.ReadFile; import java.io.FileNotFoundException; import java.io.IOExcept ...

  8. java 读文件路径问题

    文件路径:右键点击src新建Source Folder,创建结果与src目录同级. C:\Users\lenovo\workspace\timedTask\config\userinfo.proper ...

  9. java读取文件封装的一个类(有部分代码借鉴别人的)

    package modbus.rtu.calc; import java.io.BufferedReader; import java.io.FileInputStream; import java. ...

随机推荐

  1. iOS 表视图(UITableVIew)的使用方法(1)表视图的示例

    表视图继承自UIScrollView,所以有着大多UIScrollView的操作特性,诸如手指控制内容的滚动,内容视图到顶端或者低端时的自动反弹等.配合UINavigationController的导 ...

  2. Ubuntu在ARM上建立NFS服务

    先引用别人的做法: 1.进行NFS服务器端与客户端的安装: sudo apt-get install nfs-kernel-server nfs-common portmap 安装客户端的作用是可以在 ...

  3. Java并发编程总结3——AQS、ReentrantLock、ReentrantReadWriteLock(转)

    本文内容主要总结自<Java并发编程的艺术>第5章——Java中的锁. 一.AQS AbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步 ...

  4. Spring Boot使用Redis进行消息的发布订阅

    今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制.发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦.在我们的例子中,我们将使用StringRedi ...

  5. BZOJ 2463 谁能赢呢? (博弈论)

    题解:简单博弈论 #include <cstdio> int main(){ int n; while(scanf("%d",&n),n!=0) if (n&a ...

  6. CSS3阴影 box-shadow的使用和技巧总结[转]

    text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...

  7. 关于CDC在非控件类中的使用

    在非CStatic的派生类中,由于进行图形的绘制的话,我们需要对该类传入一个CDC以便于绘画.这是因为非CStatic等控件类无法自己产生onPaint这类的消息,因此需要借传入的CDC进行回执,然后 ...

  8. Oracle 集群心跳及其參数misscount/disktimeout/reboottime

    在Oracle RAC中,能够从多个层次,多个不同的机制来检測RAC的健康状况,即能够通过心跳机制以及一定的投票算法来隔离故障.假设检測到某节点失败,则存在故障的节点将会被逐出集群以避免故障节点破坏数 ...

  9. An Introduction to Interactive Programming in Python

    这是在coursera上面的一门学习pyhton的基础课程,由RICE的四位老师主讲.生动有趣,一共是9周的课程,每一周都会有一个小游戏,经历一遍,对编程会产生很大的兴趣. 所有的程序全部在老师开发的 ...

  10. js取一维数组最大值,最小值

    最近项目中遇到了,处理数组数据问题:     var newStrs=[1,2,3,4];               alert(Math.min.apply(null,newStrs));  // ...