今天看来IO那章,然后写了个复制的程序,对于一般的小文本文件复制是没问题的,但是对于大文件(我用来测试的是8M的pdf文件,就存在问题了。)
首先说明下贴的图片,最上面的原文件,第二行是用BufferedReader跟BufferedWriter实现的复制,第三行是直接用InputStream跟OutputStream实现的。
发现第三行的总比第一行大,而且复制的结果都比原文件小,更有趣的是,beCopyed.pdf竟然能运行,而其他都不可以。第二行jsp.pdf是合理一点的,后面那个因为缺乏经验,没有加上dr.newLine();
具体原因还没研究出来,代码如下:
Buffered的
import java.io.*;
public class TestBuffered {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
BufferedReader br = null;
BufferedWriter bw = null;
try{
fr = new FileReader("e:/JSP高级编程(希望版).pdf");
fw = new FileWriter("e:/jsp.pdf");
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
}catch(FileNotFoundException e){
System.out.println("找不到文件");
}catch(IOException e){
System.out.println("无法写文件");
}
String s = null;
try{
while((s = br.readLine()) != null){
bw.write(s);
bw.newLine();
}
}catch(IOException e){
System.out.println("复制文件出错");
}finally{
try{
bw.flush();
bw.close();
br.close();
fr.close();
fw.close();
}catch(IOException e){
System.out.println("关闭文件出错");
}
}
System.out.println("文件复制完成");
}
}
Stream的:
import java.io.*;
public class TestFileInputStream {
public static void main(String[] args) {
InputStream is = null;
OutputStream os =null;
int b;
try{
is = new FileInputStream("e:/1.txt");
os = new FileOutputStream("e:/s1.txt");
}catch(FileNotFoundException e)
{
System.out.println("File not found");
}
try {
while((b = is.read()) != -1){
os.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
os.flush();
os.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("finish");
}
}
}
后话:刚刚用文本来查看了下,发现使用BufferedReader和BufferedWriter实现可以清楚看到字符,完全没有乱码,而用Stream实现的却跟原文件一样,有不少乱码,看来这就是根本远远,应该跟“/”有关。
刚刚又用BufferedInputStream跟BufferedOutputStream来实现,终于完美地复制出来了。同时也发现原来第三行用InputStream跟OutputStream实现复制出来的那个文件竟然大小增加,而且也刚好跟原文件大小一致!