如何在从JTextArea获取文本的文档中保存文件时修复新行

时间:2015-11-24 14:25:48

标签: java swing newline jtextarea jfilechooser

import java.awt.BorderLayout;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Formatter;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class FileDemonstrationJFileChooser extends JFrame {
    private JTextArea outputArea;
    private JScrollPane scrollPane;
    JFileChooser fileChooser = new JFileChooser();

    public FileDemonstrationJFileChooser() {
        // TODO Auto-generated constructor stub
        super("Testing class file");
        outputArea = new JTextArea();
        scrollPane = new JScrollPane(outputArea);
        add(scrollPane, BorderLayout.CENTER);
        setSize(400, 400);
        setVisible(true);

        analyzePath();

        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            // save to file
            String toSave = outputArea.getText();
            try {
                Formatter writer = new Formatter( new File(file+".txt"));
                writer.format(toSave); //Problems here occurs
                writer.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            JOptionPane.showMessageDialog(this,
                    "Message saved.(" + file.getName() + ")", "File Saved",
                    JOptionPane.INFORMATION_MESSAGE);

        }
    }

    private File getFileOrDirectory() {

        fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        int result = fileChooser.showOpenDialog(null);
        if (result == JFileChooser.CANCEL_OPTION) {
            System.exit(1);
        }
        File fileName = fileChooser.getSelectedFile();
        if ((fileName == null) || (fileName.getName().equals(""))) {
            JOptionPane.showMessageDialog(this, "Invalid name", "Invalid name",
                    JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
        return fileName;
    }

    private void analyzePath() {
        File name = getFileOrDirectory();
        if (name.exists()) {
            outputArea.setText(String.format(
                    "%s%s\n%s\n%s\n%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s", name
                            .getName(), " exists", (name.isFile() ? "is a file"
                            : "is not a file"),
                    (name.isDirectory() ? "is a directory"
                            : "is not a directory"),
                    (name.isAbsolute() ? "is absolute path"
                            : "is not absolute path"), "Last modified: ", name
                            .lastModified(), "Length: ", name.length(),
                    "Path: ", name.getPath(), "Absolute path: ", name
                            .getAbsolutePath(), "Parent: ", name.getParent()));

            if (name.isDirectory()) {
                String[] directory = name.list();
                outputArea.append("\n\nDirectory contents:\n");

                for (String directoryName : directory) {
                    outputArea.append(directoryName + "\n");
                }
            }
        } else {
            JOptionPane.showMessageDialog(this, name + " does not exist.",
                    "Error", JOptionPane.ERROR_MESSAGE);
        }

    }
}

我的代码在JFileChooser的文件中写入并保存在硬盘中。但是在将其写入文件时会出现问题,它不会占用新行。它将整个文本区域的文本保存在一行中。如何解决?

这里,当我保存文件时,它将其内容保存在Just ONE LINE中,与JTextArea中的内容不同。也就是说,新行不会出现。它将所有内容保存在一行中。那么我该如何解决呢?

4 个答案:

答案 0 :(得分:4)

Document只会存储" \ n"代表换行符。根据您使用的文本组件,getText()方法将替换" \ n"使用适合您平台的换行符(JTextPane)或离开" \ n"在文本中(JTextArea)。查看Text and New Lines了解详情。

不要使用Formatter来编写文本。格式化程序不知道文本来自何处。

只需使用write()提供的JTextArea方法:

FileWriter writer = new FileWriter( new File(...) );
BufferedWriter bw = new BufferedWriter( writer );
textArea.write( bw );
bw.close();

write()方法知道如何处理行尾字符串。

答案 1 :(得分:2)

请勿使用\n,而是使用自Java 7以来可用的System.getProperty("line.separator")System#lineSeparator来获取依赖于平台的正确行分隔符(Windows,* nix)。< / p>

答案 2 :(得分:0)

"\n"适用于控制台输出但不适用于文件。 使用"\r\n"(适用于Windows)然后保存它应该做的。

答案 3 :(得分:0)

使用\r\n轻松插入换行符是Windows回车。所以这只适用于Windows。你可以检查你的运行,然后硬编码每个操作系统的回车,如windows,linux,....

但坚持另一种更容易的方式。只需将System.getProperty("line.separator")附加到您的文件的字符串上,它就会自动为您的操作系统附加回车。

希望有所帮助!