package com.txt;
import java.awt.*;
import java.io.*;
import java.awt.event.*;import javax.swing.*;public class NotPad extends JFrame implements ActionListener
{
//定义需要的SWING组件
JTextArea jta=null;

    //定义菜单条
    JMenuBar jmb=null;
    
    //定义第一级JMenu
    JMenu   jm1=null;
    
    //定义二级JMenuItem
    JMenuItem jmi1=null;
    JMenuItem jmi2=null;
public static void main(String[] args)
{
NotPad np=new NotPad();
}
//构造函数(初始化任务)
public NotPad()
{
//创建JTA
jta=new JTextArea();
//创建菜单条
jmb=new JMenuBar();
//创建一级JMenu
jm1=new JMenu("文件");
//设置助记符
jm1.setMnemonic('F');
//创建二级JMenuItem
jmi1=new JMenuItem("打开(0)",new ImageIcon("open.jpg"));

//注册监听
jmi1.addActionListener(this);
jmi1.setActionCommand("open");

jmi2=new JMenuItem("保存(s)");
//注册监听
jmi2.addActionListener(this);
jmi2.setActionCommand("save");

//放入到JFrame
this.add(jta);   //默认正中全占   BORDER布局

//加入  Jta
this.setJMenuBar(jmb);
//把JMenu加入  JMenuBar  一级
jmb.add(jm1);
//把JMenuItem放入JMenu
jm1.add(jmi1);
jm1.add(jmi2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭就退出
this.setSize(400,300);
this.setVisible(true);

}

public void actionPerformed(ActionEvent e) 
{
//判断是那个菜单被选中
if(e.getActionCommand().equals("open"))
{
//System.out.println("open");
//JFileChooser
//创建一个文件选择(组件)对象
JFileChooser jfc1=new JFileChooser();
jfc1.setDialogTitle("请选择文件...");
//默认方式
jfc1.showOpenDialog(null);
//显示
jfc1.setVisible(true);

//得到用户选择的文件全路径
String filename=jfc1.getSelectedFile().getAbsolutePath();
//System.out.println(filename);
FileReader fr=null;
BufferedReader br=null;
try 
{
fr=new FileReader(filename) ;
br=new BufferedReader(fr);

//从文件中读取信息并显示到ita
String s="";
String allCon="";
while ((s=br.readLine())!=null)
{

allCon+=s+"\r\n";

}
//放到JTA
jta.setText(allCon);

} catch (Exception e2) 
{
// TODO: handle exception
e2.printStackTrace();

}
finally

{
try {
br.close();
fr.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
else if (e.getActionCommand().equals("save")) 
{
//出现保存对话框
JFileChooser jfc=new JFileChooser();
jfc.setDialogTitle("另存为...");
//默认方式显示
jfc.showSaveDialog(null);
jfc.setVisible(true);

//得到用户希望把文件保存到何处,文件全路径
String file=jfc.getSelectedFile().getAbsolutePath();

//准备写入到指定文件
FileWriter fw=null;
BufferedWriter bw=null;
try {
fw=new FileWriter(file);
bw=new BufferedWriter(fw);

bw.write(this.jta.getText());  //优化用字符串数组

} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
finally
{
try {
fw.close();
bw.close();

} catch (Exception e3) {
// TODO: handle exception
e3.printStackTrace();
}
}



}
}}

解决方案 »

  1.   

    你处理保存时候的流操作顺序有问题,应该是先关闭bw然后关闭fw
    你这个软件还有其他的问题,不过现在是能正常保存文件了
    import java.awt.*;
    import java.io.*;
    import java.awt.event.*;import javax.swing.*;public class NotePad extends JFrame implements ActionListener
    {
        //定义需要的SWING组件
        JTextArea jta=null;    //定义菜单条
        JMenuBar jmb=null;    //定义第一级JMenu
        JMenu jm1=null;    //定义二级JMenuItem
        JMenuItem jmi1=null;
        JMenuItem jmi2=null;
        public static void main(String[] args)
        {
            NotePad np=new NotePad();
        }
        //构造函数(初始化任务)
        public NotePad()
        {
    //创建JTA
            jta=new JTextArea();
    //创建菜单条
            jmb=new JMenuBar();
    //创建一级JMenu
            jm1=new JMenu("文件");
    //设置助记符
            jm1.setMnemonic('F');
    //创建二级JMenuItem
            jmi1=new JMenuItem("打开(0)",new ImageIcon("open.jpg"));//注册监听
            jmi1.addActionListener(this);
            jmi1.setActionCommand("open");        jmi2=new JMenuItem("保存(s)");
    //注册监听
            jmi2.addActionListener(this);
            jmi2.setActionCommand("save");//放入到JFrame
            this.add(jta); //默认正中全占 BORDER布局//加入 Jta
            this.setJMenuBar(jmb);
    //把JMenu加入 JMenuBar 一级
            jmb.add(jm1);
    //把JMenuItem放入JMenu
            jm1.add(jmi1);
            jm1.add(jmi2);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭就退出
            this.setSize(400,300);
            this.setVisible(true);    }    public void actionPerformed(ActionEvent e)
        {
    //判断是那个菜单被选中
            if(e.getActionCommand().equals("open"))
            {
    //System.out.println("open");
    //JFileChooser
    //创建一个文件选择(组件)对象
                JFileChooser jfc1=new JFileChooser();
                jfc1.setDialogTitle("请选择文件...");
    //默认方式
                jfc1.showOpenDialog(null);
    //显示
                jfc1.setVisible(true);//得到用户选择的文件全路径
                String filename=jfc1.getSelectedFile().getAbsolutePath();
    //System.out.println(filename);
                FileReader fr=null;
                BufferedReader br=null;
                try
                {
                    fr=new FileReader(filename) ;
                    br=new BufferedReader(fr);//从文件中读取信息并显示到ita
                    String s="";
                    String allCon="";
                    while ((s=br.readLine())!=null)
                    {                    allCon+=s+"\r\n";                }
    //放到JTA
                    jta.setText(allCon);            } catch (Exception e2)
                {
    // TODO: handle exception
                    e2.printStackTrace();            }
                finally            {
                    try {
                        br.close();
                        fr.close();
                    } catch (Exception e2) {
    // TODO: handle exception
                        e2.printStackTrace();
                    }
                }
            }
            else if (e.getActionCommand().equals("save"))
            {
    //出现保存对话框
                JFileChooser jfc=new JFileChooser();
                jfc.setDialogTitle("另存为...");
    //默认方式显示
                jfc.showSaveDialog(null);
                jfc.setVisible(true);//得到用户希望把文件保存到何处,文件全路径
                String file=jfc.getSelectedFile().getAbsolutePath();//准备写入到指定文件
                FileWriter fw=null;
                BufferedWriter bw=null;
                try {
                    fw=new FileWriter(file);
                    bw=new BufferedWriter(fw);                bw.write(this.jta.getText()); //优化用字符串数组            } catch (Exception e2) {
                    // TODO: handle exception
                    e2.printStackTrace();
                }
                finally
                {
                    try {
    //                    fw.close();  流关闭的顺序有问题,
                        bw.close();
                        fw.close();                } catch (Exception e3) {
                        // TODO: handle exception
                        e3.printStackTrace();
                    }
                }        }
        }}
      

  2.   

    哦。关闭顺序有问题。
    两种方案。要么,关闭前,先将缓冲区flush一下。
    要么,先关闭缓冲区,在关闭Writer。包装器模式,
    先创建的对象,后关闭;后创建的对象,先关闭。
      

  3.   

    为什么不使用 javax.swing.text.DefaultEditorKit 类提供的read、write方法。DefaultEditorKit kit = new DefaultEditorKit();//从文件载入
    jta.setText("");
    kit.read(new FileReader(file), jta.getDocument(),0);//保存到文件
    kit.write(new FileWriter(file),jta.getDocument(),0,jta.getDocument().getLength());
      

  4.   

    直接关闭外面的BufferedWriter即可。根本不用保留fw句柄。所有的IO操作,都一样,只需要保留最外面那个Reader/Writer/InputStream/OutputStream对象,关闭它,它会递归自动调用内部对象的close方法。你因为东西太少,写入bw的东西还在内存里面
    finally
    {
    try {
    fw.close(); 先关了底层的文件流,此时,内容还在bw的缓冲byte[]中
    bw.close(); bw关闭的时候,要把byte[]写入fw中,发现fw已经被关闭了,导致出错,内容也一并丢失
    } catch (Exception e3) {
    // TODO: handle exception
    e3.printStackTrace();
    }
    }
      

  5.   

    看到标题首先想到的是 是不是确实个flush