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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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. }
复制代码
两种打印不出来的一致,第一种后面会多出来一些乱码!这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

6 个回复

倒序浏览
我研究了下是不是buffer数组的大小设置得不正确?但是即便是设置大了,也不会多出来一些乱码啊,顶多不显示了呗,奇怪了
回复 使用道具 举报
file.length()返回的字节数的长度,一个字符等于二个字节
所以你这数组有一半的值是空的
然后你把整个数组解码了当然出现乱码了
而且你这种方法一次性开辟了很大的内存空间,如果文件过大会内存溢出

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
kevinmesss.tz 发表于 2014-3-4 22:09
file.length()返回的字节数的长度,一个字符等于二个字节
所以你这数组有一半的值是空的
然后你把整个数组 ...

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

我用我的两个文本文件测试了下并没有乱码
读取大文件一样
Reader方法里面read()是一个一个读。
read(byte[] b)是将字节读到字节数组中,然后在对字节数组进行解码
还可以加入缓冲BufferedReader
你这么读根本不用while循环,因为你就是一次性把数据读到数组中解码的
多啃啃视频吧,我IO啃了好几天都没啃透

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
大数据应该使用BufferedReader
回复 使用道具 举报
水蓝 中级黑马 2014-3-12 23:38:10
7#
你这段代码,两个比照一下,就可以看出:
字符流处理缓冲区的时候没有考虑已读取的长度的。
估计你忘了。
因为你下面处理字节流的时候是对的:
第39行:bos.write(buffer, 0, len);

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

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

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