java IO 经典实例入门

本文介绍了一个使用Java实现的简易文本编辑器,该编辑器具备基本的文件操作功能,如新建、打开、保存及编辑文本等。通过实例代码展示了如何构建菜单栏、工具条,并实现剪切、复制、粘贴等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContractedBlock.gifExpandedBlockStart.gifCode
import java.lang.*;//默认导入,意思是导入java.lang包下的所有类,不能用java.lang;的方式。
import java.awt.*;
import java.io.*;
import java.awt.datatransfer.*;//数据流传输包?包括剪贴板、字符串发送器等。
import java.awt.event.*;
//extends Frame与javax.swing.JFrame;的区别是什么呢?
public class EditorFrame extends Frame implements ActionListener {
   TextArea textArea 
= new TextArea();
   MenuBar menuBar 
= new MenuBar();//菜单工具条
   Menu fileMenu = new Menu("File");//菜单大项
   MenuItem newItem = new MenuItem("New");//菜单小项,如何对应到大项呢?
   MenuItem openItem = new MenuItem("Open");
   MenuItem saveItem 
= new MenuItem("Save");
   MenuItem saveAsItem 
= new MenuItem("Save As");
   MenuItem exitItem 
= new MenuItem("Exit");
   Menu editMenu 
= new Menu("Edit");
   MenuItem selectItem 
= new MenuItem("Select All");
   MenuItem copyItem 
= new MenuItem("Copy");
   MenuItem cutItem 
= new MenuItem("Cut");
   MenuItem pasteItem 
= new MenuItem("Paste");
   String fileName 
= null;
   Toolkit toolKit
=Toolkit.getDefaultToolkit();//这是什么组件呢?java.awt.Toolkit;
   Clipboard clipBoard=toolKit.getSystemClipboard();//剪贴板组件java.awt.datatransfer.Clipboard;
   
//打开与保存文件对话框,参数:this,"标题",文件对话框类型
    private FileDialog openFileDialog= new FileDialog(this,"Open File",FileDialog.LOAD);
    
private FileDialog saveAsFileDialog= new FileDialog(this,"Save File As",FileDialog.SAVE);

    
//构造函数初始化
  public EditorFrame(){
    setTitle(
"NotePad");//Frame.setTitle("");
    setFont(new Font("Times New Roman",Font.PLAIN,12));//设置字体时,需要新建一种字体
    setBackground(Color.white);//设置颜色的参数:Color.white
    setSize(400,300);
    fileMenu.add(newItem);
//把菜单小项添加到大项
    fileMenu.add(openItem);
    fileMenu.addSeparator();
    fileMenu.add(saveItem);
    fileMenu.add(saveAsItem);
    fileMenu.addSeparator();
    fileMenu.add(exitItem);
    editMenu.add(selectItem);
    editMenu.addSeparator();
    editMenu.add(copyItem);
    editMenu.add(cutItem);
    editMenu.add(pasteItem);
    menuBar.add(fileMenu);
//在工具条上添加菜单大项
    menuBar.add(editMenu);
    setMenuBar(menuBar);
//Frame.setMenuBar(menuBar);在窗体上添加工具条
    add(textArea);
    
//为窗体添加事件代码,参数?事件代码?为什么只添加了关闭代码,没有最小化、最大化?默认自动实现?
    addWindowListener(new WindowAdapter(){
                      
public void windowClosing(WindowEvent e){
                          System.exit(
0);
                        }
                      });
    newItem.addActionListener(
this);
    openItem.addActionListener(
this);
    saveItem.addActionListener(
this);
    saveAsItem.addActionListener(
this);
    exitItem.addActionListener(
this);
    selectItem.addActionListener(
this);
    copyItem.addActionListener(
this);
    cutItem.addActionListener(
this);
    pasteItem.addActionListener(
this);
  }
  
//actionPerformed的参数ActionEvent是用来收集组件事件的。
  public void actionPerformed(ActionEvent e) {
    Object eventSource 
= e.getSource();//Object类?可用来存储动作事件的事件源
    if(eventSource == newItem){
      textArea.setText(
"");
    }
else if(eventSource == openItem){
      openFileDialog.show();
//显示打开对话框
      fileName = openFileDialog.getDirectory()+openFileDialog.getFile();//存储目录与文件字符串
      if(fileName != null)
        readFile(fileName);
//读取文件方法
    }else if (eventSource == saveItem){
      
if(fileName != null)
        writeFile(fileName);
//存储文件方法
    }else if(eventSource == saveAsItem){
      saveAsFileDialog.show();
      fileName 
= saveAsFileDialog.getDirectory()+saveAsFileDialog.getFile();
      
if (fileName!= null)
        writeFile(fileName);
    }
else if(eventSource == selectItem){
       textArea.selectAll();
//全选的方法
    }else if(eventSource == copyItem){
       String text
=textArea.getSelectedText();//取得textArea所选取的字符
       
//java.awt.datatransfer.StringSelection把String转化成能被剪贴板使用的参数
       StringSelection selection=new StringSelection(text);
       clipBoard.setContents(selection,
null);//设置剪贴板的内容,参数?
    }else if(eventSource == cutItem){
       String text
=textArea.getSelectedText();
       StringSelection selection
=new StringSelection(text);
       clipBoard.setContents(selection,
null);
       
//剪贴的实现是用空字符串代替要剪贴的字符串,参数:Start()与End()
       textArea.replaceRange("",textArea.getSelectionStart(),textArea.getSelectionEnd());
    }
else if(eventSource == pasteItem){
       Transferable contents
=clipBoard.getContents(this);//this当前对象引用,Transferable能够传输的内容
       if(contents==nullreturn;
       String text;
       text
="";
       
try{
            text
=(String)contents.getTransferData(DataFlavor.stringFlavor);//取得文件传输数据,强制转化为String
        }catch(Exception exception){
        }
       textArea.replaceRange(text,textArea.getSelectionStart(),textArea.getSelectionEnd());
    }
else if(eventSource == exitItem){
      System.exit(
0);
    }
  }

 
  
public void readFile(String fileName){
    
try{
      File file 
= new File(fileName);//File类,参数为代路径的文件名
      FileReader readIn = new FileReader(file);//File内容读取类
      int size = (int)file.length();//取得文件长度
      int charsRead = 0;
      
char[] content = new char[size];//用字符数组存储文件内容
      while(readIn.ready())//准备好了?有意思。如果没有字符串了,就没有ready好
          
//readIn.read重载方法一种,把已取得的字符传递给数组。size - charsRead相差,未能理解参数意义!!!
        charsRead += readIn.read(content, charsRead, size - charsRead);
      readIn.close();
      textArea.setText(
new String(content, 0, charsRead));//String类的一种重载方法,(数组,起始,结束)
    }
    
catch(IOException e){
      System.out.println(
"Error opening file");
    }
  }

  
public void writeFile(String fileName){
    
try{
      File file 
= new File (fileName);
      FileWriter writeOut 
= new FileWriter(file);//姑且叫文件写入器吧
      writeOut.write(textArea.getText());//实现起来如此简单
      writeOut.close();
    }
    
catch(IOException e){
      System.out.println(
"Error writing file");
    }
  }
//比较好的编码结构,主函数很简练,调用其他。把主方法写在前面似乎更好。其他方法与主方法处于并列地位
    public static void main(String[] args){
      Frame frame 
= new EditorFrame();
      frame.show();
   }
}

转载于:https://www.cnblogs.com/greatverve/archive/2009/06/11/1501726.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值