java流.docx
- 文档编号:6361434
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:16
- 大小:91.64KB
java流.docx
《java流.docx》由会员分享,可在线阅读,更多相关《java流.docx(16页珍藏版)》请在冰豆网上搜索。
java流
计算机网络程序设计
实验报告
实验题目:
面向流的编程和对象序列化
学院计算机学院
专业网络工程
班级09级01班
姓名闫耀文
学号40909040106
2012年3月10日
一、
实验名称
面向流的编程和对象序列化
二、实验目的和要求
●实验目的:
1、掌握Java流的工作方式;
2、掌握常用输入和输出流的使用;
3、掌握文件的访问、目录和文件管理类的使用
●要求完成:
掌握JAVA中的输入流输出流,以及它的子类。
三、开发环境
1.操作系统:
MicrosoftWindowsxpsp3pro
2.主机IP:
192.168.0.151
3.编程工具:
MyEclipse
4.开发环境:
jdk1.6
四、实验内容和结果
1、程序整体功能
●编写程序实现以下功能:
实现对图书的简单管理,要求用户输入书本名称、价钱、出版社等。
●同上题,但是要求图书信息的写入和读取采用对象的方式,即ObjectOutputStream、ObjectInputStream
2、设计思路说明
(1)提示用户输入文件要存储的路径(例如c:
\test)
(2)检查用户指定的路径中的文件夹是否存在,如果不存在,则创建这个文件夹
(3)提示用户输入文件名称
(4)检查步骤
(1)的文件夹是否存在此文件名的文件,如果存在,则提示用户文件已经存在,要求用户重新输入,返回步骤(3)
(5)提示用户分别录入图书名称,出版社,价格,数量,是否教材(boolean类型)等信息
(6)将用户录入的图书信息用文件流的方式写入到步骤(4)确定的文件中
(7)询问用户是否结束录入图书信息,如果用户输入n,则返回步骤(5),否则关闭文件
(8)从用户输入的文件中把用户输入的图书信息读取,逐行显示在屏幕上,并最后显示图书的个数继续
3、重要类、数据结构、模块/函数算法说明
●FileReader和FileWriter
类
功能
classDirectory{}
用于判断和创建文件夹
classDocument{}
指定一个文件来存储记录
classInputMessage{}
输入每本书的信息
classInputBooks{}
接受用户输入的多本书的信息
classPrintMessage{}
显示用户输入的记录
classMyBookManage{}
JAVA程序的主类
●ObjectOutputStream和ObjectInputStream
类
功能
classDirectory{}
用于判断和创建文件夹
classDocument{}
指定一个文件来存储记录
classInputMessage{}
将InputMessage类串行化
classInputBooks{}
接受用户对图书信息的输入
classPrintMessage{}
将文件以对象的方式读出
classMyObjectBook{}
JAVA程序的主类
两种功能在对文件的读取时选择方式不一样,第一种直接使用文件流进行操作,第二种是用对象的方法整体输入输出。
4、程序的运行和测试结果
●方式一
图1、文件创建
图2、图书信息输入
图3、输入记录输出
●方式二
图1、文件创建
图5、记录输入
图6、记录输出
5、程序清单
●方式一
importjava.io.*;
importjava.util.*;
/*
*这个类是用于判断和创建文件夹
*如果文件夹存在,则提示文件夹已存在无需新建。
*否则,就建立制定路径和名字的文件夹
*/
classDirectory
{
publicStringpathDirectory()
{
Scannersca;
Stringpath=null;//存储指定的路径
Filedir=null;
System.out.print("请输入文件夹路径:
");//提示用户输入路径
sca=newScanner(System.in);
path=sca.next();
dir=newFile(path);
if(dir.exists())//判断用户输入的文件夹是否存在
{
System.out.println("文件夾<"+path+">已存在!
");
}
else
{
dir.mkdir();//创建文件夹
System.out.println("文件夾<"+path+">创建成功!
");
}
returnpath;//返回指定或创建好的文件夹地址
}
}
/*
*这个类是指定一个文件来存储输入的记录
*如果出现同名文件,提示用户重新输入
*如果没有重名文件,就会建立一个指定路径和文件名的文件
*/
classDocument
{
publicStringpathDocument()throwsException
{
Scannersca;
Filedoc=null;
Stringdirpath=null;//目录地址
Stringdocpath=null;//文档地址
Directorysel_path=newDirectory();
dirpath=sel_path.pathDirectory()+"/";//将目录地址后添加'/'
for(;;)
{
System.out.print("请输入存储文件名称:
");//同时用户输入文件名
sca=newScanner(System.in);//接受用户输入的文件夹名称
docpath=dirpath+sca.next();//docpath存储一个文件的完整路径
doc=newFile(docpath);
if(doc.exists())//判断指定名称的文件是否存在
{
System.out.println("文件<"+docpath+">已存在,请重新输入!
");
}
else
{
doc.createNewFile();//创建新文件,若文件不存在
System.out.println("文件<"+docpath+">创建成功!
");
break;//文件创建好后终止文档的创建,可以进行下一步信息输入
}
}
returndocpath;//返回文档的绝对路径
}
}
/*
*输入每本书的信息
*/
classInputMessage
{
//提示用户输入相应的图书信息
String[]label={"图书名:
","出版社:
","价格:
","教材否:
","数量:
"};
publicintbookDetail(FileWriterfw)throwsIOException
{
inti;
intnumber=0;
for(i=0;i<4;i++)
{
System.out.print(label[i]);
fw.write((newScanner(System.in)).next()+"\t");
}
System.out.print(label[4]);
number=(newScanner(System.in)).nextInt();
returnnumber;
}
}
/*
*接受用户输入的多本书的信息
*当用户对一本书的信息录入完成后,会问用户是否继续输入,
*若选择Y/y则继续输入查下一本书,若果输入n的话则停止
*其他书籍的信息输入
*/
classInputBooks
{
publicvoidinputBooks(Stringpath)throwsIOException
{
intnumber;//书籍总数
charflag;//是否继续输入下一本书的信息
number=0;
FileWriterfw=newFileWriter(path);
fw.write("******************************************************\r\n");
fw.write("图书名\t出版社\t价格\t教材否\t数量");
do
{
fw.write("\r\n");
InputMessagein=newInputMessage();
number=number+in.bookDetail(fw);//输入书籍信息
System.out.print("是否继续输入(y/n)?
:
");
flag=(char)System.in.read();
}while((flag=='y')||(flag=='Y'));
fw.write("\r\n图书总记录:
"+number);
fw.write("\r\n******************************************************\r\n");
fw.close();
}
}
/*
*将用户在上一步输入的图书信息
*显示出来,相当于用户浏览自己的输入
*/
classPrintMessage
{
publicvoidprint(Stringpath)throwsIOException
{
Stringrecord=null;
FileReaderfr=newFileReader(path);
BufferedReaderreader=newBufferedReader(fr);
while((record=reader.readLine())!
=null)//一次读取一行
{
System.out.println(record);//将读取的内容输出
}
reader.close();
fr.close();
}
}
publicclassMyBookManage
{
publicstaticvoidmain(String[]args)throwsException
{
Stringpath=null;
Documentd=newDocument();
path=d.pathDocument();//获取文档路径
InputBooksin=newInputBooks();
PrintMessagepm=newPrintMessage();
in.inputBooks(path);//输入图书
pm.print(path);//打印记录
}
}
●方式二
importjava.io.*;
importjava.util.*;
/*
*这个类是用于判断和创建文件夹
*如果文件夹存在,则提示文件夹已存在无需新建。
*否则,就建立制定路径和名字的文件夹
*/
classDirectory
{
publicStringpathDirectory()
{
Scannersca;
Stringpath=null;//文件夹的路径
Filedir=null;
System.out.print("请输入文件夹路径:
");
sca=newScanner(System.in);//获取文件夹路径
path=sca.next();
dir=newFile(path);
if(dir.exists())//判断文件夹是否存在
{
System.out.println("文件夾<"+path+">已存在!
");
}
else
{
dir.mkdir();
System.out.println("文件夾<"+path+">创建成功!
");
}
returnpath;//返回指定的文件夹路径
}
}
/*
*这个类是指定一个文件来存储输入的记录
*如果出现同名文件,提示用户重新输入
*如果没有重名文件,就会建立一个指定路径和文件名的文件
*/
classDocument
{
publicStringpathDocument()throwsException
{
Scannersca;
Filedoc=null;
Stringdirpath=null;//指定的路径
Stringdocpath=null;//文档的绝对路径
Directorysel_path=newDirectory();
dirpath=sel_path.pathDirectory()+"/";//获取存储文件的路径
for(;;)
{
System.out.print("请输入存储文件名称(*.ser):
");
sca=newScanner(System.in);//指定用户输入文件名
docpath=dirpath+sca.next();//得到一个文件的绝对路径
doc=newFile(docpath);
if(doc.exists())//判断这个文件是否存在
{
System.out.println("文件<"+docpath+">已存在,请重新输入!
");
}
else
{
doc.createNewFile();
System.out.println("文件<"+docpath+">创建成功!
");
break;
}
}
returndocpath;//返回建立好的文件的路径
}
}
classInputMessageimplementsSerializable//将InputMessage类串行化
{
Stringbookname=null;//书名
Stringpress=null;//出版社
Stringprice=null;//价格
intbooknumber=0;//数量
booleanmainbook=false;//是不是教材
publicInputMessage(Stringbn,Stringp,Stringpr,intbnm,booleanmb)
{
this.bookname=bn;
this.press=p;
this.price=pr;
this.booknumber=bnm;
this.mainbook=mb;
}
}
/*
*类InputBooks接受用户对图书信息的输入
*以对象的方式写入一个指定的文件中
*/
classInputBooks
{
publicvoidinputBooks(Stringpath)throwsIOException
{
Scannersca;
InputMessagebook;
Stringbookname=null;
Stringpress=null;
Stringprice=null;
intbooknumber=0;
booleanmainbook=false;
intnumber;
charflag;
number=0;
FileOutputStreamfos=newFileOutputStream(path);
ObjectOutputStreamoos=newObjectOutputStream(fos);
do
{
/*
*输入书本的信息
*/
System.out.print("图书名:
");
sca=newScanner(System.in);
bookname=sca.next();
System.out.print("出版社:
");
sca=newScanner(System.in);
press=sca.next();
System.out.print("价格:
");
sca=newScanner(System.in);
price=sca.next();
System.out.print("数量:
");
sca=newScanner(System.in);
booknumber=sca.nextInt();
number=number+booknumber;
System.out.print("教材否:
");
sca=newScanner(System.in);
mainbook=sca.nextBoolean();
book=newInputMessage(bookname,press,price,booknumber,mainbook);
oos.writeObject(book);
System.out.print("是否继续输入(y/n)?
:
");
flag=(char)System.in.read();
}while((flag=='y')||(flag=='Y'));//判断是否继续输入书本信息
oos.close();//最后关闭文件
}
}
/*
*将在类InputBooks中创建好的文件以对象的方式读出
*/
classPrintMessage
{
publicvoidprint(Stringpath)throwsIOException
{
intnumber=0;//记录图书总数
try
{
InputMessagemessage;
FileInputStreamfi=newFileInputStream(path);
ObjectInputStreamsi=newObjectInputStream(fi);
System.out.println("图书名\t出版社\t价格\t数量\t教材否");
while(true)
{
try
{
message=(InputMessage)si.readObject();
System.out.println(message.bookname+"\t"+message.press+"\t"
+message.price+"\t"+message.booknumber+"\t"+message.mainbook);
}
catch(EOFExceptione)
{
break;//如果没有对象了退出循环
}
number=number+message.booknumber;
}
}
catch(Exceptione)
{
System.out.println("读写异常:
"+e);
}
System.out.println("书本总量:
"+number);
}
}
/*
*该JAVA程序的主类,去调用别的类来完成对图书的管理
*/
publicclassMyObjectBook
{
publicstaticvoidmain(String[]args)throwsException
{
Stringpath=null;//存取文件的绝对路径
Documentd=newDocument();
path=d.pathDocument();//获取文件的绝对路径
InputBooksin=newInputBooks();
PrintMessagepm=newPrintMessage();
in.inputBooks(path);//输入图书的信息
pm.print(path);//输出记录的文件
}
}
说明:
1、以上两个方法中文件夹和文件的判断和创建使用的方法一样,都是采用File类对文件的属性进行操作,
五、实验中的问题及心得
1.对于对象流的方式对文件进行读写,由于在写入文件的时候是串行化了,用记事本打开后显示的是乱码,不能用txt方式存储文件,需要特殊的方式存储(ser)。
解决了乱码的情况。
2.对字符串的输入,由于InputStream是对字节处理,如果使用Reader的话必须循环读取字符,把读取的字符串依次付给一个Strng类型。
可以用一个Scanner类来实现此功能,不用循环,直接输入就行。
3.文件的属性和文件的内容是两回事,是不同的概念。
4.文件、应用程序、键盘、显示器之间的关系:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java
![提示](https://static.bdocx.com/images/bang_tan.gif)