课上简单内容指针一直从0开始不是会变成死循环?
int bytes = in.read(buf,0,buf.length);这个返回值,是你读到的实际个数,例如:你buf new的事1024,但是你文件中只要100个,bytes就= 100;如果文件超过1024字节,一次读会返回1024,第二次读的时候,指针从1024再开始读,每次1024个字节读,知道读完,所以bytes 返回值,要么是1024,要么是最后一次读到数据,但是不足1024,返回实际值,再读一次 就是EOF(结尾),返回-1
不足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]
。。。。。。。。
。。。。。。。。
。。。。。。。。
循环好几遍
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为止