Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader-空行问题_Java_File_Javafx_Line_Bufferedreader - Fatal编程技术网

Java BufferedReader-空行问题

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) 这段代码有一个大问题——当文本文件的结尾不是空

问题描述:例如,我们有一个文本文件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)
这段代码有一个大问题——当文本文件的结尾不是空行时,每次目标文本区域中还有一行。当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");