java 实验六 输入输出 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六输入输出
实验目标:
1. 理解I/O流的概念与机制,掌握其分类;
2. 掌握文本文件的读写、二进制文件的读写、处理流类的概念和用法、对象序列化;
3. 掌握File类,压缩流类和RandomAccessFile类的使用;
4. 遇到I/O方面的问题,能够自行查阅API稳当解决。
实验任务:
1、课本198页习题2,并使用这个程序来copy自己硬盘的大文件(任何格式都可
以,如电影,最好大于500MB),看看需时多少?
提示:首先需要看懂课本文本文件例子,再模仿修改,关键不同在下面三点。
(1)文本文件复制中是每次读一行,而在二进制文件复制中是自行指定读取多少字节的数据,写法如下。
private boolean copyFiles() { //这个私有方法用来拷贝文件,如无异常返回true try {
byte[] buf = new byte[512];
int num = source.read(buf); //从源文件读取数据
while (num > 0) { // 只要能够读取数据,就继续读
dest.write(buf, 0, num); //向目标文件写入
num = source.read(buf); //从源文件读取数据
}
}
catch (IOException iox) {
System.out.println("Problem reading or writing");
return false;
}
return true;
}
-------------------
以上请注意byte[] buf = new byte[512],说明每次只读512字节,请更换每次读取的缓冲字节数,比如byte[] buf = new byte[5120],每次读5mb左右,请试试copy 效率回有所提高吗?请截图回答。
(2)需时多少可以通过CPU时钟计算,方法见下。
Calendar start=Calendar.getInstance();
new BinaryFileCopy().copy(args[0], args[1]);
Calendar end=Calendar.getInstance();
long time=end.getTimeInMillis()-start.getTimeInMillis();
System.out.println("copy时间为"+time+"毫秒");
(3)因为这个程序执行需要输入参数的,所以在eclipse里面不能直接执行的,要到
dos界面去执行,这里命令行的写法就有点讲究了。
首先,运行的是class文件,你先要找到class文件而不是java源代码文件,一般放在项目的bin目录下,因此必须在bin目录下执行,第二执行class文件的程序是java,课本第5页最后几行有介绍,比如运行当前目录下的HelloWorld.class,语法为:java HelloWorld,注意,必须在bin目录下执行
第三,如果你的类是在一个包里,比如我这个类Exe6_2.class在包charp6里面,写法为java charp6.Exe6_2
第四,这个copy程序需要输入两个参数,一个源文件,一个目标文件,记得参数文件名要有后缀名,具体见下截图。
当byte[] buf = new byte[512]时,该程序的代码如下:
package zi;
import java.io.*;
import java.util.Calendar;
class BinaryFileCopy {
String sourceName, destName;
FileInputStream source;
FileOutputStream dest;
String line;
//打开源文件和目标文件,无异常返回true
private boolean openFiles() {
try {
source = new FileInputStream(sourceName );
}
catch ( IOException iox ) {
System.out.println("Problem opening " +sourceName );
return false;
}
try {
dest = new FileOutputStream(destName);
}
catch ( IOException iox )
{
System.out.println("Problem opening " + destName );
return false;
}
return true;
}
//复制文件
private boolean copyFiles() { //这个私有方法用来拷贝文件,如无异常返回true try {
byte[] buf = new byte[512];
int num = source.read(buf); //从源文件读取数据
while (num > 0) {// 只要能够读取数据,就继续读
dest.write(buf, 0, num); //向目标文件写入
num = source.read(buf); //从源文件读取数据
}
}
catch (IOException iox) {
System.out.println("Problem reading or writing");
return false;
}
return true;
}
//关闭源文件和目标文件
private boolean closeFiles() {
boolean retVal=true;
try {
source.close();
}
catch ( IOException iox ) {
System.out.println("Problem closing " + sourceName );
retVal = false;
}
try {
dest.close();
}
catch ( IOException iox ) {
System.out.println("Problem closing " + destName );
retVal = false;
}
return retVal;
}
//执行复制
public boolean copy(String src, String dst ) {
sourceName = src ;
destName = dst ;