实验四 I/O流处理
[实验目的]
1、熟悉流的包装体系
2、掌握使用文件流、缓冲流、对象流。
3、理解和运用串行化机制
[实验内容]
1、
(
必作)
通过命令行方式传入源文件、目标文件,实现文件的拷贝。
2
、(必作)
分别就以下两种情况测量缓冲式和非缓冲式
I/O
操作的性能差别(两者组合共四种方式)。第一种情况是每次写一个字节,重复写
100000
次;第二种情况是一次输出
10
字节。两种情况均循环执行
100000
次(可参考后面代码)。
3
、(必作)
将实验三中的
Score
类串行化,即声明
Serializable
接口,编写主程序将其写入磁盘文件和从磁盘文件中读出。
4
、(选作)
编写配置文件(即通常的
INI
文件)读写器。构造
IniFileAgent
类,将文件的内容映射成对象以便上层程序更方便地使用。具体类结构见所附代码。
配置文件的一般格式为:
[
节名
]
项名
=
项值
…
如:以下为
System.ini
的内容:
…
[386enh]
woafont=app936.FON
EGA80WOA.FON=EGA80WOA.FON
提示:本题需要解决的关键问题是识别节与节的边界。每节的项数目是不定的,节与项目之间,项与项之间必须回车。但节与节之间可空行也可不空行。显然回车、空格均不能构成节之间的分界。若采用超前搜索,则涉及到回退。而通常流针对的是顺序文件。因此可采用两种思路解决:(
1
)采用随机文件访问。(
2
)同样采用输入流方式,一次读一行,判别是项、节还是空行,再分别作适当处理。通过一次扫描,全部构造所有的
Section
。
要求:
(
1
)选作内容不要求写实验报告,供学有余力的同学作为课外学习参考。经适当扩充,可作为课程设计,部分课题扩充后也可作为毕业设计,
也可发至邮箱
hong_yao@126.com
可获得实验加分,只需完成一个选作项目即可,但若发现雷同,相关人员均不得加分。
(
2
)实验报告上要求
1
、
3
题写代码,
2
题只写实验结果,即
4
种方式的毫秒数。
附参考代码:
2
题:
public
static
void main(String args[])
{
long usedTime;
try {
//
通过对话框输入命令决定以哪种方式运行
String cmd=JOptionPane.showInputDialog(null);
if(cmd.equals("M1")){ //
方式
1
:无缓冲一次一字节写
FileOutputStream fs=new FileOutputStream("D:\\a.txt");
Date d1=new Date();
for(int i=0;i<100000;i++)
fs.write('a');
Date d2=new Date();
usedTime=d2.getTime()-d1.getTime();
System.out.println("
所用时间:
"+usedTime+"
毫秒
");
fs.close();
}elseif(cmd.equals("M2")){ //
方式
2
:有缓冲一次一字节写
…//
后续代码可仿照上面写出。
4
题:
public
class IniFileAgent {
String fileName;
public ArrayList<Section> sections;
ObjectInputStream in; //
若改用随机文件的方式则不要
in
和
out
两个变量
ObjectOutputStream out;
//
在定义对象的同时立即载入
public IniFileAgent(String fileName) throws IOException{…}
//charSet
参数为支持的字符集
,
以备将来扩充
public IniFileAgent(String fileName,String charSet){…}
//
从该文件载入并转换成
sections
对象数组
public
void load() throws IOException {…}
//
将
sections
对象数组保存
public
void save() throws IOException {…}
//
获取
Sections
供外部程序使用
public ArrayList<Section> getSections(){
return sections;
}}
public
class Section implements Serializable {
public TreeMap<String,String> items=new TreeMap();//
项
public String getValue(String itemName){
return items.get(itemName);
}
public
void addItem(String key,String value){
items.put(key, value);
}
public
void removeItem(String key){
items.remove(key);
}
public
int size(){
return items.size();
}
}