A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 多多 中级黑马   /  2013-9-12 00:16  /  1309 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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 "  为啥会这样呢?

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 淡定

查看全部评分

6 个回复

倒序浏览
字符流有些忘了,不过你写入的是int,输出就是int类型吧!试改成String看一下
回复 使用道具 举报
本帖最后由 杨成 于 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编码的方式读取文件和写文件。

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

回复 使用道具 举报
把21行改成这样就可以了System.out.println(new String(b,0,len));这样就把文件复制那另一个文件了,

回复 使用道具 举报
杨成 发表于 2013-9-12 01:08
首先,public int read()
         throws IOException从此输入流中读取一个数据字节。

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

...

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

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马