为了账号安全,请及时绑定邮箱和手机立即绑定

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


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

正在回答

3 回答

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

3 回复 有任何疑惑可以回复我~
#1

刃殇 提问者

非常感谢!
2016-04-23 回复 有任何疑惑可以回复我~
#2

海与千巷

感谢,解决了我的疑惑
2016-09-06 回复 有任何疑惑可以回复我~

不足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]
。。。。。。。。

。。。。。。。。

。。。。。。。。

循环好几遍

0 回复 有任何疑惑可以回复我~

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为止

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信