JAVA实验报告二:异常处理及输入输出流技术实验 本文关键词:实验,输入输出,异常,报告,技术
JAVA实验报告二:异常处理及输入输出流技术实验 本文简介:实验报告实验项目二Java异常处理及输入输出流技术实验文本编辑器一、实验目的1.理解和掌握字节流的类以及它们的使用特点;2.理解和区分字节流和字符流;3.了解和运用字节流和字符流进行文件复制。二、实验内容设计一个简单的文本编辑器,可以实现多文件处理、实现文件的创建、浏览、编辑(允许文件复制和修改)、
JAVA实验报告二:异常处理及输入输出流技术实验 本文内容:
实验报告
实验项目二
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.*;
import
javax.swing.text.Document;
public
class
TextEditor
extends
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);
}
public
void
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(){
public
void
actionPerformed(ActionEvent
e){
if(e.getSource()==closeItem){
currentFrame.dispose();
}
}
});
exitItem=new
JMenuItem(“退出“);
exitItem.addActionListener(new
ActionListener(){
public
void
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(){
public
void
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)
return
null;
File
fileName=filechooser.getSelectedFile();
//代码3;//从对话框中选择文件,赋值给fileName;
return
fileName;//返回选定的文件;
}
public
void
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;
}
public
void
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,“警告!“);
}
}
public
static
void
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{
public
void
actionPerformed(ActionEvent
e){//新建
DisplayFrame
txtFrame=new
DisplayFrame();
currentFrame=txtFrame;
txtFrame.setTitle(“新建文件“);
desktopPane.add(txtFrame);
status=0;
}
}//end
class
newFileListener;
class
OpenFileListener
implements
ActionListener{
public
void
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{
public
void
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{
public
void
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;
class
DisplayFrame
extends
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);
}
public
void
insertUpdate(DocumentEvent
e)
{
buffer=new
StringBuffer(displayArea.getText());
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
public
void
removeUpdate(DocumentEvent
e)
{
buffer=new
StringBuffer(displayArea.getText());
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
public
void
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、
实验分析
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
位的字节数据。它们的子类以及相应的继承关系根据功能可以分成两个类别
:
一个是只处理读取和写入的类
;
另一个是可以执行其他处理的类。