作者Neilhg (Arfken)
看板java
标题Re: [问题] Java I/O的问题
时间Thu May 30 22:19:50 2013
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: 这个篇文章当中充满了不确定的叙述
: ※ 引述《Neilhg (Arfken)》之铭言:
: : 请教板上的高手一些inputstream关念的问题
: : fin是一个File物件
: : fis = new FileInputStream(fin);
: : br = new BufferedReader(new InputStreamReader(fis));
: : String line = br.readLine(); .......
: : fis是一个FileInputStream物件
: : fis被使用来读取一个档案之後
: ^^^^^^^^^^^^^^^^^^^^^^
: : 并没有close掉,再继续使用fis物件读取档案的位元组到一个位元阵列
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: : 例如,fis.read(xx);
: : 但结果显示读到0个位元组
: : 把fis.close()之後,再重新new一个fis物件
: : 就可以正确读取了...
: : 还满不明白为什麽FileInputStream物件用过一次後不能重覆使用....
: : 感谢~
File fin = new File("xxxxx");
fis = new FileInputStream(fin);
br = new BufferedReader(new InputStreamReader(fis));
String line = br.readLine();
int count = 0;
while (line != null) {
System.out.println(line);
line = br.readLine();
count++;
}
System.out.println("共读到" + count + "行");
//fis.close();
//fis = new FileInputStream(fin);
int total = 0;
count = 0;
byte[] ba = new byte[8192];
while ((count = fis.read(ba)) != -1) {
total += count;
}
System.out.println("共读到" + total + "个位元组");
很抱歉我以为我的问题很简单,用文字描述就够了
上面是我想问的问题相关的码
我不太懂的是 当我没有注解那两行(fis.close();fis = new FileInputStream(fin);)
执行出来会得到"共读到0个位元组"
但是注解那两行取消掉,就会得到正确的答案
我心里的想法是一个物件new出来之後不是可以重复使用吗?
所以我new一个fis = new FileInputStream(fin)物件就好了
为何再让fis物件读一次档会读到0个位元组
一定要重新new一个物件fis来读档? 旧的fis就不能用了吗?
旧的fis就一直让它在记忆体内吗?
不太懂背後的原因
谢谢赐教
: 我不太懂你为甚麽要重复使用(嫌弃 GC?)
: 重点是... 如果你已经读到没有东西了
: (我假设你那句「使用来读取一个档案之後」是这个意思)
: 那麽,人家都精尽人亡了,你还要人家可以 read() 到东西
: 这样会不会太过分了点?
: 或着反过来说,如果这样还读得到东西
: 那你永远不知道什麽时候档案读完 [死]
: 以上毫无反应,就只是个算命文
: 我相信乡民们看我这种无意义的算命文也看的很厌烦了
: 请你把你的剧本 / 程式码叙述的完整一点
: 这样才可能快速地解决你的问题
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.80.239.79
1F:推 PsMonkey:程式码也不缩排,然後我算命已经算中了你还发文问? 05/30 22:21
2F:→ cuteclare:本来就不是设计成要这样用的啊...不爽不要用啦 ! 05/30 22:30
3F:推 PsMonkey:楼上也太激动了点.... 05/30 22:34
4F:推 cuteclare:Q_Q 板主最近心情真好 05/30 22:37
5F:推 demisoda:流的游标已跑到档案的最後,再new一个是类似重置游标 05/30 22:39
6F:→ PsMonkey:囧> 我一直都这样阿... 上一篇的 ph 值应该也没多高 XD 05/30 22:42
7F:→ realmeat:你有看过河水倒流吗? XDXD 05/30 22:49
8F:→ cuteclare:mm 突然想问原po期望它可以read到啥东西 05/30 22:54
9F:推 mars90226:我想你要先懂Stream的概念,不过你可以rewind 05/30 23:02
10F:→ mars90226:Java FileInputStream竟然没有rewind...(倒) 05/30 23:05
11F:→ realmeat:rewind 不是c的鬼东西吗? XDXD 05/30 23:13
12F:推 fonz:画个图 fin没有注解那两行~最後指在哪里吧 加油~ 05/31 00:24
13F:→ fonz: fis打错了=_=" 05/31 00:26
14F:推 sbrhsieh:有mark/reset,非每个inputstream实作都支援 05/31 03:41
15F:推 sbrhsieh:还有java.io.RandomAccessFile可选用 05/31 03:46
16F:→ gmoz:缩排一下好不好= = 05/31 13:50
17F:→ gmoz:然後你先去搞清楚什麽是Stream 跟FileInputStream的运作原理 05/31 13:52