这是将一个文件的文本复制到另一个文件的代码。
public class Writer
{
public static void main(String args[]) throws IOException
{
File f=new File("D:/test.txt");
FileReader fr=new FileReader(f);
char cbuff[]=new char[(int)f.length()];
int c=fr.read(cbuff);
fr.close();
FileWriter fw=new FileWriter("D:/newTest.txt");
fw.write(cbuff);
fw.close();
}
}
我想知道这条线的作用
char cbuff[]=new char[(int)f.length()];
FileReader 如何识别将其读取的文件文本存储到此 cbuff[] 中?
当我评论这一行时
int c=fr.read(cbuff);
代码不起作用。为什么?
最佳答案
好的,首先,这是一个适用于任何文件的代码,而不仅仅是文本文件:
final Path src = Paths.get("D:/test.txt");
final Path dst = Paths.get("D:/newTest.txt");
Files.copy(src, dst);
现在,您的代码已严重损坏。让我们从这个开始:
char cbuff[]=new char[(int)f.length()];
这将创建一个与文件大小相同的char
数组;但它没有考虑到 byte
<->char
映射不是 1 到 1 的事实。例如,如果文件采用 UTF-8 编码,“à "以两个字节编码;因此,char 数组至少会长一个元素。在 UTF-16(每个 char
是两个 byte
)甚至 UTF-32 中情况更糟。
第二个问题:
FileReader fr=new FileReader(f);
未指定编码;使用默认的 JVM 编码。
因此,如果您尝试使用默认 JVM 编码 windows-1252 读取以 UTF-8 编码的文件,您将损坏目标文件。
输出文件也是如此:未指定编码。这样的文件本质上是“不可移植的”。
第三个问题:有:
int c=fr.read(cbuff);
这将返回实际读取的字符数;很好。
但是当你写回文件时这并没有被使用!写入代码应该是:
fw.write(cbuff, 0, c);
关于java - 在文件处理中如何从 char[] 数组读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22296679/