教你用Java GUI实现文本文件的读写

论坛 期权论坛 脚本     
niminba   2021-5-24 06:04   1781   0

一、实验题目

在这里插入图片描述

二、分析

实验要求为:

  • 实现一个界面,界面中包含一个文本显示区和两个按钮(存档和读档)
  • 读档按钮作用是打开文件并读取内容,将内容显示在文本区中
  • 存档按钮作用是将文本区的内容写入到文件中。

简单分析一下,可以看出这样的要求奥,包含的要考察知识点主要有两个方向:

  • GUI绘制界面并添加事件
  • 使用IO流对象对文件进行读写

好的小伙伴们,废话不多说,下面就来的实现它。

三、实现

首先,让我们创建一个GUI界面,先秉持着一切从简的设计思想,预计它长这样:

在这里插入图片描述

这样的布局方式,我们可以选择采用流布局实现,在容器中直接放入文本显示区和两个按钮,适当调整窗口大小即可实现:

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GUIDemo extends JFrame{

 //三个组件
 private JButton saveButton;
 private JButton loadButton;
 private TextArea textArea;
 
 //容器
 private Container container;
 
 public GUIDemo() {
  //设置title
  super("File Demo");
  
  //设置流布局
  setLayout(new FlowLayout());
  
  //获取容器
  container = getContentPane();
  
  //三个组件
  textArea = new TextArea();
  saveButton = new JButton("save");
  loadButton = new JButton("load");
  
  //保存文件按钮点击事件
  saveButton.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    
    System.out.println("存档成功");
   }
  });
  
  //读入文件按钮点击事件
  loadButton.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    
    System.out.println("读档成功");
   }
  });
  
  //装填三个组件
  container.add(textArea);
  container.add(loadButton);
  container.add(saveButton);
  
  //调整大小
  setSize(500, 300);
  //显示
  setVisible(true);
 }
 
 public static void main(String[] args) {
  GUIDemo demo = new GUIDemo();
  demo.setDefaultCloseOperation(EXIT_ON_CLOSE);
 }
}

代码的含义都在注释里面,就不啰嗦讲解了。

跑起来是这个样子:

在这里插入图片描述

点击两下按钮测试点击事件,控制台输出:

在这里插入图片描述

好的,GUI界面设计完毕,下面来为两个按钮编写点击事件。

首先要解决的一个问题是“目标文件”。由于题目中没有提到目标文件是否需要从文件系统中选取产生,那么我们不妨暂时将目标文件地址直接在代码中,令private static final String TARGET_FILE= "./temp.txt";

在这里插入图片描述

那么在初始化页面时就应该先创建这个文件路径对应的file对象:

//目标文件
 private File targetFile;
...
//创建目标文件对象
 targetFile = new File(TARGET_FILE);
 if(targetFile.createNewFile()) {
  System.out.println("文件不存在,创建成功");
 }else {
  System.out.println("文件存在");
 }

这里需要注意几个问题:

1.创建目标文件需要使用createNewFile()方法,而非mkdir()方法。否则会创建成为文件夹而非文件

2.createNewFile()方法会抛出一个IOException,为了便于处理,这里直接选择将异常从构造方法和主方法中抛出;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

处理好目标文件问题,两次启动程序,可以看到控制台输出:

在这里插入图片描述
在这里插入图片描述

哦吼,文件处理成功。

接着,就是在为两个按钮添加点击事件。在下面的处理中,对于IO流的选择,我们统一选择字符流.

首先是读档按钮,它的点击事件逻辑大致为:

1.创建目标文件的输入字符流

2.从输入流中读取文件中的内容并形成结果

3.关闭输入流

4.将读入的结果显示在文本显示区中

实现成为代码:

//读入文件按钮点击事件
loadButton.addActionListener(new ActionListener() {
 
 @Override
 public void actionPerformed(ActionEvent e) {
  
  try {
   //字符读入流
   FileReader reader = new FileReader(targetFile);
   
   //读入缓冲区
   char[] buffer = new char[1024];
   
   //读入结果
   StringBuffer result = new StringBuffer();
   
   //每次读入缓冲区的长度
   int len;
   
   //从读入流中读取文件内容并形成结果
   while((len = reader.read(buffer)) != -1) {
    result.append(buffer,0,len);
   }
   
   //关闭读入流
   reader.close();
   
   //更新文本显示区内容
   textArea.setText(result.toString());
   
   System.out.println("读档成功");
  } catch (FileNotFoundException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

 }
});

在目标文件中写下Hello World!!,运行程序,点击load:

在这里插入图片描述

nice~~

好的,接下来就剩下最后一项任务了,完成存档!

存档按钮的点击事件应该为:

1.打开目标文件字符输出流

2.获取当前文本显示区的内容

3.将文本显示区的内容通过输出流写入文件

4.关闭输出流

5.清空文本显示区

哦吼,最后一条是我加上去的,其实不清空也可以。

代码实现如下:

//保存文件按钮点击事件
saveButton.addActionListener(new ActionListener() {
 
 @Override
 public void actionPerformed(ActionEvent e) {
  
  try {
   //打开文件字符输出流
   FileWriter writer = new FileWriter(targetFile);
  
   //获取文本显示区文本
   String result = textArea.getText();
   
   //写入文件
   writer.write(result);
   
   //关闭输出流
   writer.close();
   
   //清空文本显示区内容
   textArea.setText("");
   
   System.out.println("存档成功");
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
 }
});

在文本显示区中输入Hello Java!!,点击save:

在这里插入图片描述

啥?你说文本框里面啥也没有?对,因为最后把内容清空了!

四、全部代码

好了,实现了上面的全部功能,最后把代码汇总在这里:

(谨慎抄袭哦)

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GUIDemo extends JFrame{

 private static final String TARGET_FILE = "./temp.txt";
 
 //三个组件
 private JButton saveButton;
 private JButton loadButton;
 private TextArea textArea;
 
 //容器
 private Container container;
 
 //目标文件
 private File targetFile;
 
 public GUIDemo() throws IOException {
  //设置title
  super("File Demo");
  
  //设置流布局
  setLayout(new FlowLayout());
  
  //获取容器
  container = getContentPane();
  
  //创建目标文件对象
  targetFile = new File(TARGET_FILE);
  if(targetFile.createNewFile()) {
   System.out.println("文件不存在,创建成功");
  }else {
   System.out.println("文件存在");
  }
  
  //三个组件
  textArea = new TextArea();
  saveButton = new JButton("save");
  loadButton = new JButton("load");
  
  //保存文件按钮点击事件
  saveButton.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    
    try {
     //打开文件字符输出流
     FileWriter writer = new FileWriter(targetFile);
    
     //获取文本显示区文本
     String result = textArea.getText();
     
     //写入文件
     writer.write(result);
     
     //关闭输出流
     writer.close();
     
     //清空文本显示区内容
     textArea.setText("");
     
     System.out.println("存档成功");
    } catch (IOException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
   }
  });
  
  //读入文件按钮点击事件
  loadButton.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    
    try {
     //字符读入流
     FileReader reader = new FileReader(targetFile);
     
     //读入缓冲区
     char[] buffer = new char[1024];
     
     //读入结果
     StringBuffer result = new StringBuffer();
     
     //每次读入缓冲区的长度
     int len;
     
     //从读入流中读取文件内容并形成结果
     while((len = reader.read(buffer)) != -1) {
      result.append(buffer,0,len);
     }
     
     //关闭读入流
     reader.close();
     
     //更新文本显示区内容
     textArea.setText(result.toString());
     
     System.out.println("读档成功");
    } catch (FileNotFoundException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    } catch (IOException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
    
    
   }
  });
  
  //装填三个组件
  container.add(textArea);
  container.add(loadButton);
  container.add(saveButton);
  
  //调整大小
  setSize(500, 300);
  //显示
  setVisible(true);
 }
 
 public static void main(String[] args) throws IOException {
  GUIDemo demo = new GUIDemo();
  demo.setDefaultCloseOperation(EXIT_ON_CLOSE);
 }
}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP