FileReader是输入字符流,拷贝文件没问题,但拷贝图片就有问题了。

  假设是在windows下,FileReader用的是GBK码表,一个字符最多用2个字节代表。2个字节就是2的16次方,即有65536个格子范围,但GBK码表并没有将这些格子都用完,当读到某个二进制,假设是12421(我这里用二进制的十进制说明,二进制写起来太长)对应有码值“中”,那就读到完整的2个字节,数据是完整的。

  但如果是另一个数字21232没有对应字符(码值),FileReader读到这样的数据对应码表,找不到对应的字符,就会返回一个未知字符所对应的数字,占1个字节(返回值就是测试代码中的content)。既然字节大小读不完整,FileWriter写的时候还能正确吗?数据就是这样丢失的。

  我在说“中”的时候大家不要蒙圈,读图片为什么要谈到码表对应的汉字。汉字只是图片中二进制数据在码表上的对应字符,它可以是汉字以外的其它字符代表都可以,对于GBK码表没有用完的格子,FileReader读到的content就不是真实的数据。

  char[] cha = new char[1024];

  int content = 0;

  while((content = fileReader.read()) != -1){

  filewriter.writer(content);

}

  由此我们也能知道字节流为什么能读取完整,因为它不需要码表,读到啥就得到啥,不会因为码表上没有对应字符就丢弃。

  

  public static void copy() throws IOException {

    //目标文件

    File inFile = new File("/Users/mac/Documents/123.jpg");

    File destFile = new File("/Users/mac/downloads/456.jpg");

    //建立数据的输入输出通道

    FileInputStream fileInputStream = new  FileInputStream(inFile);

    FileOutputStream fileOutputStream = new FileOutputStream(destFile);

    //建立缓冲数据,边读边写

    byte[] buf = new byte[1024];

    int length = 0 ;   

    while((length = fileInputStream.read(buf)) != -1){

      fileOutputStream.write(buf,0,length);

    }  

    //关闭资源 原则: 先开后关,后开先关。

    fileOutputStream.close();

    fileInputStream.close();

  }

  打一个很好的彼方,用FileReader读图片,就像用记事本打开图片,因为记事本一遇到二进制数据就拿码表来“翻译”,可码表并不是每个格子都用到,容易导致数据丢失。

对比字节流和字符流,回答为什么FileReader不能用来拷贝图片的更多相关文章

  1. Java的字节流,字符流和缓冲流对比探究

    目录 一.前言 二.字节操作和字符操作 三.两种方式的效率测试 3.1 测试代码 3.2 测试结果 3.3 结果分析 四.字节顺序endian 五.综合对比 六.总结 一.前言 所谓IO,也就是Inp ...

  2. 牛客网Java刷题知识点之输入流、输出流、字节流、字符流、字节流的抽象基类(InputStream、OutputStream)、字符流的抽象基类(Reader、Writer)、FileWriter、FileReader

    不多说,直接上干货! IO流用来处理设备之间的数据传输. java对数据的操作是通过流的方式. java用于操作流的对象都在IO包中. IO流按操作数据分为两种:字节流和字符流. IO流按流向分为:输 ...

  3. Java IO(2)阻塞式输入输出(BIO)的字节流与字符流

    在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...

  4. JAVA基础之字节流与字符流

    个人理解: IO流就是将数据进行操作的方式,因为编码的不同,所以对文件的操作就产生两种.最好用字节流,为了方便看汉字等,(已经确定文字的话)可以使用字符流.每个流派也就分为输入和输出,这样就可以产生复 ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. (转)java字节流和字符流的区别

    转载: http://www.cnblogs.com/dolphin0520/category/361055.html 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同 ...

  7. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  8. Java字节流与字符流基本操作

    在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...

  9. Java中字节流和字符流的比较(转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...

随机推荐

  1. jiayuan

    8.2=http://files.cnblogs.com/files/bqh10086/jiayuan8.2pack.zip

  2. Linux CentOS下MySQL的安装配置之浅谈

    前期必备安装:VMware虚拟机,CentOS镜像[注意:Linux下使用CentOS   MySQL是不用在官网下载的,只需要配置就OK了] 下面开始正式操作: //CentOS安装MySQL之浅谈 ...

  3. 翻译:使用 Redux 和 ngrx 创建更佳的 Angular 2

    翻译:使用 Redux 和 ngrx 创建更佳的 Angular 2 原文地址:http://onehungrymind.com/build-better-angular-2-application- ...

  4. 【Zookeeper】源码分析之服务器(四)

    一.前言 前面分析了LeaderZooKeeperServer,接着分析FollowerZooKeeperServer. 二.FollowerZooKeeperServer源码分析 2.1 类的继承关 ...

  5. MySQL C#教程

    这是关于MySQL数据库的C#教程,包含了对MySQL数据库基本操作: 数据库访问组件MySql Connect/NET MySql Connect/NET是MySQL官方提供给C#的接口,封装的非常 ...

  6. python学习笔记(一)元组tuple

    元组由简单的对象组构成,元组与列表相似,但是元组不能在原处修改.元组位置有序的对象集合,元组通过偏移来访问. 为什么有了列表还要元组?元组的不变性提供了某种完整性,可以确保元组在程序中不被另一个引用修 ...

  7. VMware下ubuntu与Windows实现文件共享的方法

    最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下,就进行了共享文件夹的设置,期间遇到一些困难,记录下来,方便以后遇到此类问题不再困惑. (记录只为更好的分享) 言归正传: 1 ...

  8. JavaScript零基础入门

    为什么学习JavaScript 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. 3. 它可以让网页呈现各种动态效果. 易学性 1.学习环境无 ...

  9. RabbitMQ-从基础到实战(2)— 防止消息丢失

    转载请注明出处 1.简介 RabbitMQ中,消息丢失可以简单的分为两种:客户端丢失和服务端丢失.针对这两种消息丢失,RabbitMQ都给出了相应的解决方案. 2.防止客户端丢失消息 如图,生产者P向 ...

  10. 基于Intranet的零件库管理信息系统设计--part02

    昨天建了第一个子表,今天继续. 按照这个一个一个来: 轴承参数查询如下(来源:轴承查询型号网) 照这个来大概就是这么几个属性: 轴承主键,轴承名称,新型号,旧型号,内径,外径,宽度,Cr,Cor(话说 ...