在Java中将文本文件读入字符数组

8

我正在阅读一个文本文件,并尝试将其逐个字符地存储到char数组中。我的方法(如下所示)预定义了一个初始长度为100000的char数组(我的主要问题在于此)。因此,如果文件中包含不到该数量的字符(如果字符超过该数量也会有问题),则我的数组中会有空值。我想避免这种情况。有没有一种方法可以预先确定文本文件中存在的字符数?或者存储文件char by char的更好方法是什么?

char buf[] = new char[100000];
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
br.read(buf);
for(int i = 0; i < buf.length; i++)
{
     //Do stuff here
}
2个回答

5

使用字符数组列表接受值。之后将 ArrayList 转换为数组,如下所示:

 char[] resultArray = list.toArray(new char[list.size()]);

你应该使用br.readLine()而不是br.read(),代码如下:
String str;
while((str = br.readLine())!=null){
        str.tocharArray();
}

1
请不要使用br.read(),而是使用br.readLine获取字符串,然后通过string.toCharArray()提取字符。 - Arham
*str.toCharArray(); - Jwan622

4

使用Scanner代替!

我建议使用Scanner逐行读取,而不是逐个字符读取并将其存储为字符串。如果您真的想要一个字符数组,稍后获取它更容易。

这个功能实际上是相同的:

String theString = "";

File file = new File("data.txt");
Scanner scanner = new Scanner(file);

theString = scanner.nextLine();
while (scanner.hasNextLine()) {
       theString = theString + "\n" + scanner.nextLine();
}

char[] charArray = theString.toCharArray();

这样做的好处是,您可以利用Java的String类型,它会为您处理所有棘手的长度和连接问题。而且String.toCharArray() 方法已经内置返回自动调整大小的数组。

你添加了一个额外的字符 "\n"。也许你应该将其删除。 - Arham
逐个字符读取将为每个新行返回一个换行符。Scanner假定您只想要该行的内容,并返回一个以null结尾的字符串。结果是,如果您想要一个巨大的字符串(如初始长度为100000所暗示的那样),则需要在每行字符数据之间重新添加它们。(Java字符串连接会消除附加字符串之间的空终止符)简而言之,这就是您需要执行的操作,以获得相同的结果。 - darkpbj
我仍然不明白为什么你在不知道文件内容的情况下要显式处理“\n”。你正在将noOfLines * new_line_chars添加到数组中,而一个人只想要他在文件中写入的字符数。尝试使用一行代码运行程序,你就会明白。 - Arham
就编程而言,你的代码在内存方面也是低效的,因为它每次都会创建一个新的字符串。你应该使用 StringBuilder 和 append()。 - Arham
就内存效率而言,除非您的Java编译器没有打开任何优化标志,否则java字节码将比您的reader类处理scanner类和字符串需要更少的指令和堆栈操作,所以在您投票反对我之前,请先核实事实。 - darkpbj
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接