java BufferedReader问题
FileReaderfr=newFilereader(file);\\file即文件路径BufferedReaderbr=newBufferedReader(fr);请问...
FileReader fr=new Filereader(file); \\file即文件路径
BufferedReader br=new BufferedReader(fr);
请问,在我将br通过read方法读取到fr的末尾之后,如何重置br使其能重新从fr第一行读取?
另外BufferedReader的mark方法如何使用?
嗯,所以对这种重复读取文件的情况还是新建个类进行存储比较好的说... 展开
BufferedReader br=new BufferedReader(fr);
请问,在我将br通过read方法读取到fr的末尾之后,如何重置br使其能重新从fr第一行读取?
另外BufferedReader的mark方法如何使用?
嗯,所以对这种重复读取文件的情况还是新建个类进行存储比较好的说... 展开
2个回答
展开全部
要解决楼主的问题非常简单,在生成br之后开始读数据前,mark一下,然后想回到第一行时reset一下就可以了。其实一般人对mark方法比较疑惑的是它里面的参数,要了解他参数的含义,先要了解BufferedReader的实现方式,从名字看他就是一个缓存,比如你文件有10000个字节,bufferedReader每次只缓存1000个字节。正常情况下,假设我现在缓存里面缓存的是1000到2000字节的内容,你在1500的时候mark了一下,那么你读到2500的时候,他的缓存会变成缓存1500-2500字节的内容,这个时候,他还是包含你的mark字节的,你这时候想reset还是可以的,但是你如果继续往下读,就不行了,因为他只能缓存1000个字节,你继续读得话你的mark字节他就丢失了。mark函数的参数就是这个意思,在你mark的地方往后n个字节之内你都是可以reset回来的,如果超过了,就不得行了。假设BufferedReader的缓存长度是8192(他默认就是8192),你的mark参数为n,如果n小于8192,是没有意义的,因为我本来就缓存了8192个字节,你在这个长度内都是任意reset的,如果n设置的大于8192,那么相当于你把bufferedReader的缓存长度变长了,这样也有坏处。
不知道我讲明白没有,总之,一般mark参数没有什么意义,主要看你定义BufferedReader的时候给他定义的缓存长度是多少。
不知道我讲明白没有,总之,一般mark参数没有什么意义,主要看你定义BufferedReader的时候给他定义的缓存长度是多少。
追问
有些细节的地方问下(虽然意义不大),见谅:
1、如果BufferReader(简称BR)缓存了100字符,读取20个字符后,BR是仍有100字符,但有个标记指向第21个;还是只剩80个字符?
2、如果第一个的答案是前者,那么mark本身可以理解为一个标记吗(reset时BR的标记重定位至mark)?
如果答案是后者则理解mark为另一个buffer或String?
追答
是前者,mark只是一个标记,他就是一个int,记录的是br里面当前缓存的一个下标值。br里的缓存是用一个char[]实现的。你自行mark方法时,他会把当前读到的地方(nextChar)赋值给这个mark。当然这个mark不是一直不变的,会随着char[]缓存的内容他自行会调整。具体的话我感觉用语言不好说,你最好吧BufferedReader的源码打开自己看下他的fill()方法
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询