黑马程序员技术交流社区

标题: io两种对文件的读取,读取结果不一致,还有乱码 [打印本页]

作者: q527198615    时间: 2014-3-4 17:16
标题: io两种对文件的读取,读取结果不一致,还有乱码
  1. package com.itheima;

  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileReader;
  6. import java.io.IOException;

  7. public class IoDemo {
  8.        
  9.         public static void main(String[] args) {
  10.                 File file = new File("C:/Users/Administrator/Desktop/read.txt");
  11.                 reader(file);
  12.                 read(file);
  13.         }
  14.        
  15.         public static void reader(File file){
  16.                 FileReader fr;
  17.                 try {
  18.                         fr = new FileReader(file);
  19.                         char[] buffer = new char[(int) file.length()];
  20.                         int len;
  21.                         while((len = fr.read(buffer))!=-1){
  22.                                 System.out.println(new String(buffer));
  23.                         }
  24.                        
  25.                 } catch (IOException e) {
  26.                         e.printStackTrace();
  27.                 }
  28.         }
  29.        
  30.         public static void read(File file){
  31.                 try {
  32.                         FileInputStream fis = new FileInputStream(file);
  33.                         byte[] buffer = new byte[(int) file.length()];
  34.                         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  35.                         int len;
  36.                         while((len=fis.read(buffer))!=-1){
  37.                                 bos.write(buffer, 0, len);
  38.                         }
  39.                         System.out.println(bos.toString());
  40.                        
  41.                        
  42.                 } catch (IOException e) {
  43.                         // TODO Auto-generated catch block
  44.                         e.printStackTrace();
  45.                 }
  46.         }
  47. }
复制代码
两种打印不出来的一致,第一种后面会多出来一些乱码!这是为什么呢?
作者: q527198615    时间: 2014-3-4 21:50
我研究了下是不是buffer数组的大小设置得不正确?但是即便是设置大了,也不会多出来一些乱码啊,顶多不显示了呗,奇怪了
作者: kevinmesss.tz    时间: 2014-3-4 22:09
file.length()返回的字节数的长度,一个字符等于二个字节
所以你这数组有一半的值是空的
然后你把整个数组解码了当然出现乱码了
而且你这种方法一次性开辟了很大的内存空间,如果文件过大会内存溢出
作者: q527198615    时间: 2014-3-4 22:12
kevinmesss.tz 发表于 2014-3-4 22:09
file.length()返回的字节数的长度,一个字符等于二个字节
所以你这数组有一半的值是空的
然后你把整个数组 ...

哦,意思是后面空的他也解析出来了是吧,这个有什么更好的解决方法呢,读取一个大文件。以前是用的多线程下载,你有什么更好的方法吗?是一边存一边就取?
作者: kevinmesss.tz    时间: 2014-3-4 22:18
q527198615 发表于 2014-3-4 22:12
哦,意思是后面空的他也解析出来了是吧,这个有什么更好的解决方法呢,读取一个大文件。以前是用的多线程 ...

我用我的两个文本文件测试了下并没有乱码
读取大文件一样
Reader方法里面read()是一个一个读。
read(byte[] b)是将字节读到字节数组中,然后在对字节数组进行解码
还可以加入缓冲BufferedReader
你这么读根本不用while循环,因为你就是一次性把数据读到数组中解码的
多啃啃视频吧,我IO啃了好几天都没啃透
作者: 年少丶    时间: 2014-3-4 22:44
大数据应该使用BufferedReader
作者: 水蓝    时间: 2014-3-12 23:38
你这段代码,两个比照一下,就可以看出:
字符流处理缓冲区的时候没有考虑已读取的长度的。
估计你忘了。
因为你下面处理字节流的时候是对的:
第39行:bos.write(buffer, 0, len);

所以呢,你应该做如下修改:
第24行:
System.out.println(new String(buffer));
应该改为:
System.out.println(new String(buffer,0,len););




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