我从另一个问题中找到了这段代码
private void updateLine(String toUpdate, String updated) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(data));
String line;
String input = "";
while ((line = file.readLine()) != null)
input += line + "\n";
input = input.replace(toUpdate, updated);
FileOutputStream os = new FileOutputStream(data);
os.write(input.getBytes());
file.close();
os.close();
}
这是我替换某些行之前的文件
example1
example2
example3
但是当我替换一行时,该文件现在看起来像这样
example1example2example3
当文件中有很多行时,无法读取文件。
如何编辑上面的代码以使我的文件在开始时看起来像什么?
答案 0 :(得分:9)
使用System.lineSeparator()
代替\n
。
while ((line = file.readLine()) != null)
input += line + System.lineSeparator();
问题是在Unix系统上,行分隔符是\n
,而在Windows系统上,它是\r\n
。
在早于Java 7的Java版本中,您必须使用System.getProperty("line.separator")
代替。
正如评论中指出的那样,如果你担心内存使用情况,那么将整个输出存储在一个变量中是明智的,但是在你使用的循环中逐行写出来处理输入。
答案 1 :(得分:3)
如果你逐行阅读和修改,这有一个好处,你不需要将整个文件放在内存中。不确定在您的情况下这是否可行,但通常以流式传输为目标是一件好事。在你的情况下,这将除了连接字符串的需要,你不需要选择行终止符,因为你可以用println()编写每个单独的转换行。它需要写入不同的文件,这通常是一件好事,因为它是安全的。如果重写文件并中止,则会丢失数据。
private void updateLine(String toUpdate, String updated) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(data));
PrintWriter writer = new PrintWriter(new File(data+".out"), "UTF-8");
String line;
while ((line = file.readLine()) != null)
{
line = line.replace(toUpdate, updated);
writer.println(line);
}
file.close();
if (writer.checkError())
throw new IOException("cannot write");
writer.close();
}
在这种情况下,它假定您只需要在完整的行上进行替换,而不是多行。我还添加了一个显式编码并使用了一个编写器,因为你有一个要输出的字符串。
答案 2 :(得分:1)
这是因为您使用OutputStream,它更适合处理二进制数据。尝试使用PrintWriter,不要在行尾添加任何行终止符。示例是here