黑马程序员技术交流社区

标题: 字节流的一些问题 [打印本页]

作者: 多多    时间: 2013-9-12 00:16
标题: 字节流的一些问题
  1. package cn.itcast.ios;
  2. /*
  3. * 任意的文件复制,这样的话需要使用字节流,字节流可以读取任意类型的文件
  4. */
  5. import java.io.*;
  6. public class StreamCopyFile {
  7. public static void main(String[] args) {


  8. FileInputStream fis=null;
  9. FileOutputStream fos=null;
  10. try{
  11. fis=new FileInputStream("c:\\read.txt");
  12. fos=new FileOutputStream("d:\\read.txt");
  13. byte [] b=new byte[1024];
  14. /*int len;
  15. while((len=fis.read(b))!=-1){
  16. //一个汉字占两个字节,一个字节等于8个二进制位.一个char类型=两个字节
  17. //len表示字节数
  18. fos.write(b);
  19. System.out.println(b,0,len);
  20. }*/
  21. int len;
  22. //len表示读取到的有效字节,一个汉字等于两个字节.
  23. while((len=fis.read())!=-1){
  24. fos.write(len);
  25. System.out.print(len);
  26. }

  27. }catch(IOException e){
  28. e.printStackTrace();
  29. throw new RuntimeException("文件复制失败");
  30. }finally{
  31. try{
  32. if(fis!=null){
  33. fis.close();
  34. }
  35. }catch(IOException e){
  36. e.printStackTrace();
  37. throw new RuntimeException("文件写入关闭失败");

  38. }

  39. try{
  40. if(fos!=null){
  41. fos.close();
  42. }
  43. }catch(IOException e){
  44. e.printStackTrace();
  45. throw new RuntimeException("文件读取关闭失败");

  46. }
  47. }
  48. }
  49. }
复制代码
c:\\read.txt 中的文件"TYyyyuiijjkkl起床了!新的一天,小项目搞起."  复制到d:\\read.txt中内容为"TYyyyuiijjkkl起床了!新的一天,小项目搞起."但是在控制台中输出"84 89 121 121 121 117 105 105 106 106 107 107 108 198 240 180 178 193 203 33 208 194 181 196 210 187 204 236 44 208 161 207 238 196 191 184 227 198 240 46 "  为啥会这样呢?


作者: 潘才新    时间: 2013-9-12 00:37
字符流有些忘了,不过你写入的是int,输出就是int类型吧!试改成String看一下
作者: 杨成    时间: 2013-9-12 01:08
本帖最后由 杨成 于 2013-9-12 01:34 编辑

首先,public int read()
         throws IOException从此输入流中读取一个数据字节。

返回的是一个int类型,经历一个过程,从Byte->int,当然中文也不例外,但是是根据采用编码表的不同,返回同样一个汉字的int值是不同的。

测试代码块:

byte[]  b="TYyyyuiijjkkl起床了!新的一天,小项目搞起".getBytes();
for(byte bi:b){
       System.out.print((int)bi);
}


结果:
8489121121121117105105106106107107108-58-16-76-78-63-5333-48-62-75-60-46-69-52-2044-48-95-49-18-60-65-72-29-58-16


前半段英文的和你的结果一样,后面一到中文就不一样了,那是因为你采用的是默认GBK编码的方式读取文件和写文件。

作者: 依旧    时间: 2013-9-12 14:40
把21行改成这样就可以了System.out.println(new String(b,0,len));这样就把文件复制那另一个文件了,


作者: 多多    时间: 2013-9-12 21:40
杨成 发表于 2013-9-12 01:08
首先,public int read()
         throws IOException从此输入流中读取一个数据字节。

但是文件怎么又能正常复制呢?
作者: 多多    时间: 2013-9-12 21:51
依旧 发表于 2013-9-12 14:40
把21行改成这样就可以了System.out.println(new String(b,0,len));这样就把文件复制那另一个文件了,

...

这是单个字符复制的.没用使用数组.那样不行
作者: 杨成    时间: 2013-9-13 02:29
你看你字符串的前半段TYyyyuiijjkkl,这个通过read方法读取后,返回的是int类型,例如,T这个字符,他在GBK编码表对应的数值是84,你直接打印的话,也是显示的84,如果你把System.out.print(len)改为
System.out.print((char)len),这样就和你用文本编辑器打开的效果一样了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2