通过使用Java的Swing、IO来实现一个简单记事本,实现打开指定的text文本文件,然后将text文件的内容加载到Swing组件中,然后在Swing组件中编辑记事本内容,然后同菜单的保存选项将编辑后的内容保存到text文件中(使用AWT实现简单记事本)。代码如下:
import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; import java.awt.*; import java.awt.event.*; import javax.swing.JOptionPane; /** * 功能:简单记事本 * 2011-12-25 */ public class SimpleNotepad implements ActionListener{ private Frame frame; private FileDialog fd_load; private FileDialog fd_save; private TextArea ta; private String file = ""; private MenuItem save; private RandomAccessFile raf; private FileChannel fci; private FileLock flock; private CharsetEncoder encoder; private CharsetDecoder decoder; public static void main( String args[]) { new SimpleNotepad().init(); } public void init(){ frame = new Frame("My Notepad"); MenuBar mb = new MenuBar(); Menu file = new Menu("文件"); Menu help = new Menu("帮助"); MenuItem open = new MenuItem("打开"); save = new MenuItem("保存"); save.setEnabled(false); file.add(open); file.add(save); mb.add(file); mb.add(help); frame.setMenuBar(mb); ta = new TextArea(); frame.add(ta,"Center"); open.addActionListener(this); save.addActionListener(this); frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); frame.setSize(600,400); frame.setLocation(300,100); frame.setVisible( true); fd_load = new FileDialog(frame,"打开文件",FileDialog.LOAD); fd_save = new FileDialog(frame,"保存文件",FileDialog.SAVE); Charset charset = Charset.forName(System.getProperty("file.encoding")); encoder = charset.newEncoder(); decoder = charset.newDecoder(); } public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); if(s.equals("打开")){ fd_load.setVisible(true); String d = fd_load.getDirectory(); String f = fd_load.getFile(); if((d != null) && (f != null)){ String destfile = d + f; if(destfile.equals(file)){ return; }else{ this.closeFile(); file = destfile; this.loadFile(); } } }else if(s.equals("保存")){ this.saveFile(); } } public void loadFile(){ try{ raf = new RandomAccessFile(file,"rw"); fci = raf.getChannel(); flock = fci.tryLock(); if(flock == null){ ta.setText(""); JOptionPane.showMessageDialog(null, "文件正在使用中,无法以独占的方式打开!", "错误提示", JOptionPane.ERROR_MESSAGE); file = ""; raf.close(); raf = null; }else{ int length = (int)fci.size(); ByteBuffer bb = ByteBuffer.allocate(length); fci.read(bb); bb.flip(); CharBuffer cb = decoder.decode(bb); ta.setText(cb.toString()); frame.setTitle("My Notepad - " + file); save.setEnabled(true); } }catch(IOException e){ e.printStackTrace(); } } public void saveFile(){ String content = ta.getText(); try{ CharBuffer cb = CharBuffer.wrap(content.toCharArray()); ByteBuffer bb = encoder.encode(cb); raf.setLength(0); fci.write(bb); fci.force(true); }catch(IOException e){ e.printStackTrace(); } } public void closeFile(){ try{ if(flock != null){ flock.release(); } if(raf != null){ raf.close(); } file = ""; frame.setTitle("My Notepad"); save.setEnabled(false); }catch(IOException e){ e.printStackTrace(); } } }
效果图: