Java BufferedReader-空行问题
问题描述:例如,我们有一个文本文件file.txt,包含以下内容:Java BufferedReader-空行问题,java,file,javafx,line,bufferedreader,Java,File,Javafx,Line,Bufferedreader,问题描述:例如,我们有一个文本文件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) 这段代码有一个大问题——当文本文件的结尾不是空
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)
这段代码有一个大问题——当文本文件的结尾不是空行时,每次目标文本区域中还有一行。当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循环中的第二行添加下一行。每次执行该语句时,光标都会转到下一行。
因此,当文件光标从文件中读取最后一行时,它会将其追加到文本区域,然后再追加一个新行字符。这就是为什么在末尾会有额外的空行
if((line = br.readLine()) != null)
textArea.appendText(line);
while ((line = br.readLine()) != null) {
textArea.appendText("\n");
textArea.appendText(line);
}
正如讨论中所发现的,问题在于使用
readLine()
时,以下文件的行为方式相同:
File A: "Hello\n"
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("\r\n?","\n");
正如您在第二种情况中看到的,我使用正则表达式来检测和替换行分隔符。该代码可以读取带有分隔符LF、CR、CRLF的文本文件,并在文本区域或内存需求最低的字符串中正确填充(包括最后一个空行),因为只有一个字符(“\n”)用于行分隔符,也与TextArea默认行分隔符对应(它使用相同的-LF)
这段代码可能不是很简单,但很有效。因此,我想问您是否知道如何简化它以获得尽可能好的硬件性能。您好,我尝试过,因为我认为这是正确的解决方案,但您可以自己尝试。现在我再次尝试,得到了相同的结果-当我加载最后3行为空的文件时,读卡器加载只有两行空行。@NikNovák你怎么知道?实际上我正在尝试。我真的不知道为什么,但当我有一个文件至少有最后一行是空的,所以当我试图保存在某个字符串或文本区域时,有一行消失了…非常奇怪的行为。你也有这个问题吗?
StringBuilder output=new StringBuilder()
BufferedReader br=new BufferedReader(new FileReader(new File(“RandomFile.txt”));
字符串行;
if((line=br.readLine())!=null)
output.append(line);
`while((line=br.readLine())!=null){output.append(“\n”)
输出.附加(行);
这是我尝试过的代码。它给了我你想要的结果。在打印“now”后,它打印了三行空行。对不起,但它对我不起作用,你可以试试它,而不是打印写入某个字符串或直接打印到文本区域。对不起,但这也不起作用。当我加载具有不同数量的最后一个空行的文件时ines它是有效的。但是当我使用没有以任何空行结束的文本时,空行是在结果字符串中添加的。我只想要文件内容的副本,可能选择了自己的行分隔符。@NikNovák你确定,在这种情况下,它应该删除结尾的新行字符,因为在子字符串中,结尾索引是独占的。你确定吗这样做,还是要添加到文本区域?哦,对不起,我的错;我只是将您的代码编辑到!s.endsWith(“\n”)
,因为您的原始代码有一个问题:当我在文件中最后一行为空时,这一行不在结果字符串中。否则它是功能性的。@NikNovák我看到了问题,答案基本上是您在使用readline“Hello\nEOF”
和“helloof”时无法检测到这一点
将以同样的方式运行。@NikNovák现在将其添加到这两个函数中,它是\\n,因为replaceAll使用正则表达式。好的,最后一点注意,请阅读它,\n还表示字符,而不是不同系统上的换行符,因此,要使正则表达式100%正确,您必须编写replaceAll(\\r\\n?,“\n”)
尽管另一种方法也可以。
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("\r\n?","\n");