【问题标题】:Cannot write a text in a text file using FileWriter and Printwriter无法使用 FileWriter 和 Printwriter 在文本文件中写入文本
【发布时间】:2014-11-12 13:54:48
【问题描述】:

我想创建一个更像记事本的程序。当您在JTextArea 中键入文本并单击另存为 时,程序将在工作区中创建一个文本文件,其中包含在JTextArea 中键入的文本。问题是当我单击保存时,程序可以创建一个文本文件,但是在 textarea 中键入的文本没有保存在创建的文本文件中。文本文件的名称是"Text"。我使用getText() 方法来获取TextArea 中的文本。

这是程序:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;    
public class TextAreaWithMenus extends JFrame implements ActionListener {
    JTextArea area;
    JMenuBar menubar;
    JMenu option;
    JMenuItem menuitem;
    File file;
    FileWriter fwriter;
    PrintWriter pwriter;
    String order[] = {"Save as","Edit"};

    public TextAreaWithMenus() {
        setSize(new Dimension(500,500));
        setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        setLayout(null);
        area = new JTextArea();
        menubar = new JMenuBar();
        option = new JMenu("File");
        for(String call : order) {
            menuitem = new JMenuItem(call);
            option.add(menuitem);
            menuitem.addActionListener(this);
        }
        this.add(menubar);
        menubar.setBounds(0,0,500,30);
        menubar.add(option);
        this.add(area);
        area.setBounds(0,30,500,470);
        area.setLineWrap(true);
        area.setWrapStyleWord(true);
        try{
            file = new File("C://Users/LunaWorkspace/TestProject/src/Text");
            fwriter = new FileWriter(file);
            pwriter = new PrintWriter(fwriter,true);
        }catch(Exception e) {}          
        setVisible(true);
    }//END OF CONSTRUCTOR

    public void save() {
        try {   
            if(!file.exists()) {
                try {
                    file.createNewFile();
                    pwriter.print(area.getText());
                    System.out.println(area.getText());
                    System.out.println("Saved complete");
                }catch(Exception ef) {
                    ef.printStackTrace();
                    System.err.print("Cannot Create");
                }                   
            }else if(file.exists()) {   
                    pwriter.print(area.getText());
                    System.out.println(area.getText());
                    System.out.println("Overwrite complete");   
            }
        } catch(Exception exp) {
            exp.printStackTrace();
            System.err.println("Cannot Save");
        }       
    }

    public void actionPerformed(ActionEvent ac) {
        String act = ac.getActionCommand();         
        if(act.equals("Save as")) {
            save();
        }else if(act.equals("Edit")) {}
    }

    public static void main (String args[]) {
        EventQueue.invokeLater(new Runnable() {
                               public void run() { new TextAreaWithMenus();} });
    }
}

【问题讨论】:

    标签: java jtextarea filewriter printwriter


    【解决方案1】:

    你需要调用flush,因为保存正在被缓冲。这有效:

    public void save() {
        try {
            if (!file.exists()) {
                try {
                    file.createNewFile();
                    pwriter.print(area.getText());
                    System.out.println(area.getText());
                    System.out.println("Saved complete");
    
                } catch (Exception ef) {
                    ef.printStackTrace();
                    System.err.print("Cannot Create");
                }
    
            } else if (file.exists()) {
                pwriter.print(area.getText());
                System.out.println(area.getText());
                System.out.println("Overwrite complete");
            }
        } catch (Exception exp) {
            exp.printStackTrace();
            System.err.println("Cannot Save");
        } finally {
            pwriter.flush();
        }
    }
    

    【讨论】:

    • 谢谢。 pwriter.flush() 方法和 pwriter.close() 有什么区别?我刚刚注意到,当我尝试 close() 方法时,似乎我必须再次重新运行程序才能用文本文件中的一组新文本覆盖文本。
    • flush 刷新缓冲区,close 首先调用刷新然后释放资源让它们被垃圾回收。然后,您不能重用已关闭的东西,因为它会拒绝而不是抛出空指针异常,因为它会擦除其内部状态以回收内存。 File 具有操作系统的本机文件句柄。当您调用 close 时,jvm 会关闭该句柄以让操作系统释放该资源。操作系统允许进程保持打开的文件数量是有限的,这就是为什么如果你完成了文件应该调用close。
    【解决方案2】:

    您应该在完成后使用pwriter.close() 关闭您的Writer。否则文本可能没有被刷新,并且不会写入任何内容。

    【讨论】:

      【解决方案3】:

      在构造函数中创建写入器并在保存方法中重复写入它不是一个好习惯。创建一个新文件并写入旧流可能会导致意外行为。

      在 save 方法中打开、写入和关闭流/写入器。

      那么就不需要检查文件是否已经存在了。 new FileWriter(file) 将覆盖现有文件。

      【讨论】:

        猜你喜欢
        • 2016-10-20
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        相关资源
        最近更新 更多