使用BufferedReader和BufferedWriter复制文件时遇到的一点问题

来源:互联网 发布:类似猴赛雷的网络热词 编辑:程序博客网 时间:2024/05/10 09:18

        问题描述: 在使用BufferedReader和BufferedWriter来操作文件的复制时发现复制的文件经常性的会减少一部分字节数

代码如下:

   public class DemoClientFile {
    public static void main(String[] args) throws UnknownHostException, Exception {
        Socket socket=new Socket("10.0.158.50",5555);
        File file=new File("C:\\Documents and Settings\\Administrator\\桌面\\第四周\\2015-11-20(IO流)周五\\pro\\gentleman.mp3");
        String str=file.getName();
        System.out.println(str);
        BufferedWriter bwName=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bwName.write(str);
        bwName.newLine();
        bwName.flush();
        OutputStream fo=socket.getOutputStream();
        FileInputStream fos=new FileInputStream(file);
        byte[] b=new byte[1024];
        int len=0;
        while((len=fos.read(b))!=-1){
            fo.write(b, 0, len);
        }
        socket.shutdownOutput();
        fos.close();
        socket.close();
    }
}

public class DemoServerFile {
    public static void main(String[] args) throws Exception {
        ServerSocket ss=new ServerSocket(5555);
        Socket socket=ss.accept();
        BufferedReader brName=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String fileName=brName.readLine();
        File file2=new File("c:\\cc",fileName);
        InputStream is=socket.getInputStream();
        byte[] b=new byte[1024];
        int len=0;
        FileOutputStream fos=new FileOutputStream(file2);
        while((len=is.read(b))!=-1){
            fos.write(b, 0, len);
            
        }
        fos.close();
    }
}

仔细观察发现以下情况:

第一次读取的文件名为:a1.mp4

大小为:4,819,761字节
复制后的大小为: 4,803,385字节
 相差: 0,016,376字节

第二次读取的文件名为:gentleman.mp3

大小为:3,182,700字节
复制后的大小为: 3,166,331
相差:0,016,369字节

然后我在BufferedReader和BufferedWriter里面都发现了这样一行代码: private static int defaultCharBufferSize = 8192;

8192表示的是字符的长度,一个字符是2个字节即缓存流一次性读取的字节数为8192*2=16384

16384刚好是上面文件相差字节数+文件名字节数+2

16384=0,016,376+6+2

16384=0,016,369+13+2

那这个多余的2个字节又是什么呢?我发现我写了这样一行代码:        bwName.newLine();

这行代码表示写一个换行符过去,一个换行符在Java中是'\r''\n'刚好2个字节!

所以在操作文件流的时候尽量避免使用缓存流,非文本文件也要尽量避免使用字符流!

0 0
原创粉丝点击