java 中 FileReader能读取啥格式的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中 FileReader能读取啥格式的文件相关的知识,希望对你有一定的参考价值。

java
FileReader

以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取信息。
FileReader
fr
=
new
FileReader(file);
BufferedReader
br
=
new
BufferedReader(fr);
也就是说,
FileReader
是直接向上层提供是经过
Unicode
编译好的内容。
所以,FileReader
主要针对的是以
Unicode
为基础的文件,比如
JSON,
XML,
TXT
等等。

FileReader
读取非
Unicode
的文件,比如二进制文件,得到的会是乱码,经过处理可以还原原始数据,但是这不是最好的做法。
参考技术A filereader指定不了编码格式,但是你可以用这种方式
bufferedreader
br
=
null;
stringbuilder
sb
=
new
stringbuilder();
try

inputstreamreader
ir
=
new
inputstreamreader(new
fileinputstream(new
file(url)),
charset.forname("utf-8"));
br
=
new
bufferedreader(ir);
string
tempstring;
//一次读入一行,直到读入null为文件结束
while
((tempstring
=
br.readline())
!=
null)

sb.append(tempstring).append("\n");


finally

if
(br
!=
null)

br.close();

参考技术B 所有文件都可以啊
只要你的url路径正确
无论什么文件都可以读取到的
不过你读取到后要处理一下
不然看不懂

Java 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来读取文件数据。我把我的eclipse的file.encoding设置成了UTF-8,然后再c盘新建一个data.txt并且输入一个永字,用记事本打开另存为UTF-8编码。这个时候我们在eclipse中运行程序,可以看到data.txt的打印二进制内容是efbbbfe6b0b8(通过Notepad++的HEX-Editor插件查看data.txt文件十六进制内容可以验证这一点),说明FileInputStream没有进行任何编码转换把data.txt的二进制内容读入java变量中。我们再来看下面一行输出  feff6c38永  就会发现FileReader通过UTF-8读取文件,然后对文件进行了编码,使其转换成unicode编码存入java变量中,这样才能在java中正确使用,因为java存储在内存里的变量都是unicode编码。如果我们把data.txt另存为ANSI(GBK)编码,FileReader还是通过UTF-8读取文件,然后对文件进行了unicode编码就会出现乱码问题。如果把eclipse的file.encoding设置成了GBK再运行程序就会打印正常,如下

d3c0
6c38永

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.awt.Color;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
 
/**
 * Java程序通过字节流和字符流的方式来读取文件数据。
 * 需强调FileInputStream和FileReader的关键区别在于:FileReader用于读取字符流,而FileInputStream用来读取原始字节流。
 * @author Javin Paul
 */
public class HowToReadFileInJava {
    public static void main(String args[]) {
 
        // 例1 – 使用FileInputStream 读取文件内容
        try (FileInputStream fis = new FileInputStream("c:/data.txt")) {
            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();
        }
 
            System.out.println();
        // 例2 – Java中使用FileReader 读取文件数据
        try (FileReader reader = new FileReader("c:/data.txt")) {
            int character = reader.read();
            while (character != -1) {
                        System.out.print(Integer.toHexString(character));
                System.out.print((char) character);
                character = reader.read();
            }
        } catch (IOException io) {
            System.out.println("Failed to read character data from File");
            io.printStackTrace();
        }
    }
}

另存为UTF-8输出:

1
2
3
4
5

UTF-8
efbbbfe6b0b8
feff6c38永

 

另存为ANSI(GBK)输出:

 
1
2
3
4
5

UTF-8
d3c0
fffd?fffd?

技术分享图片

第1个例子是按字节从文件中读取数据,因此势必会非常慢。FileInputStream的read() 方法是阻塞式的,读取字节或数据块,直到无数据输入。它要么返回数据的下一个字节,当到达文件末尾时,返回-1。这意味着,我们每循环读取一个字节,将其打印为十六进制字符串。顺便说一句,将InputStream转换成字节数组是可选的。另一方面,例2是按字符读取数据。继承自FileReader的InputStreamReader 的read() 方法读取单个字符,并返回该字符,当到达流末尾时,返回-1。这就是为什么你看到例2输出的文字跟文件中的完全一样。

这就是所有关于Java中FileInputStream和FileReader之间的区别。归根结底:使用FileReader或BufferedReader从文件中读取字符或文本数据,并总是指定字符编码;使用FileInputStream从Java中文件或套接字中读取原始字节流。






以上是关于java 中 FileReader能读取啥格式的文件的主要内容,如果未能解决你的问题,请参考以下文章

js,nodejs如何判断文件是啥编码格式

java 中 File("e:\\Q.XML") 和 FileReader("e:\\q.xml") 有啥区别?

阶段1 语言基础+高级_1-3-Java语言高级_08 转换流_2_编码引出的问题_FileReader读取GBK格式文件

JAVA文件读取FileReader

JAVA中FileReader类读取文件显示FileNotFoundException 异常的解决办法

java.io.FileReader 将要读取的文件放在哪里?