文件上字节流读取如果buf不够循环条件应该怎么写

来源:4-2 字节流之文件输入流FileInputStream-2

刃殇

2016-04-20 17:04


课上简单内容指针一直从0开始不是会变成死循环?

写回答 关注

3回答

  • 慕粉3161473
    2016-04-20 18:08:52
    已采纳

    int bytes = in.read(buf,0,buf.length);这个返回值,是你读到的实际个数,例如:你buf new的事1024,但是你文件中只要100个,bytes就= 100;如果文件超过1024字节,一次读会返回1024,第二次读的时候,指针从1024再开始读,每次1024个字节读,知道读完,所以bytes 返回值,要么是1024,要么是最后一次读到数据,但是不足1024,返回实际值,再读一次 就是EOF(结尾),返回-1

    海与千巷

    感谢,解决了我的疑惑

    2016-09-06 15:52:54

    共 2 条回复 >

  • 染红_街道
    2016-07-03 09:30:37

    不足1024的话它循环读取,郁闷  你帮我看下

    package icetest;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Scanner;
    import java.util.concurrent.CountDownLatch;
    
    public class FilesInputStream方法读文件练习 {
    
        //F:\KwDownload\Lyric\洛天依-生.lrc
        
        public static void printToHex(String fileName) throws IOException {
            int num = 0;
            int count = 0;
            byte[] buf = new byte[8*1024];
            
            FileInputStream file;
            try {
                file = new FileInputStream(fileName);
                while ((num = file.read(buf)) != -1) {
                    for (int i=0; i<num; ++i) {
                        if (++count%5 == 0)
                            System.out.println();    
                        String st = new String(buf);
                        
                        System.out.print(st + "  ");
                    }
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                System.out.println("文件不存在!");
            }
            
        }
        
        /**
         * @param args
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            Scanner in = new Scanner(System.in);
            
            System.out.println("请输入要读取的文件:");
            String fileName = in.next();
            
            printToHex(fileName);
        }
    
    }

    我读一个歌词,下边是结果

    [00:03.72]作词 : 雨狸

    [00:05.84]作曲 : DELA

    [00:07.60]如果某一个时间 我能爱上一片树叶

    [00:13.16]那么某一个未来 我也能爱上某个人

    [00:18.60]他或读着海子的诗篇 或者遥远 远在天边

    [00:23.84]在某一个剧情转折点 带我前往明天

    [00:29.17]我曾在悲伤中流连 无法忘却

    [00:34.45]那一天现实与梦想无情地被撕裂

    [01:22.45]色彩于我不过无物 昼与夜失去了区别

    [01:27.81]却看得见尘霾颠簸 行走着空心的枯骨

    [01:33.25]终日畏惧陌生的视线 熟悉画面 活的一切

    [01:38.55]恨的情感最终也干瘪 在朝霞口中奄奄

    [01:43.62]谁看见我的黑夜 有无数的秃鹫在盘旋

    [01:53.22]荒凉的坟场地 予我安眠

    [01:59.18]无法理解 生者们惯用的语言

    [02:05.33]我曾在童话中哭泣 声嘶力竭

    [02:10.54]那一天谎言摧毁了 善恶的边界

    [02:15.84]对暴虐跪献上尊严 乞求谅解

    [02:21.12]只渴望灵魂能从这空白中被赦免

    [02:47.97]如果我能单纯爱上一片树叶

    [02:53.13]是否就能做到再次爱上这个世界

    [03:00.43]
    。。。。。。。。

    。。。。。。。。

    。。。。。。。。

    循环好几遍

  • 奈奈丸
    2016-04-21 17:00:12

    int bytes = in.read(buf,0,buf.length) 【方法原貌:read(byte[] b, int off, int len)】 

    题主可能不小心把off=0当作是读取的文件in的偏移量了,其实仔细看下off=0是字节数组buf的偏移量,他表示的是字节数组从buf[0]开始存储in读出来的字节

    所以当文件大于指定的字节数组大小(读取的文件比定义的buf空间还大)的时候,他会循环重新从buf[0]开始重头存储in读出来的字节(所以视屏中每read完一次,就处理读取完的数据buf),直到返回EOF(结尾)-1为止

文件传输基础——Java IO流

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

133755 学习 · 1030 问题

查看课程

相似问题