3

我正在尝试使用 FileInputStream 从本质上读取文本文件,然后将其输出到不同的文本文件中。但是,当我这样做时,我总是得到非常奇怪的字符。我确定这是我犯的一些简单错误,感谢您的帮助或为我指明正确的方向。这是我到目前为止所得到的。

    File sendFile = new File(fileName);
    FileInputStream fileIn = new FileInputStream(sendFile);
    byte buf[] = new byte[1024];
    while(fileIn.read(buf) > 0) {
        System.out.println(buf);
    }

它正在读取的文件只是一个常规 ASCII 字符的大文本文件。然而,每当我执行 system.out.println 时,我都会得到输出 [B@a422ede. 关于如何使这项工作的任何想法?谢谢

4

5 回答 5

6

发生这种情况是因为您正在打印字节数组对象本身,而不是打印其内容。您应该从缓冲区和长度构造一个字符串,然后打印该字符串。用于此的构造函数是

String s = new String(buf, 0, len, charsetName);

上面,len 应该是调用 read() 方法返回的值。charsetName 应该代表底层文件使用的编码。

于 2013-03-19T01:21:50.343 回答
1

如果您正在从一个文件读取到另一个文件,则根本不应该将字节转换为字符串,只需将读取的字节写入另一个文件即可。

如果您的意图是将文本文件从一种编码转换为另一种编码,请从 a 读取new InputStreamReader(in, sourceEncoding)并写入 a new OutputStreamWriter(out, targetEncoding)

于 2013-03-19T01:31:05.927 回答
0

那是因为打印buf将打印对字节数组的引用,而不是像您期望的那样将字节本身打印为字符串。您需要new String(buf)将字节数组构造成字符串

还可以考虑使用 BufferedReader 而不是创建自己的缓冲区。有了它,你就可以做到

String line = new BufferedReader(new FileReader("filename.txt")).readLine();
于 2013-03-19T01:37:24.137 回答
0

您的循环应如下所示:

int len;
while((len = fileIn.read(buf)) > 0) {
        System.out.write(buf, 0, len);
    }

您(a)使用了错误的方法和(b)忽略了返回的长度read(),而不是检查它< 0.所以您在每个缓冲区的末尾打印垃圾。

于 2013-03-19T04:49:01.243 回答
-1

object 的默认 toString 方法是在内存中返回 object 的 id。字节 buf[] 是一个对象。

您可以使用它进行打印。

File sendFile = new File(fileName);
FileInputStream fileIn = new FileInputStream(sendFile);
byte buf[] = new byte[1024];

while(fileIn.read(buf) > 0) {
    System.out.println(Arrays.toString(buf));
}

或者

 File sendFile = new File(fileName);
FileInputStream fileIn = new FileInputStream(sendFile);
byte buf[] = new byte[1024];
int len=0;
while((len=fileIn.read(buf)) > 0) {
    for(int i=0;i<len;i++){
        System.out.print(buf[i]);
    }
    System.out.println();
}
于 2013-03-19T01:41:31.557 回答