Java将多行字符串保存到文本文件

时间:2011-03-09 23:29:55

标签: java file text save multiline

我是Java新手并尝试将多行字符串保存到文本文件中。

现在,它确实可以在我的应用程序中运行。就像,如果我从我的应用程序中保存文件然后从我的应用程序中打开它,它确实在行之间放置了一个空格。但是,如果我从我的应用程序中保存文件然后在记事本中打开它,那么它就在一行上。

有没有办法让它在所有程序中显示多行?这是我目前的代码:

public static void saveFile(String contents) {

    // Get where the person wants to save the file
    JFileChooser fc = new JFileChooser();

    int rval = fc.showSaveDialog(fc);

        if(rval == JFileChooser.APPROVE_OPTION) {

            File file = fc.getSelectedFile();

            try {
                //File out_file = new File(file);
                BufferedWriter out = new BufferedWriter(new FileWriter(file));
                out.write(contents);
                out.flush();
                out.close();
            } catch(IOException e) {
                messageUtilities.errorMessage("There was an error saving your file. IOException was thrown.", "File Error");
            }
        }

        else {
            // Do nothing
            System.out.println("The user choose not to save anything");
        }
}

4 个答案:

答案 0 :(得分:4)

取决于你如何构造你的字符串,你可能只是遇到一个行结束问题。记事本不支持unix行结尾(仅限\ n)它仅支持窗口行结尾(\ n \ r)。尝试使用更强大的编辑器打开保存的文件,和/或确保为平台使用正确的行结尾。 java的系统属性(System.getProperty(“line.separator”))将为您运行代码的平台提供正确的行结尾。

当您构建要保存到文件的字符串时,而不是为行结尾明确指定“\ n”或“\ n \ r”(或在mac“\ r \ n”上),而是附加该系统属性的值。

像这样:

String eol = System.getProperty("line.separator");

... somewhere else in your code ...

String texttosave = "Here is a line of text." + eol;

... more code.. optionally adding lines of text .....
// call your save file method
saveFile(texttosave);

答案 1 :(得分:0)

是的,因为之前的回答提到了System.getProperty(“line.seperator”)。

你的代码没有显示你是如何创建String内容但是因为你说你是java的新手我想我会提到在java中连接字符串并不好,因为它创建了一个。如果您通过这样做构建String:

String contents = ""
contents = contents + "sometext" + "some more text\n"

然后考虑使用java.lang.StrinBuilder

StringBuilder strBuilder = new StringBuilder();
strBuilder.append("sometext").append("somre more text\n");
...
String contents = strBuilder.toString();

另一种选择是流式传输您计划写入文件的内容,而不是构建一个大字符串然后输出它。

答案 2 :(得分:0)

您可以添加以下内容:

contents = contents.replaceAll("\\n","\\n\\r");

如果记事本无法正确显示。但是,您可能会遇到另一个问题:在每次保存/加载时,您将获得多个\ r \ n字符。然后为了避免在加载时你必须调用上面相同的代码,但使用反向参数。这只是一个丑陋的解决方案,只是为了让文本在记事本中正确显示。

答案 3 :(得分:0)

我的朋友也有同样的问题,经过深思熟虑和研究,我甚至找到了解决方案。

您可以使用ArrayList将TextArea的所有内容作为例子,并通过调用save作为参数发送,因为编写器只是写了字符串行,然后我们逐行使用“for”来编写我们的ArrayList最后我们将在txt文件中内容TextArea。 如果事情没有意义,我很抱歉谷歌翻译和我不会说英语。

观看Windows记事本,它并不总是跳线,并在一行中显示所有内容,使用Wordpad确定。


private void SaveActionPerformed(java.awt.event.ActionEvent evt){

    String NameFile = Name.getText();
    ArrayList< String > Text = new ArrayList< String >();

    Text.add(TextArea.getText());

    SaveFile(NameFile, Text);
} 

public void SaveFile(String name,ArrayList&lt; String&gt; message){

    path = "C:\\Users\\Paulo Brito\\Desktop\\" + name + ".txt";

    File file1 = new File(path);

    try {

        if (!file1.exists()) {

            file1.createNewFile();
        }


        File[] files = file1.listFiles();


        FileWriter fw = new FileWriter(file1, true);

        BufferedWriter bw = new BufferedWriter(fw);

        for (int i = 0; i < message.size(); i++) {

            bw.write(message.get(i));
            bw.newLine();
        }

        bw.close();
        fw.close();

        FileReader fr = new FileReader(file1);

        BufferedReader br = new BufferedReader(fr);

        fw = new FileWriter(file1, true);

        bw = new BufferedWriter(fw);

        while (br.ready()) {

            String line = br.readLine();

            System.out.println(line);

            bw.write(line);
            bw.newLine();

        }
        br.close();
        fr.close();

    } catch (IOException ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, "Error in" + ex);        
}