高级Java实验一.docx
《高级Java实验一.docx》由会员分享,可在线阅读,更多相关《高级Java实验一.docx(15页珍藏版)》请在冰豆网上搜索。
高级Java实验一
实验报告
课程名称高级Java程序设计
实验项目__流与文件
实验仪器个人计算机____
系别__计算机学院_
专业___
班级/学号
学生姓名_____________
实验日期2013年9月12日
成绩_______________________
指导教师______徐莉_________
实验项目一流与文件
实验目的:
1.了解流式输入输出的基本概念,掌握java输入输出处理的基本方法。
2.掌握文本文件、流文件的读入与写出。
3.学会编写通过GUI界面进行文件操作的应用程序。
实验内容:
任务1.调试、运行下列给出的程序,并做如下的探究。
classDemo1
{publicstaticvoidmain(String[]args)throwsjava.io.IOException
{bytebuffer[]=newbyte[20];
System.out.println("从键盘输入不超过20个字符,按回车键结束输入:
");
intcount=System.in.read(buffer);
System.out.println("保存在缓冲区buffer中元素的个数为:
"+count);
System.out.println("buffer中各元素的值为:
for(inti=0;i{System.out.print(""+buffer[i]);}System.out.println();System.out.println("输出buffer字符元素:");System.out.write(buffer,0,buffer.length);}}探究的问题:1.说出该程序的功能。在屏幕上输出字符。2.观察运行结果,提出你的探究问题,并回答。字符读入的方式是什么?答:通过System.in.read(buffer)读取ASCII码。实验总结:这个java文件并没有说明输入的字符保存在哪里,而是默认到最初的java程序所在的路径。任务2.调试、运行下列给出的程序,并做如下的探究。importjava.io.*;classDemo2{publicstaticvoidmain(String[]args)throwsIOException{char[]cbuf1={‘你’,’好’,’!’};FileWriterfo=newFileWriter("txt1.txt");fo.write(cbuf1);fo.close();}}探究的问题:1.说出该程序的功能。答:创建一个字符数组,然后向txt1.txt中写入字符数组你好!。2.观察运行结果,你看到什么?答:Text1.txt文件中出现“你好”两个字。3.再次运行该程序,再打开txt1.txt看看,发生了什么?并说明原因。答:Txt1.txt内容没有改变。再次执行把原来文件覆盖了。这时候应该改为FileWriterfo=newFileWriter("txt1.txt,true")。4.该程序如果缺少fo.close();语句会发生什么?并说明原因。答:Txt1.txt中没有任何字符。Close相当于最后冲洗管道。只有调用close才能让所有数据都出来。5.该程序的main()方法如果缺少throwsIOException子句会发生什么?答:编译不能通过。6.通过该任务,谈谈你对FileWriter的认识?答:FileWirte是写入字符文件的便捷类。7.现在你能设计一个能从键盘输入一行文本,然后将其保存到一磁盘文件里吗?请试一试。源程序:importjava.io.*;classshiyan3{publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));System.out.println("请输入内容");Stringstr=in.readLine();FileWriterfo=newFileWriter("txt1.txt");fo.write(str);fo.close();}}编译结果:测试数据及运行结果:实验总结:文件的复制并没有因为文件类型的不同而出现复制错误的情况。任务3.编写一个对二进制文件进行复制的程序。源程序:importjava.io.*;publicclassFileCopy{StringsourceName,destName;publicvoidcopy1(Stringsrc){sourceName=src;opensourceFiles();}publicvoidcopy2(Stringdst){destName=dst;opendestFiles();copyFiles();}privatevoidopensourceFiles(){Filen1=newFile(sourceName);if(!n1.exists()){System.out.println("被复制文件不存在"+n1);System.exit(0);}}privatevoidopendestFiles(){Filen2=newFile(destName);Fileparent=n2.getParentFile();if(parent!=null&&!parent.exists()){parent.mkdirs();System.out.println("将创建目录"+n2);}}privatevoidcopyFiles(){try{Filen1=newFile(sourceName);FileInputStreamin=newFileInputStream(n1);byte[]c=newbyte[(int)n1.length()];in.read(c);Filen2=newFile(destName);n2.createNewFile();FileOutputStreamoutnew=newFileOutputStream(n2);outnew.write(c);in.close();outnew.close();}catch(IOExceptioniox){System.out.println("Problemreadingorwriting");}}publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));System.out.println("请输入要复制的文件");Stringa=in.readLine();FileCopyfileCopy=newFileCopy();fileCopy.copy1(a);System.out.println("请输入目的文件");Stringb=in.readLine();fileCopy.copy2(b);}}测试数据及运行结果:实验总结:任务3的内容比较简单,主要是实现对文件的复制,在运行过程中没有出现什么问题。任务4.创建一学生类(包含姓名、年龄、班级、密码),创建若干个该类的对象并保存在文件中(密码不保存),再从文件中读取对象后显示在屏幕上。源程序:importjava.io.*;publicclassstudentjava{publicstaticvoidmain(Stringargs[])throwsIOException,ClassNotFoundException{BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));System.out.println("请输入文件位置");Stringa1=in.readLine();System.out.println("请输入学生姓名");Stringa2=in.readLine();System.out.println("请输入学生年龄");Stringa3=in.readLine();inta6=Integer.parseInt(a3);System.out.println("请输入学生班级");Stringa4=in.readLine();System.out.println("请输入学生密码");Stringa5=in.readLine();studentbob=newstudent(a2,a6,a4,a5);FileOutputStreama=newFileOutputStream(a1);ObjectOutputStreamoos=newObjectOutputStream(a);oos.writeObject(bob);oos.close();bob=null;FileInputStreamb=newFileInputStream(a1);ObjectInputStreamois=newObjectInputStream(b);bob=(student)ois.readObject();ois.close();System.out.println("------------------");System.out.println("nameis:"+bob.getName());System.out.println("ageis:"+bob.getAge());System.out.println("classis:"+bob.getBanji());System.out.println("passwordis:"+bob.getPass());}}classstudentimplementsSerializable{privateintage;privateStringname;privateStringbanji;transientprivateStringpassword;publicstudent(Stringnamea,intagea,Stringbanjia,Stringpassworda){age=agea;name=namea;banji=banjia;password=passworda;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicStringgetBanji(){returnbanji;}publicStringgetPass(){returnpassword;}} 测试数据及运行结果:实验总结:这个题目主要考查数据的存储和传输,里面用到了使用关键字transient可以阻止对象的某些成员被自动写入文件和Serializable接口,序列化是将对象状态转换为可保持或传输的格式的过程。任务5.对例1-12中的压缩程序段进行修改,使压缩流经过缓冲类。比较两种方法在对大的文件进行压缩时的效率。//解压缩Zip文件,并恢复其原来路径importjava.util.*;importjava.util.zip.*;importjava.lang.*;importjava.io.*;classUnzip{bytedoc[]=null;StringFilename=null;//压缩文件名字符串StringUnZipPath=null;//解压缩路径字符串publicUnzip(Stringfilename,StringunZipPath){this.Filename=filename;this.UnZipPath=unZipPath;this.setUnZipPath(this.UnZipPath);}publicUnzip(Stringfilename){this.Filename=newString(filename);this.UnZipPath=null;this.setUnZipPath(this.UnZipPath);}privatevoidsetUnZipPath(StringunZipPath){if(unZipPath.endsWith("\\"))this.UnZipPath=newString(unZipPath);elsethis.UnZipPath=newString(unZipPath+"\\");}publicvoiddoUnZip(){try{ZipInputStreamzipis=newZipInputStream(newBufferedInputStream(newFileInputStream(Filename)));ZipEntryfEntry=null;while((fEntry=zipis.getNextEntry())!=null){if(fEntry.isDirectory())//是路径则创建路径checkFilePath(newString(UnZipPath+fEntry.getName()));//如果filename没有给出完整的路径那么就在解压路径下找这个文件else{//是文件则解压缩文件Stringfnamea=newString(UnZipPath+fEntry.getName());try{Filefname=newFile(fnamea);BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(fname));fname.createNewFile();doc=newbyte[512];intn;while((n=zipis.read(doc,0,512))!=-1)out.write(doc,0,n);out.close();out=null;doc=null;}catch(Exceptionex){}}}zipis.close();}catch(IOExceptionioe){System.out.println(ioe);}}privatevoidcheckFilePath(StringdirName)throwsIOException{Filedir=newFile(dirName);if(!dir.exists())dir.mkdirs();}//主类,用于输入参数,生成Unzip类的实例//publicclassUnZipTester{publicstaticvoidmain(String[]args)throwsException{BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));System.out.println("请输入要解压的文件名");Stringarg1=in.readLine();System.out.println("请输入要解压的解压缩路径");Stringarg2=in.readLine();StringzipFile=arg1;StringunZipPath=newString(arg2+"\\");UnzipmyZip=newUnzip(zipFile,unZipPath);myZip.doUnZip();}}测试数据:测试一个word的压缩文件。实验总结:在解压的过程中,被压缩的文件名必须是英文字符或数字,不能出现汉字,否则压缩不成功。思考题:1.如果准备读取一个文件的内容,应该用FileInputStream流还是FileOutputStream流?答:用FileInputStream类。2.字节流与字符流有什么区别?编程时如何确定使用那种流合适?答:字节流以字节为单位,字符有可能占多个字节。纯文本用字符比较合适,而其他情况用字节流合适,。3.Java是怎样实现文件的随机读写?答:通过RandomAccessFile类4.DataInputStream流能直接指向文件对象吗?答:能。RandomAccessFile类,可跳转到文件的任意位置读/写数据,也可不破坏该文件的其他数据而在随机文件中插入数据,使用普通的读写方法实现了DataInput和DataOutput接口。
{System.out.print(""+buffer[i]);
}
System.out.println();
System.out.println("输出buffer字符元素:
System.out.write(buffer,0,buffer.length);
探究的问题:
1.说出该程序的功能。
在屏幕上输出字符。
2.观察运行结果,提出你的探究问题,并回答。
字符读入的方式是什么?
答:
通过System.in.read(buffer)读取ASCII码。
实验总结:
这个java文件并没有说明输入的字符保存在哪里,而是默认到最初的java程序所在的路径。
任务2.调试、运行下列给出的程序,并做如下的探究。
importjava.io.*;
classDemo2{
publicstaticvoidmain(String[]args)throwsIOException{
char[]cbuf1={‘你’,’好’,’!
’};
FileWriterfo=newFileWriter("txt1.txt");
fo.write(cbuf1);
fo.close();
创建一个字符数组,然后向txt1.txt中写入字符数组你好!
。
2.观察运行结果,你看到什么?
Text1.txt文件中出现“你好”两个字。
3.再次运行该程序,再打开txt1.txt看看,发生了什么?
并说明原因。
Txt1.txt内容没有改变。
再次执行把原来文件覆盖了。
这时候应该改为FileWriterfo=newFileWriter("txt1.txt,true")。
4.该程序如果缺少fo.close();语句会发生什么?
Txt1.txt中没有任何字符。
Close相当于最后冲洗管道。
只有调用close才能让所有数据都出来。
5.该程序的main()方法如果缺少throwsIOException子句会发生什么?
编译不能通过。
6.通过该任务,谈谈你对FileWriter的认识?
FileWirte是写入字符文件的便捷类。
7.现在你能设计一个能从键盘输入一行文本,然后将其保存到一磁盘文件里吗?
请试一试。
源程序:
classshiyan3{
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
System.out.println("请输入内容");
Stringstr=in.readLine();
fo.write(str);
编译结果:
测试数据及运行结果:
文件的复制并没有因为文件类型的不同而出现复制错误的情况。
任务3.编写一个对二进制文件进行复制的程序。
publicclassFileCopy{
StringsourceName,destName;
publicvoidcopy1(Stringsrc){
sourceName=src;
opensourceFiles();
publicvoidcopy2(Stringdst){
destName=dst;
opendestFiles();
copyFiles();
privatevoidopensourceFiles(){
Filen1=newFile(sourceName);
if(!
n1.exists())
{System.out.println("被复制文件不存在"+n1);
System.exit(0);}}
privatevoidopendestFiles(){
Filen2=newFile(destName);
Fileparent=n2.getParentFile();
if(parent!
=null&&!
parent.exists()){
parent.mkdirs();
System.out.println("将创建目录"+n2);
}}
privatevoidcopyFiles(){
try{
FileInputStreamin=newFileInputStream(n1);
byte[]c=newbyte[(int)n1.length()];
in.read(c);
n2.createNewFile();
FileOutputStreamoutnew=newFileOutputStream(n2);
outnew.write(c);
in.close();
outnew.close();
catch(IOExceptioniox){
System.out.println("Problemreadingorwriting");
publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
System.out.println("请输入要复制的文件");
Stringa=in.readLine();
FileCopyfileCopy=newFileCopy();
fileCopy.copy1(a);
System.out.println("请输入目的文件");
Stringb=in.readLine();
fileCopy.copy2(b);
任务3的内容比较简单,主要是实现对文件的复制,在运行过程中没有出现什么问题。
任务4.创建一学生类(包含姓名、年龄、班级、密码),创建若干个该类的对象并保存在文件中(密码不保存),再从文件中读取对象后显示在屏幕上。
publicclassstudentjava
{
publicstaticvoidmain(Stringargs[])throwsIOException,ClassNotFoundException{
System.out.println("请输入文件位置");
Stringa1=in.readLine();
System.out.println("请输入学生姓名");
Stringa2=in.readLine();
System.out.println("请输入学生年龄");
Stringa3=in.readLine();
inta6=Integer.parseInt(a3);
System.out.println("请输入学生班级");
Stringa4=in.readLine();
System.out.println("请输入学生密码");
Stringa5=in.readLine();
studentbob=newstudent(a2,a6,a4,a5);
FileOutputStreama=newFileOutputStream(a1);
ObjectOutputStreamoos=newObjectOutputStream(a);
oos.writeObject(bob);
oos.close();
bob=null;
FileInputStreamb=newFileInputStream(a1);
ObjectInputStreamois=newObjectInputStream(b);
bob=(student)ois.readObject();
ois.close();
System.out.println("------------------");
System.out.println("nameis:
"+bob.getName());
System.out.println("ageis:
"+bob.getAge());
System.out.println("classis:
"+bob.getBanji());
System.out.println("passwordis:
"+bob.getPass());
classstudentimplementsSerializable{
privateintage;
privateStringname;
privateStringbanji;
transientprivateStringpassword;
publicstudent(Stringnamea,intagea,Stringbanjia,Stringpassworda){
age=agea;
name=namea;
banji=banjia;
password=passworda;
publicStringgetName()
{returnname;}
publicintgetAge()
{returnage;}
publicStringgetBanji()
{returnbanji;}
publicStringgetPass()
{returnpassword;}
这个题目主要考查数据的存储和传输,里面用到了使用关键字transient可以阻止对象的某些成员被自动写入文件和Serializable接口,序列化是将对象状态转换为可保持或传输的格式的过程。
任务5.对例1-12中的压缩程序段进行修改,使压缩流经过缓冲类。
比较两种方法在对大的文件进行压缩时的效率。
//解压缩Zip文件,并恢复其原来路径
importjava.util.*;
importjava.util.zip.*;
importjava.lang.*;
classUnzip{
bytedoc[]=null;
StringFilename=null;//压缩文件名字符串
StringUnZipPath=null;//解压缩路径字符串
publicUnzip(Stringfilename,StringunZipPath){
this.Filename=filename;
this.UnZipPath=unZipPath;
this.setUnZipPath(this.UnZipPath);
publicUnzip(Stringfilename){
this.Filename=newString(filename);
this.UnZipPath=null;
privatevoidsetUnZipPath(StringunZipPath){
if(unZipPath.endsWith("\\"))
this.UnZipPath=newString(unZipPath);
else
this.UnZipPath=newString(unZipPath+"\\");
publicvoiddoUnZip(){
ZipInputStreamzipis=newZipInputStream(newBufferedInputStream(newFileInputStream(Filename)));
ZipEntryfEntry=null;
while((fEntry=zipis.getNextEntry())!
=null){
if(fEntry.isDirectory())//是路径则创建路径
checkFilePath(newString(UnZipPath+fEntry.getName()));//如果filename没有给出完整的路径那么就在解压路径下找这个文件
else{//是文件则解压缩文件
Stringfnamea=newString(UnZipPath+fEntry.getName());
try{Filefname=newFile(fnamea);
BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(fname));
fname.createNewFile();
doc=newbyte[512];
intn;
while((n=zipis.read(doc,0,512))!
=-1)
out.write(doc,0,n);
out.close();
out=null;
doc=null;
catch(Exceptionex){}
zipis.close();
catch(IOExceptionioe){System.out.println(ioe);}
privatevoidcheckFilePath(StringdirName)throwsIOException{
Filedir=newFile(dirName);
dir.exists())
dir.mkdirs();
//主类,用于输入参数,生成Unzip类的实例
//publicclassUnZipTester{
publicstaticvoidmain(String[]args)throwsException{
System.out.println("请输入要解压的文件名");
Stringarg1=in.readLine();
System.out.println("请输入要解压的解压缩路径");
Stringarg2=in.readLine();
StringzipFile=arg1;
StringunZipPath=newString(arg2+"\\");
UnzipmyZip=newUnzip(zipFile,unZipPath);
myZip.doUnZip();
测试数据:
测试一个word的压缩文件。
在解压的过程中,被压缩的文件名必须是英文字符或数字,不能出现汉字,否则压缩不成功。
思考题:
1.如果准备读取一个文件的内容,应该用FileInputStream流还是FileOutputStream流?
用FileInputStream类。
2.字节流与字符流有什么区别?
编程时如何确定使用那种流合适?
字节流以字节为单位,字符有可能占多个字节。
纯文本用字符比较合适,而其他情况用字节流合适,。
3.Java是怎样实现文件的随机读写?
通过RandomAccessFile类
4.DataInputStream流能直接指向文件对象吗?
能。
RandomAccessFile类,可跳转到文件的任意位置读/写数据,也可不破坏该文件的其他数据而在随机文件中插入数据,使用普通的读写方法实现了DataInput和DataOutput接口。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1