使用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个字节!
所以在操作文件流的时候尽量避免使用缓存流,非文本文件也要尽量避免使用字符流!
代码如下:
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个字节!
所以在操作文件流的时候尽量避免使用缓存流,非文本文件也要尽量避免使用字符流!
相关文章推荐
- 使用JavaScript面向对象编程展现报表数据
- 【effective java】读书笔记 序和引言
- javascript中的删除方法
- JQuery上传插件Uploadify
- Bootstrap标签页(Tab)插件事件
- jQuery+Ajax+PHP实现异步分页数据显示
- LintCode-剑指Offer-(380)两个链表的交叉
- jquery.easing.js的使用示例
- Bootstrap 教程 之 CSS 概览
- 用jquery循环map
- 2015年11-12
- LintCode-剑指Offer-(41)最大子数组
- bs交互js的模态对话框
- 【HTML5】WebSocket和SSE
- jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)
- 纯CSS气泡效果
- javascript 之ajax浅谈
- Bootstrap 教程
- <html5+css3+js>判断和循环
- javascript 数据类型判断