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. Linux 压缩解压及备份命令

    linux中压缩与备份命令总结一.压缩与解压缩 1.compress [-rcv] 文件或目录 <==压缩 uncompress 文件.Z <==解压缩 -r:可以连同目录下的文件也同时进 ...

  2. 每天一个linux命令(34)--top命令

    今天给领导发邮件,我这边虽然显示发出去了,但是他那边一直没收到,结果我以为我发了,他又一直在那边等结果.所以说,以后要另外发个信息或者QQ微信之类的说一声. top命令是Linux 下常用的性能分析工 ...

  3. smarty模板基础2

    Smarty自带了一些内置函数,这些内置函数是Smarty模板引擎的组成部分.他们被编译成相应的内嵌PHP代码,以获得最大性能. 您创建的自定义函数不能与内置函数同名,也不必修改这些内置函数. 其中一 ...

  4. asp.net 将ppt,word转化为pdf实现在线浏览详解

    1.首先添加应用:COM里面的Micsosoft Office 12.0 Object Library(VS2013基本都有14.0或者15.0 有的话一样的添加,因为我的没有只有12.0) : 2. ...

  5. nodejs中的路由

    一.路由初步 url.parse(string).query | url.parse(string).pathname | | | | | ------ -------------------http ...

  6. SqlService 索引原理

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  7. Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)

    1,这一篇博客是和大家一起来封装我们最后的Dagger2,其实之前也写过关于简单的Dagger2,这里是地址,完全没了解的同学可以先去看一下这篇,感谢很多小伙伴一直在耐心的等待这一篇 2,Dagger ...

  8. Web纯前端“旭日图”实现元素周期表

    一.什么是旭日图 旭日图是在Excel 2016中新增的一种图表.有些类似饼图,饼图的优势是可以显示占比.但是饼图只能显示单级数据.旭日图用来表示多层级数据的占比.旭日图以一种分层方式显示,非常适合用 ...

  9. koahub.js 0.09 发布,新增钩子机制

    koahubjs发布0.09 新增钩子机制添加钩子机制,控制器钩子和函数钩子修复自动加载bug,实现除自动加载导出的default外,还能自动加载其他的方法记koahubjs钩子开发过程在使用koah ...

  10. 唐伯猫的 sql server 2008 的安装和操作记录

    在服务器win 2008 server r2 上安装sql 首先下载sql  server 2008  ,云盘有存储sql,很多论坛也有下载SQLEXPRADV_x64_CHS.exe 双击sql s ...