如何在Java中将多行写入文本文件?

3

我希望在Java中创建并写入文件。我知道如何用一行代码实现,但我想知道如何将多行内容写入单个文件。

import java.io.FileWriter;
import java.io.BufferedWriter;

public class WritingToAFile {

public static void main(String[] args) {

   try{ 
   FileWriter fstream = new FileWriter ("P:/Computer Science/greeting.txt");
   BufferedWriter info = new BufferedWriter(fstream);

   for(int i = 1; i < 6; i++){
       info.write("Hello");
       info.newLine();
       info.write("Bonjour");
       info.newLine();
       info.write("Guten tag");
       info.newLine();
       info.write("Aloha");
       info.newLine();
       info.write("Nihao");
       info.close();
       }catch(Exception e){
          System.out.println("A write error has occurred");
    }   
  }
}

我知道现在是错的,但我不确定我做错了什么。非常感谢您的帮助!我只是一个初学者,所以我真的很迷茫。


为什么会有错呢?你应该根据平台使用\n\r\n - hellow
我不知道你的代码或输出有什么问题。你认为这里出了什么问题? - Luiggi Mendoza
3个回答

5
您每次迭代都会关闭文件 - info.close(); - 这就是您会遇到异常的原因。您需要在完成写入后关闭文件。 newLine(); 方法没有问题。但是您可以使用新行字符使其更短。 "\n" 是 Unix 系统的换行分隔符。 "\r\n" 是 Windows 系统的换行分隔符。 "%n" 是一个平台无关的换行分隔符。
for(int i = 1; i < 6; i++) {
    info.write(String.format("Hello%n"));
}
info.close();

第二个问题在于您没有关闭FileWriter本身。
如果您正在使用Java 7或更高版本,我建议使用try-with-resources来摆脱finally块:
public class Main {

    public static void main(String[] args) {
        try (FileWriter fstream = new FileWriter("greeting.txt");
             BufferedWriter info = new BufferedWriter(fstream)) {
            for (int i = 1; i < 6; i++) {
                info.write(String.format("Hello%n"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件输出:
Hello
Hello
Hello
Hello
Hello

更新:

所有的输入输出操作都需要处理流、通道和文件描述符(例如你特定情况下用到的FileWriterBufferedWriter等)。这些流应该被谨慎关闭以释放系统资源。如果未能这样做,可能会导致资源泄漏。尽管你关闭了info,但在代码中忘记关闭fstream

当你正确使用try-with-resources语句时,就不需要显式地关闭流了。try-with-resources语句确保在语句结束时每个资源都被关闭。


啊,我不知道还有其他的行分隔符,newLine(); 是我们在课堂上学到的唯一一个,这真的很有用,谢谢!不好意思,你能解释一下第二部分吗?我不是很明白。 - Hafsah H
@Hafsah H 请查看答案的更新部分。不要忘记接受最有用且解决了您问题的答案。 - J-Alex

2
你几乎做对了,实际上这与 info.newLine(); 没有任何关系,而是你代码的语法问题。
你的 catch 实际上在你的 for 循环之后,并且与 try 没有连接。
此外,你在 for 循环中关闭流,而不是在它完成后关闭(这会导致 IOException)。
示例:
try {
    FileWriter fstream = new FileWriter("P:/Computer Science/greeting.txt");
    BufferedWriter info = new BufferedWriter(fstream);
    for (int i = 1; i < 6; i++) {
        info.write("Hello");
        info.newLine();
        info.write("Bonjour");
        info.newLine();
        info.write("Guten tag");
        info.newLine();
        info.write("Aloha");
        info.newLine();
        info.write("Nihao");
    }
    info.close();
} catch (Exception e) {
    System.out.println("A write error has occurred");
}

哦,好的,这比我做的任何事情都更有意义。我会尝试一下,谢谢! - Hafsah H

0

在写入方法的字符串末尾,根据系统添加\n\r\n平台换行符。

try{
    for(int i = 1; i < 6; i++){
           info.write("Hello\n");
           info.write("Bonjour\n");
           ...

           }
    }
    catch (Exception e) {
    System.out.println("A write error has occurred");
}
finally{
    info.close();
}

你确定BufferedWriter会在相应的系统上将它转换为\r或\r\n吗? - JayC667
在指向之前,请查看代码和文件路径,针对 sys 平台。 - Roushan
嗯,是的。在我看来似乎是Windows(尽管您应该使用反斜杠而不是斜杠)...所以,正如我们所知,Windows使用\r\n换行符,任何其他换行符都可能会导致问题。这就是为什么我提到它的原因。而且BufferedWriter和FileWriter均调用Writer(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/Writer.java#Writer.write%28java.lang.String%29),或使用java.lang.String的getChars方法,这不会适应适当的换行符。因此,请在抱怨某人“指点”之前先阅读并理解。 - JayC667
它看起来不像,它是Windows,哭 -> 哈哈为什么我要这样做,"\n" 在Windows上可以用于换行,为什么那个链接附加在那里?我没有发现任何与你提到的相关事项。 - Roushan
好的,至少你已经修改了一点你的代码。虽然它还不是完全正确的,但这已经是朝着正确方向迈出的一步了...检查System.getProperty("line.separator")System.lineSeparator()以获得完全正确的答案,或者查看线程https://dev59.com/h1oV5IYBdhLWcg3wCq8n以获得深入理解。感谢您让这个平台再次变得伟大^^ - JayC667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接