sweetstar86 2016-02-12 12:34 采纳率: 60%
浏览 1456
已采纳

关于Java中FileInputStream类的一些新手疑问

在每次使用FileInputStream的read方法时,需要用到字节数组bytes和真实读取长度len,如代码:

 public static void read(){
        File file = new File("D:/学习/Android/代码/Workplace/Java_8_1_File/a.txt");
        try {
            //针对文件创建一个输入流
            InputStream in = new FileInputStream(file);
            byte[] bytes = new byte[1024*1024*10];//定义一个10MB的字节数组
            int len = -1;//每次真实读取的长度
            StringBuffer buf = new StringBuffer();

            try {
                while((len = in.read(bytes))!=-1){
                    buf.append(new String(bytes,0,len));
                }
                in.close();//关闭
                System.out.println(buf);
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

,其中在循环里,buf.append那一句中,每一次都把0处len字节数加入到buf中,那么倘若文件的数据是:
01234
为何最后输出的结果不是:
001012012301234
呢?

  • 写回答

2条回答 默认 最新

  • lambda-fk 2016-02-12 13:43
    关注

    首先呢这个bytes是干什么的?
    缓冲区,就是防止大数据量的时候,我们每次只读取一部分数据到缓冲区中进行操作
    那么这个len又是什么呢?
    它是实际的读取字节的数

    你如果学过数据结构就知道这是一种线性表的思想
    因为有时候读取的数据是不能填满这个bytes的,那么len就是实际的数

    你抓住读取思想:
    每次都是读取文件的bytes大小数据放到bytes数组中
    所以取的时候自然是从bytes的0处去取
    buf.append(new String(bytes,0,len));
    加上len,用于防止最后一次的操作错误,最后一次取的数据实际长度是小于等于bytes的长度的,如果小于,那么bytes还残留着上次的数据。
    所以使用len来读取最后一次实际取的数据。

    建议去看看线性表

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵