JAVA 实验报告二异常处理及输入输出流技术实验.docx
《JAVA 实验报告二异常处理及输入输出流技术实验.docx》由会员分享,可在线阅读,更多相关《JAVA 实验报告二异常处理及输入输出流技术实验.docx(16页珍藏版)》请在冰点文库上搜索。
JAVA实验报告二异常处理及输入输出流技术实验
实验报告
实验项目二Java异常处理及输入输出流技术实验
文本编辑器
一、实验目的
1.理解和掌握字节流的类以及它们的使用特点;
2.理解和区分字节流和字符流;
3.了解和运用字节流和字符流进行文件复制。
二、实验内容
设计一个简单的文本编辑器,可以实现多文件处理、实现文件的创建、浏览、编辑(允许文件复制和修改)、对已经修改的文件可以进行保存或以另存的文件名称保存。
三、实验原理
Java输入输出流技术、AWT/Swing编程技术、事件处理技术等技术原理。
四、实验环境
主CPU586以上,内存1G以上,操作系统WindowsXP,eclipse。
五、实验步骤
1、创建一个TextEditor项目
图1TextEditor项目
2.创建一个TextEditor类
图2TextEditor类
3.补充代码。
并在TextEditor类里输入相对应的代码:
importjavax.swing.*;
importjava.awt.event.*;
importjavax.swing.event.*;
importjava.awt.*;
importjava.io.*;
importjavax.swing.text.Document;
publicclassTextEditorextendsJFrame{
JDesktopPanedesktopPane;
//定义菜单组件
JMenuBarmenuBar;
JMenufileMenu,helpMenu;//定义文件菜单、帮助菜单
JMenuItemnewItem,openItem,saveItem,othersaveItem,closeItem,exitItem;
//定义文件菜单的:
新建菜单项、打开菜单项、保存菜单项、另存菜单项、关闭菜单项、//退出菜单项
JMenuItemaboutItem;//定义帮助菜单的:
关于菜单项
StringBufferbuffer=newStringBuffer();//定义一个字符串缓冲区;
FilecurrentFile;//当前处理的文件;
intstatus;//记录当前状态0:
新建、1:
打开、2:
保存、3:
另存;4:
关闭;
DisplayFramecurrentFrame;//当前打开的窗口
publicTextEditor(){
super("文本编辑器");
Containercontainer=getContentPane();
desktopPane=newJDesktopPane();
container.add(desktopPane);
createMenu();
setJMenuBar(menuBar);
}
publicvoidcreateMenu(){
//定义菜单条;
menuBar=newJMenuBar();
//定义文件菜单
fileMenu=newJMenu("文件");
//定义文件菜单的:
新建菜单项、打开菜单项、保存菜单项、另存菜单项、关闭菜单
//退出菜单项
//定义新建菜单项
newItem=newJMenuItem("新建");
newItem.addActionListener(newNewFileListener());
//定义打开菜单项
openItem=newJMenuItem("打开");
openItem.addActionListener(newOpenFileListener());
saveItem=newJMenuItem("保存");
saveItem.addActionListener(newSaveFileListener());
othersaveItem=newJMenuItem("另存为");
othersaveItem.addActionListener(newOtherSaveFileListener());
closeItem=newJMenuItem("关闭");
closeItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==closeItem){
currentFrame.dispose();
}
}
});
exitItem=newJMenuItem("退出");
exitItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
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=newJMenu("帮助");
//定义帮助菜单的:
关于菜单项
aboutItem=newJMenuItem("关于");
aboutItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==aboutItem){
JOptionPane.showMessageDialog(null,"TextEditor1.1",
"版本",JOptionPane.INFORMATION_MESSAGE);
}
}
});
//添加菜单项到帮助菜单中;
helpMenu.add(aboutItem);
//将文件菜单和帮助菜单加入到菜单条中;
menuBar.add(fileMenu);
menuBar.add(helpMenu);
}//endcreateMenumethod;
publicFilechooseFile(intchooseMode){
//从选择文件对话框中选择文件,chooseMode为选择模式
//1:
为文件打开对话框模式,2:
为文件保存对话框模式;
JFileChooserfilechooser=newJFileChooser();
filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
intresult=0;
switch(chooseMode){
case1:
result=filechooser.showOpenDialog(currentFrame);//代码1;
//按照文件打开对话框模式选择文件
break;
case2:
result=filechooser.showSaveDialog(currentFrame);//代码2;
//按照文件保存对话框模式选择文件
break;
}
if(result==filechooser.CANCEL_OPTION)returnnull;
FilefileName=filechooser.getSelectedFile();//代码3;//从对话框中选择文件,赋值给fileName;
returnfileName;//返回选定的文件;
}
publicvoidsaveFile(Filefile,intsaveMode)throwsIOException{
//保存文件fileName,saveMode是保存文件模式:
//1:
新建文件的保存;2:
将修改的已有文件保存;
FilefileName=null;
switch(saveMode){
case0:
fileName=chooseFile
(2);
if(fileName.createNewFile()!
=true)return;
break;
case1:
fileName=file;break;
default:
return;
}
currentFile=fileName;
if(fileName.exists()!
=true)return;//文件不存在,则返回;
BufferedWriterinput=newBufferedWriter(newFileWriter(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;
}
publicvoidshowFile(FilefileName,DisplayFramecontentFrame){
//将指定文件fileName的内容在窗口contentFrame内显示出来。
try{
BufferedReaderoutput=newBufferedReader(newFileReader(fileName));//代码5;
//将文件fileName读到字符缓冲读取器output中;
Stringtext;
buffer=newStringBuffer();
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(IOExceptionex){
JOptionPane.showMessageDialog(null,"错误发生!
");
}
catch(NullPointerExceptionex3){
JOptionPane.showMessageDialog(null,"警告!
");
}
}
publicstaticvoidmain(String[]args){
TextEditortexteditor=newTextEditor();
texteditor.setSize(400,300);
texteditor.setVisible(true);
texteditor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}//endmain
classNewFileListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){//新建
DisplayFrametxtFrame=newDisplayFrame();
currentFrame=txtFrame;
txtFrame.setTitle("新建文件");
desktopPane.add(txtFrame);
status=0;
}
}//endclassnewFileListener;
classOpenFileListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){//打开文件监视接口;
FilefileName=chooseFile
(1);//打开模式打开文件;
currentFile=fileName;
try{
if(fileName.exists()){
DisplayFramecontentFrame=newDisplayFrame();
currentFrame=contentFrame;
desktopPane.add(contentFrame);
showFile(fileName,contentFrame);
}//endif
status=1;
}catch(Exceptionex){}
}//endactionPerformed
}//endclassopenFileListener;
classSaveFileListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){//保存处理
if(e.getSource()==saveItem){
try{
saveFile(currentFile,status);
}
catch(IOExceptionex){
JOptionPane.showMessageDialog(null,"保存文件失败");
}
catch(Exceptionex){}
}
}
}//endclassSaveFileListener;
classOtherSaveFileListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){//另存处理;
if(e.getSource()==othersaveItem){
FilefileName=chooseFile
(2);
BufferedWriteroutput=null;
BufferedReaderinput=null;
try{
if(fileName.exists()!
=true)fileName.createNewFile();
input=newBufferedReader(newFileReader(currentFile));
output=newBufferedWriter(newFileWriter(fileName));
Stringch;
while((ch=input.readLine())!
=null){
output.write(ch);
output.newLine();
}
input.close();
output.close();
currentFrame.dispose();//将源文件显示窗口关闭;
DisplayFramecontentFrame=newDisplayFrame();
desktopPane.add(contentFrame);//创建新的显示窗口;
currentFrame=contentFrame;//新窗口设置为当前显示窗口;
currentFile=fileName;
showFile(fileName,contentFrame);
//在窗口contentFrame中显示文件fileName;
}catch(IOExceptionex){
JOptionPane.showMessageDialog(null,"文件另存失败");
}
}//endouterif
}//endactionPerformedmethod;
}//endclassOtherSaveListener;
classDisplayFrameextendsJInternalFrameimplementsDocumentListener{
JTextAreadisplayArea;
publicDisplayFrame(){
super("文本内容:
",true,true,true,true);
displayArea=newJTextArea(8,30);
displayArea.getDocument().addDocumentListener(this);
getContentPane().add(displayArea);
pack();
setVisible(true);
}
publicvoidinsertUpdate(DocumentEvente){
buffer=newStringBuffer(displayArea.getText());
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
publicvoidremoveUpdate(DocumentEvente){
buffer=newStringBuffer(displayArea.getText());
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
publicvoidchangedUpdate(DocumentEvente){
//Plaintextcomponentsdon'tfiretheseevents.
}
}//endDisplayFrame.java
}//endclassTextEditor.java
六、实验结果
运行可得如下实验结果:
图3结果1图4新建文件
图5打开文件图6保存文件
图7文件另存为图8帮助文件
七、实验分析
7.1
程序中的类SaveFileListener和类OtherSaveFileListener的定义。
它们都有处理保存文件数据的功能,问在具体实现上,SaveFileListener如果对已经保存的文件它,会直接保存;但OtherSaveFileListener每次都会重装打开一个窗口保存文件,并要在对话框里输入文件名。
7.2
在OtherSaveFileListener类中的actionPerformed()方法中有语句:
output=newBufferedWriter(newFileWriter(fileName));如果将该语句改写成:
output=newBufferedWriter(newFileWriter(filename,true));
程序是否可以正常运行,如果不能正常运行,但改为:
output=newBufferedWriter(newFileWriter(fileName,true));可以正常运行,文件名错了。
newFileWriter(fileName)在给出文件名的情况下构造一个FileWriter对象。
newFileWriter(fileName,true)在给出文件名的情况下构造FileWriter对象,它具有指示是否挂起写入数据的boolean值。
7.3
在定义OtherSaveFileListener类的actionPerformed()方法中,采用了字符缓冲读写器(BufferedReader和BufferedWriter),来实现文件数据的读取和写入。
如果在该方法中改用字节缓冲输入和输出流(BufferedInputstream和BuferedOutputstream)来实现文件数据的读取和写入可以为:
input=newBufferedInputstream(newFile(currentFile));
output=newBuferedOutputstream(newFile(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位的字节数据。
它们的子类以及相应的继承关系根据功能可以分成两个类别:
一个是只处理读取和写入的类;另一个是可以执行其他处理的类。