今天学习了第十章I/O流,在做作业的时候有一些不明白的地方

FileInputStream与FileReader的区别

在解释Java中FileInputStream和FileReader的具体区别之前,我想讲述一下Java中InputStream和Reader的根本差异,以及分别什么时候使用InputStream和Reader。实际上, InputStream和Reader都是抽象类,并不直接地从文件或者套接字(socket)中读取数据。然而,它们之间的主要差别在于:InputStream用于读取二进制数据(字节流方式,译者注),Reader用于读取文本数据(字符流方式,译者注),准确地说,Unicode字符。那么,二进制数据和文本数据的区别是什么呢?当然,所有读取的东西本质上是字节,然后需要一套字符编码方案,把字节转换成文本。Reader类使用字符编码来解码字节,并返回字符给调用者。Reader类要么使用运行Java程序平台的默认字符编码,要么使用Charset对象或者String类型的字符编码名称,如“UTF-8”。尽管它是一个最简单的概念,当读取文本文件或从套接字中读取文本数据时,很多Java开发者会因没有指定字符编码而犯错。记住,如果你没有指定正确的编码,或者你的程序没有使用的协议中已存在的字符编码,如HTML的 “Content-Type(内容类型)”、XML文件头指定的编码,你可能无法正确地读取的所有数据。一些不是默认编码呈现的字符,可能变成“?”或小方格。一旦你知道stream和reader之间的根本区别,理解FileInputStream和FileReader之间的差异就很容易了。既可以让你从文件中读取数据,然而FileInputStream用于读取二进制数据,FileReader用来读取字符数据。

Java中FileReader vs FileInputStream

由于FileReader类继承了InputStreamReader类,使用的字符编码,要么由类提供,要么是平台默认的字符编码。请记住,InputStreamReader会缓存的字符编码。创建对象后,设置字符编码将不会有任何影响。让我们来看看如何使用Java中InputStream和FileReader的例子。你可以提供任何一个文件对象或一个包含文件位置的字符串,以开始读取文件的字符数据。这类似于FileInputStream,也提供了类似的用于读取文件源的构造函数。尽管建议使用BufferedReader来读取文件数据。

这是我修改之后的程序:

import java.io.FileInputStream;
 import java.io.FileReader;
 import java.io.IOException;


 public class TTT {
     public static void main(String args[]) {
     
  
         //  – 使用FileInputStream 读取文件内容
         try {
         FileInputStream fis = new FileInputStream("D:/HelloWorld.java");
             int data = fis.read();
             while (data != -1) {
                 System.out.print(Integer.toHexString(data));
                 data = fis.read();
             }
         } catch (IOException e) {
             System.out.println("Failed to read binary data from File");
             e.printStackTrace();
         }
  
         //  – Java中使用FileReader 读取文件数据
         try {
         FileReader reader = new FileReader("D:/HelloWorld.java");
             int character = reader.read();
             while (character != -1) {
                 System.out.print((char) character);
                 character = reader.read();
             }
         }
         catch (IOException io) {
             System.out.println("Failed to read character data from File");
             io.printStackTrace();
         }
     }
 }