热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

教你用JavaGUI实现文本文件的读写

今天带大家来学习怎么用JavaSwing实现实现文本文件读写,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下

一、实验题目

在这里插入图片描述

二、分析

实验要求为:

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

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

  • 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);
	}
}

推荐阅读
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 开发笔记:Docker 上安装启动 MySQL
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker上安装启动MySQL相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微信答题小程序的设计与实现详解
    本文详细介绍了如何设计和实现一个微信答题小程序,包括题库的设计和题目的呈现。通过抽取题目编号和使用全局变量记录当前题目的信息,实现了题目的刷新和显示。同时,还介绍了题目的展示方式和容器的创建。本文适合零基础的小白学习微信答题小程序的开发。 ... [详细]
author-avatar
中二丶夜夜
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有