问题描述:例如,我们有一个文本文件file.txt,内容如下:
Hello(LS)
what(LS)
are(LS)
<empty_line>(LS)
you(LS)
doing(LS)
<empty_line>(LS)
<empty_line>(LS)
now(LS)
<empty_line>(LS)
<empty_line>(LS)
<empty_line>(EOF)
(LS -行分隔符,EOF -文件结束)
如果我理解了文本文件的概念,文件看起来是这样的。现在,我想用这个文本填充例如TextArea(来自JavaFX)。我可以使用下面的代码包围try-catch (close()方法将在finally块中):
TextArea textArea = new TextArea();
BufferedReader br = new BufferedReader(new FileReader(new File("file.txt")));
String line;
while ((line = br.readLine()) != null) {
textArea.appendText(line);
textArea.appendText("n");
}
该代码有一个大问题-每次在目标TextArea中有多一行时,文本文件不以empty_line结束。当文件empty_line包含EOF之前,所以加载到TextArea是正确的工作。我尝试了很多方法,但每次都有一些问题。
为什么选择BufferedReader?我选择BufferedReader是因为我只想要一些可以逐行读取源文本文件的阅读器。我想要那个阅读器,因为文件分隔符和操作系统的独立性。
我对它的期望是什么?我正在等待逐行读取文件,并在读取时设置自定义分隔符(独立于源文件行分隔符)-例如LF ("n")。我正在等待完全相同的内容与可能不同的行分隔符!当我写一些文件时(我也使用BufferedReader
(用于实习生从TextArea读取文本并根据用户操作系统(System.getProperty("line.separator")
)设置行分隔符),有类似的行为。
我试了什么?我尝试了很多方法。我还尝试在类BufferedReader中使用方法read(),并将其返回值与-1进行比较,这意味着EOF。但是,有一个问题,我想使用自定义文件分隔符,我没有时间编写一些解析器。
我的问题:我怎么能写到TextArea(或任何字符串)的文件内容与自定义的行分隔符没有任何额外或更少的行?
*正如你所看到的,我的英语不是很好,所以我希望你能理解我,谢谢。
您正在自己添加换行符。
while ((line = br.readLine()) != null) {
textArea.appendText(line);
textArea.appendText("n");
}
while-loop中的第二行添加下一行。每次执行该语句时,光标将移到下一行。因此,当文件光标从文件中读取最后一行时,它将其附加到textArea中,然后用一个新的行字符附加它。这就是为什么在末尾会有额外的空行。
if((line = br.readLine()) != null)
textArea.appendText(line);
while ((line = br.readLine()) != null) {
textArea.appendText("n");
textArea.appendText(line);
}
在讨论中,问题是使用readLine()
,以下文件将以相同的方式表现:
File A: "Hellon"
File B: "Hello"
1st readLine() --> "Hello"
2nd readLine() --> null
==> we cannot know if there was a 'n' after the last line or not
解决方法:使用其他方法读取字符,这里解释其中两种:
一次一个字符:
String readFile(String file) throws IOException {
FileReader fr = new FileReader(new File(file));
String s = "";
int c;
while ((c = fr.read()) >= 0) {
s += (c == 'n' ? myCharOrString : (char)c;
}
return s;
}
缓冲:
String readFile(String file, int bufferSize) throws IOException {
FileReader fr = new FileReader(new File(file));
char[] buffer = new char[bufferSize];
int charsRead;
String s = "";
while ((charsRead = fr.read(buffer)) > 0) {
s += new String(buffer, 0, charsRead);
}
return s.replaceAll("\r\n?", "n");
}
我做到了!我不知道有多少是有效的,或者如果我可以使用不同的阅读器比BufferedReader,但这是为我工作:
TextArea textArea = new TextArea();
String someString;
bufferedReader = new BufferedReader(new FileReader(file));
StringBuilder codeTextArea = new StringBuilder();
int character;
while ((character = bufferedReader.read()) != -1)
codeTextArea.append((char) character);
//for TextArea you can use just toString and it set up separators to LF
this.textArea.setText(codeTextArea.toString());
//for String where you want line separator LF you can use for example following regex expression
someString = codeTextArea.toString().replaceAll("rn?","n");
正如您在第二种情况中看到的,我使用regex表达式来检测和替换行分隔符。该代码可以读取文本文件与分隔符LF, CR, CRLF和填充它正确(包括最后空行)在TextArea或字符串与最低的内存要求,因为一个字符("n")为行分隔,也对应于TextArea默认行分隔符(它使用相同的- LF)。
这段代码可能不是很简单,但它可以工作。所以我问你是否知道如何简化它以获得最佳的硬件性能。