中 南 财 经 政 法 大 学 武 汉 学 院
实 验 报 告
实验课名称:__ JAVA语言____
学生姓名:___ ____
专业班级:_ _网络工程1104
学号: 11071125__
开课时间:___20##年2月26日_
教务处 制
《Java程序设计基础》实验报告
实验序号:05 实验项目名称:异常处理
实验报告
实验项目二 Java异常处理及输入输出流技术实验
文本编辑器
一、实验目的
1. 理解和掌握字节流的类以及它们的使用特点;
2. 理解和区分字节流和字符流;
3. 了解和运用字节流和字符流进行文件复制。
二、实验内容
设计一个简单的文本编辑器,可以实现多文件处理、实现文件的创建、浏览、编辑(允许文件复制和修改)、对已经修改的文件可以进行保存或以另存的文件名称保存。
三、实验原理
Java输入输出流技术、AWT/Swing编程技术、事件处理技术等技术原理。
四、实验环境
主CPU 586以上,内存1G以上,操作系统Windows XP,eclipse。
五、实验步骤
1、创建一个TextEditor 项目
图 1 TextEditor 项目
2.创建一个TextEditor类
图 2 TextEditor类
3.补充代码。并在TextEditor类里输入相对应的代码:
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.*;
import java.io.*;
importjavax.swing.text.Document;
publicclassTextEditorextends JFrame{
JDesktopPane desktopPane;
//定义菜单组件
JMenuBar menuBar;
JMenu fileMenu,helpMenu;//定义文件菜单、帮助菜单
JMenuItem newItem,openItem,saveItem,othersaveItem,closeItem,exitItem;
//定义文件菜单的:新建菜单项、打开菜单项、保存菜单项、另存菜单项、关闭菜单项、//退出菜单项
JMenuItem aboutItem;//定义帮助菜单的:关于菜单项
StringBuffer buffer=new StringBuffer();//定义一个字符串缓冲区;
File currentFile;//当前处理的文件;
int status;//记录当前状态0:新建、1:打开、2:保存、3:另存;4:关闭;
DisplayFrame currentFrame;//当前打开的窗口
public TextEditor() {
super("文本编辑器");
Container container=getContentPane();
desktopPane=new JDesktopPane();
container.add(desktopPane);
createMenu();
setJMenuBar(menuBar);
}
publicvoid createMenu(){
//定义菜单条;
menuBar=new JMenuBar();
//定义文件菜单
fileMenu=new JMenu("文件");
//定义文件菜单的:新建菜单项、打开菜单项、保存菜单项、另存菜单项、关闭菜单
//退出菜单项
//定义新建菜单项
newItem=new JMenuItem("新建");
newItem.addActionListener(new NewFileListener());
//定义打开菜单项
openItem=new JMenuItem("打开");
openItem.addActionListener(new OpenFileListener());
saveItem=new JMenuItem("保存");
saveItem.addActionListener(new SaveFileListener());
othersaveItem=new JMenuItem("另存为");
othersaveItem.addActionListener(new OtherSaveFileListener());
closeItem=new JMenuItem("关闭");
closeItem.addActionListener(new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
if(e.getSource()==closeItem){
currentFrame.dispose();
}
}
});
exitItem=new JMenuItem("退出");
exitItem.addActionListener(new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
System.exit(0);
}
});
//添加菜单项到文件菜单中;
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.addSeparator();
fileMenu.add(saveItem);
fileMenu.add(othersaveItem);
fileMenu.addSeparator();
fileMenu.add(closeItem);
fileMenu.add(exitItem);
//定义帮助菜单
helpMenu=new JMenu("帮助");
//定义帮助菜单的:关于菜单项
aboutItem=new JMenuItem("关于");
aboutItem.addActionListener(new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
if(e.getSource()==aboutItem){
JOptionPane.showMessageDialog(null,"TextEditor 1.1",
"版本",JOptionPane.INFORMATION_MESSAGE);
}
}
});
//添加菜单项到帮助菜单中;
helpMenu.add(aboutItem);
//将文件菜单和帮助菜单加入到菜单条中;
menuBar.add(fileMenu);
menuBar.add(helpMenu);
}//end createMenu method;
public File chooseFile(int chooseMode){
//从选择文件对话框中选择文件,chooseMode为选择模式
//1:为文件打开对话框模式,2:为文件保存对话框模式;
JFileChooser filechooser=new JFileChooser();
filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result=0;
switch(chooseMode){
case 1:
result =filechooser.showOpenDialog(currentFrame); //代码1;
//按照文件打开对话框模式选择文件
break;
case 2:
result=filechooser.showSaveDialog(currentFrame); //代码2;
//按照文件保存对话框模式选择文件
break;
}
if(result==filechooser.CANCEL_OPTION) returnnull;
File fileName=filechooser.getSelectedFile(); //代码3;//从对话框中选择文件,赋值给fileName;
return fileName;//返回选定的文件;
}
publicvoid saveFile(File file,int saveMode) throws IOException{
//保存文件fileName,saveMode是保存文件模式:
//1:新建文件的保存;2:将修改的已有文件保存;
File fileName=null;
switch(saveMode){
case 0:fileName=chooseFile(2);
if(fileName.createNewFile()!=true) return;
break;
case 1:fileName=file;break;
default:return;
}
currentFile=fileName;
if(fileName.exists()!=true) return;//文件不存在,则返回;
BufferedWriter input=new BufferedWriter(new FileWriter (fileName)); //代码4;
//将文件fileName写入到字符缓冲写入器input中;
input.write(buffer.toString(),0,buffer.length()-1);
//将buffer字符串写入到字符缓冲写入器input中
System.err.println(buffer.length());
if(input!=null)
input.close();
status=1;
}
publicvoid showFile(File fileName,DisplayFrame contentFrame){
//将指定文件fileName的内容在窗口contentFrame内显示出来。
try{
BufferedReader output=new BufferedReader(new FileReader (fileName)); //代码5;
//将文件fileName读到字符缓冲读取器output中;
String text;
buffer=new StringBuffer();
while((text=output.readLine())!=null)//依次访问文件的每一行; // 代码6;
buffer.append(text+"\n"); //将每一行添加到buffer中;
contentFrame.displayArea.setText(buffer.toString());
//将buffer的字符串在contentFrame窗口中显示出来;
contentFrame.setTitle(fileName.getName());//改变窗口的标题;
output.close(); // 代码7;//关闭字符缓冲流output;
}
catch(IOException ex){
JOptionPane.showMessageDialog(null,"错误发生!");
}
catch(NullPointerException ex3){
JOptionPane.showMessageDialog(null,"警告!");
}
}
publicstaticvoid main(String[] args) {
TextEditor texteditor = new TextEditor();
texteditor.setSize(400,300);
texteditor.setVisible(true);
texteditor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}//end main
class NewFileListener implements ActionListener{
publicvoid actionPerformed(ActionEvent e){//新建
DisplayFrame txtFrame=new DisplayFrame();
currentFrame=txtFrame;
txtFrame.setTitle("新建文件");
desktopPane.add(txtFrame);
status=0;
}
}//end class newFileListener;
class OpenFileListener implements ActionListener{
publicvoid actionPerformed(ActionEvent e){//打开文件监视接口;
File fileName=chooseFile(1);//打开模式打开文件;
currentFile=fileName;
try{
if(fileName.exists()){
DisplayFrame contentFrame=new DisplayFrame();
currentFrame=contentFrame;
desktopPane.add(contentFrame);
showFile(fileName,contentFrame);
}//end if
status=1;
}catch(Exception ex){}
}//end actionPerformed
}//end class openFileListener;
class SaveFileListener implements ActionListener{
publicvoid actionPerformed(ActionEvent e){//保存处理
if (e.getSource() == saveItem) {
try {
saveFile(currentFile, status);
}
catch (IOException ex) {
JOptionPane.showMessageDialog(null, "保存文件失败!!!!");
}
catch(Exception ex){ }
}
}
}//end class SaveFileListener;
class OtherSaveFileListener implements ActionListener{
publicvoid actionPerformed(ActionEvent e){//另存处理;
if(e.getSource()==othersaveItem){
File fileName=chooseFile(2);
BufferedWriter output=null;
BufferedReader input=null;
try{
if(fileName.exists()!=true) fileName.createNewFile();
input = new BufferedReader(new FileReader(currentFile));
output = new BufferedWriter(new FileWriter(fileName));
String ch;
while ((ch=input.readLine())!=null) {
output.write(ch);
output.newLine();
}
input.close();
output.close();
currentFrame.dispose();//将源文件显示窗口关闭;
DisplayFrame contentFrame=new DisplayFrame();
desktopPane.add(contentFrame);//创建新的显示窗口;
currentFrame=contentFrame;//新窗口设置为当前显示窗口;
currentFile=fileName;
showFile(fileName,contentFrame);
//在窗口contentFrame中显示文件fileName;
}catch(IOException ex){
JOptionPane.showMessageDialog(null,"文件另存失败!!!!");
}
}//end outer if
}//end actionPerformed method;
}//end class OtherSaveListener;
classDisplayFrameextends JInternalFrame implements DocumentListener{
JTextArea displayArea;
public DisplayFrame() {
super("文本内容:", true, true, true, true);
displayArea = new JTextArea(8, 30);
displayArea.getDocument().addDocumentListener(this);
getContentPane().add(displayArea);
pack();
setVisible(true);
}
publicvoid insertUpdate(DocumentEvent e) {
buffer=new StringBuffer(displayArea.getText());
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
publicvoid removeUpdate(DocumentEvent e) {
buffer=new StringBuffer(displayArea.getText());
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
publicvoid changedUpdate(DocumentEvent e) {
//Plain text components don't fire these events.
}
}//end DisplayFrame.java
}//end class TextEditor.java
六、实验结果
运行可得如下实验结果:
图 3 结果1 图 4 新建文件
图 5 打开文件 图 6 保存文件
图 7 文件另存为 图 8 帮助文件
七、实验分析
7.1
程序中的类 SaveFileListener 和类 OtherSaveFileListener 的定义 。 它们都有处理保存文件数据的功能 , 问在具体实现上 , SaveFileListener 如果对已经保存的文件它,会直接保存;但OtherSaveFileListener每次都会重装打开一个窗口保存文件,并要在对话框里输入文件名。
7.2
在 OtherSaveFileListener 类中的 actionPerformed() 方法中有语句 :
output = new BufferedWriter(new FileWriter(fileName)); 如果将该语句改写成:
output = new BufferedWriter(new FileWriter(filename, true));
程序是否可以正常运行 , 如果不能正常运行 ,但改为:output = new BufferedWriter(new FileWriter(fileName, true));可以正常运行,文件名错了。
new FileWriter(fileName)在给出文件名的情况下构造一个 FileWriter 对象。new FileWriter(fileName, true)在给出文件名的情况下构造 FileWriter 对象,它具有指示是否挂起写入数据的 boolean 值。
7.3
在定义 OtherSaveFileListener 类的 actionPerformed() 方法中 , 采用了字符缓冲读写器 (BufferedReader 和 BufferedWriter), 来实现文件数据的读取和写入。如果在该方法中改用字节缓冲输入和输出流 (BufferedInputstream 和 BuferedOutputstream) 来实现文件数据的读取和写入 可以为:
input = new BufferedInputstream(new File(currentFile));
output = new BuferedOutputstream(new File(fileName));
7.4
如果程序中没有定义 BufferedReader 和 BufferedWriter 字符缓冲读写器 , 不可以通过 FileReader 和 FileWriter 文件读写器直接实现文件的读取和写入。 程序中字符缓冲读写器的作用是将外设送来的数据暂时以字符形式存放,以便处理器将它取走,提高程序的速度。
八、实验结论
通过本实验,我对实现多文件处理、实现文件的创建、浏览、编辑(允许文件复制和修改)、对已经修改的文件可以进行保存或以另存的文件名称保存有了深刻的了解。理解和掌握了字节流的类以及它们的使用特点、理解和区分字节流和字符流、了解和运用字节流和字符流进行文件复制。
字符流类字符流。Java 语言中 ,抽象类 java.io.Reader 和 java.io.Writer是基于字符的数据流的父类。类 Reader 是输入字符流 ,Writer 是输出字符流 , 它们可以处理 16 位的字符。它们的子类以及相应的继承关系根据功能可以分成两个类别 : 一个是只处理读取和写入的类 ;另一个是执行其他处理的类。
字节流类字节流。同 样 在 Java 语 言 中 , 字 节 流 有 两 大 基 本 类:抽 象 类 java.io.InputStream 和java.io.OutputStream, 它们是所有基于字节的数据流类的父类。类 InputStream 是输入字节流 ,OutputStream 是输出字节流 , 它们则处理 8 位的字节数据。它们的子类以及相应的继承关系根据功能可以分成两个类别 : 一个是只处理读取和写入的类 ; 另一个是可以执行其他处理的类。
异常情况报告制度为有效预防及时控制和处置安全生产工作中出现的突发事件切实保障职工人身和财产安全维护公司稳定确保良好的生产工作秩序减…
JAVA语言程序设计实验报告实验三实验题目:异常处理指导老师:卢照专业班级:计算机科学与技术系1106班姓名:李锋(20xx100…
实验四Java输入、输出和异常处理一、实验目的1.了解I/O流的使用;2.掌握常见的输入/输出流类及其主要方法。3.熟悉Syste…
实验报告计算机与信息工程学院实验中心学期20xx20xx课程名称Java程序设计实验班级信息1202姓名方逸梅学号12121002…
西安邮电大学计算机学院Java程序设计课内实验报告实验名称异常处理专业名称班级学生姓名1201学号8指导教师实验日期20xx年04…
数学与计算科学学院实验报告实验项目名称JAVA调试环境及异常处理程序所属课程名称面向对象技术实验类型设计型实验日期20xx41班级…