这是将一个文件的文本复制到另一个文件的代码。
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);
代码不起作用。为什么?
答案 0 :(得分:2)
好的,首先,这是一个适用于任何文件的代码,而不仅仅是文本文件:
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
s)甚至是UTF-32。
第二个问题:
FileReader fr=new FileReader(f);
未指定编码;使用默认的JVM编码。
因此,如果您尝试使用Windows-1252的默认JVM编码读取以UTF-8编码的文件,则将损坏目标文件。
输出文件也是如此:未指定编码。这样的文件基本上是“不可移植的”。
第三个问题:有:
int c=fr.read(cbuff);
这将返回实际读取的字符数;好。
但是当您将文件写回来时,这不会被使用!写代码应为:
fw.write(cbuff, 0, c);
答案 1 :(得分:1)
char cbuff[]=new char[(int)f.length()];
创建大小等于文件长度(文件内容)
的char数组int c=fr.read(cbuff);
读取文件并将内容放入char数组
答案 2 :(得分:1)
我想知道这条线的作用
char cbuff [] = new char [(int)f.length()];
这一行只是创建一个与输入文件长度相同的新char数组。
int c = fr.read(cbuff);
然后该行读取输入文件并将其存储在char数组(cbuff)中。 如果您对最后一行进行注释,则输入文件的内容永远不会写入cbuff,因此当您尝试将其写入新文件时,它是空的。
答案 3 :(得分:1)
f.length(); // gives us the length in bytes, the type of the result is 'long'
(int) f.length(); // casts the long to an int
char cbuff[] = new char [(int) f.length()]; // create a new variable, which is an array of char and is called cbuff. assign a new array of char to it, with the length specified by the length of the file
这是显示FileReader.read(char [])从文件读入数组的link。它实际上是一个继承自Reader类的方法。
fr.read(cbuff); //this is the line that does the actual reading from the file f. The results are stored in the char array cbuff (which is why we initialized it to be the length of the file)
现在,fr.read()的结果存储在一个int中,这只是已读取的字符数。除非有错误,否则这应该与cbuff的长度完全相同。
答案 4 :(得分:1)
代码
char cbuff[]=new char[(int)f.length()];
基本初始化内存中的容器,文件将被加载,但它不会读取文件。这条线
int c = fr.read(cbuff);
将文件读入内存缓冲区。你怎么能期望它没有那条线路?关于你的问题 - “FileReader如何识别将它正在读取的文件文本存储到这个cbuff []中?” - 基本上是因为那条线......
fr.read(cbuff); //翻译:文件阅读器,请将文件读入缓冲区cbuff。
希望这有帮助