Java 连接文件中的行

Java 连接文件中的行,java,file-io,Java,File Io,我有许多包含连续字符块行的数据文件,例如 thisisthefirstline thisisthesecondline thisisthethirdline 我正在阅读这些行中的每一行,并将它们连接起来创建一个长字符串,然后进行处理。我的问题是,有没有一种优雅的方法来处理明文文件中的行串联 目前,我正在执行以下任务: BufferedReader br = new BufferedReader(new FileReader(sequence)); String line; String seq

我有许多包含连续字符块行的数据文件,例如

thisisthefirstline
thisisthesecondline
thisisthethirdline
我正在阅读这些行中的每一行,并将它们连接起来创建一个长字符串,然后进行处理。我的问题是,有没有一种优雅的方法来处理明文文件中的行串联

目前,我正在执行以下任务:

BufferedReader br = new BufferedReader(new FileReader(sequence));
String line;
String sequence = "";
while ((line = br.readLine()) != null)
    sequence += line;
// do stuff with sequence here

是否有办法仅使用
序列
容器变量而不是
临时变量来实现这一点?

否,每次调用
BufferedReader#readLine()
都会一直读取,直到找到新行或流结束。因此,不能调用它两次:一次调用
null
,一次调用将其分配给某个变量。您需要有一个临时占位符来比较和使用其值


您当前所做的绝对没有问题。

没有,每次调用
BufferedReader#readLine()
都会一直读取,直到找到新行或流结束。因此,不能调用它两次:一次调用
null
,一次调用将其分配给某个变量。您需要有一个临时占位符来比较和使用其值


你现在所做的事情绝对没有错。

你可以使用一种有趣的快速方式;使用
readAllLines
(Java 7)并编写:

List<String> lines = Files.readAllLines(Paths.get("fileName"), StandardCharsets.UTF_8);
String longString = Arrays.toString(lines.toArray()).replaceAll("\\[|\\]", "").replaceAll(", ","\t");

你可以用一种有趣的快捷方式;使用
readAllLines
(Java 7)并编写:

List<String> lines = Files.readAllLines(Paths.get("fileName"), StandardCharsets.UTF_8);
String longString = Arrays.toString(lines.toArray()).replaceAll("\\[|\\]", "").replaceAll(", ","\t");

最后,我使用以下循环来执行必要的字符串连接:

String seq = "";
for (String line; (line = br.readLine()) != null; )
    seq += line;

虽然这并不能避免使用临时变量,但我认为它比标准的
while loop
方法更可取。在这里,临时变量
的范围仅限于实际进行文件处理的循环。

我使用以下循环来执行必要的字符串连接:

String seq = "";
for (String line; (line = br.readLine()) != null; )
    seq += line;

虽然这并不能避免使用临时变量,但我认为它比标准的
while loop
方法更可取。在这里,临时变量
的范围仅限于文件处理实际发生的循环。

这确实是一个非常新颖的解决方案,但偏离众所周知的模式可能会影响可读性。同意,我们将文件加载到数组的第一行。这里有一个选项列表。使用循环和附加到StringBuilder的简单方法。我认为使用
join
的非常清晰的方法很好,我认为处理
列表的解析方法是最重要的。使用
readAllLines
是一个很好的建议。这确实是一个非常新颖的解决方案,但是偏离了一个众所周知的模式可能会影响可读性。同意,我们将文件加载到数组的第一行。这里有一个选项列表。使用循环和附加到StringBuilder的简单方法。我认为使用
join
的非常清晰的方法很好,我认为处理
列表的解析方法是最重要的。使用
readAllLines
是一个很好的建议。你是对的,它本身没有什么问题。我认为这是Java中读取文件最常见的模式。我只是想知道是否有一种方法可以将行附加到容器变量,作为
null
检查的一部分。@voidHead因为您必须同时检查
null
和附加值,您不能修改上面的代码以仅使用
line
。但是,还有其他读取文件的方法(例如,Maxim提出的方法)。你是对的,它本身没有什么问题。我认为这是Java中读取文件最常见的模式。我只是想知道是否有一种方法可以将行附加到容器变量,作为
null
检查的一部分。@voidHead因为您必须同时检查
null
和附加值,您不能修改上面的代码以仅使用
line
。但是,还有其他读取文件的方法(例如,Maxim提出的方法)。最好使用StringBulder#append来连接字符串,这样GC的工作就更少了。否则,您的代码就可以了,并且由于检查空值,所以不可能简单地删除行。@JosefN您想详细说明使用复合赋值如何影响垃圾收集吗?每个时间序列+=行;执行新对象时,应收集旧字符串。最好使用StringBulder#append连接字符串,GC的工作量更少。否则,您的代码就可以了,并且由于检查空值,所以不可能简单地删除行。@JosefN您想详细说明使用复合赋值如何影响垃圾收集吗?每个时间序列+=行;执行时,将创建新对象并收集旧字符串。