您的位置:首页 > Web前端

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

2015-11-29 17:28 423 查看
        问题描述: 在使用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个字节!

所以在操作文件流的时候尽量避免使用缓存流,非文本文件也要尽量避免使用字符流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: