如何重新定位一个己经到文件尾的文件流?

drugon 2004-08-11 02:24:38
在一个文件操作里面,假如我们不用java中的RandomAccessFile类,而用一般的FileInputStream,FileOutputStream,FileReader,FileWriter这几个类,如果有一个文件输入流对象in,经过我们不断的读取文件后,这个流对象不断的向文件尾靠近。现在就是这个流对象到达了文件尾,而我们还需要再一次的去读这个文件,我们如何将它重新定向到文件的开始位置?
在线等,一定给分!
...全文
279 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
registered 2004-08-11
  • 打赏
  • 举报
回复
to alaal(穷街):
本例中抛出异常后不会重置流

异常代表一种错误
如果你不处理这种错误那他就是 Bug
如果你是在作试验, 这样压制异常无所谓
如果你是在做产品, 你这样的实现方法是不妥的 ,而且容易埋下隐患
drugon 2004-08-11
  • 打赏
  • 举报
回复
谢谢,看了你们的意见,然后我又自己试了一下,搞懂了,结帖。
qazxsw1982103 2004-08-11
  • 打赏
  • 举报
回复
shine333(enihs) 的方法可行

你要是真考虑到效率的话,还是用RandomAccessFile吧
alaal 2004-08-11
  • 打赏
  • 举报
回复
to registered(已注册)

是抛出异常 ,但你能告诉我加比不加有什么好处吗?
registered 2004-08-11
  • 打赏
  • 举报
回复
to drugon(personal):
如果你使用 br.mark(1),
读两个字节 mark 标签就作废, 调用 reset() 时会产生异常;
br.mark(fileSize + 1) 代表将文件读完后标签不作废;
mark 是在当前位置设置标签, reset 是跳转到设置好的标签的位置

to alaal(穷街):
不设置 mark 默认是抛出异常
alaal 2004-08-11
  • 打赏
  • 举报
回复
也可以,那不是费事吗?不设置mark默认的就是回到流首
drugon 2004-08-11
  • 打赏
  • 举报
回复
请问br.mark(fileSize + 1);和br.mark(1)有什么区别吗?为什么不能直接用mark(1)将文件流直接指到文件开头的地方?
registered 2004-08-11
  • 打赏
  • 举报
回复
import java.io.*;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2004-8-11
* Time: 14:58:40
* To change this template use File | Settings | File Templates.
*/
public class StreamMark {
public static void main(String[] args) throws IOException {
FileInputStream fis;
InputStreamReader isr;
BufferedReader br;
int fileSize;
int data;

fis = new FileInputStream("StreamMark.java");
fileSize = fis.available();
isr = new InputStreamReader(fis);
br = new BufferedReader(isr, fileSize);

System.out.println(fis.markSupported());
System.out.println(br.markSupported());
System.out.println(isr.markSupported());

for (int i = 0; i < 3; i++) {
br.mark(fileSize + 1); // Bypass EOF
while ((data = br.read()) != -1) {
System.out.print((char)data);
}
br.reset();
System.out.println("\ni = " + i);
}
}
}

正常情况下读写是一定要 Buffer 的
如果文件非常小, 可以将文件完全 Buffer, 同时实现 mark() 和 reset() 功能
如果是大文件, 可以选择部分 Buffer
将 br = new BufferedReader(isr, fileSize); 中的 fileSize 换为希望的 Buffer 大小即可
alaal 2004-08-11
  • 打赏
  • 举报
回复
in.reset() 如果没有mart()方法的话 可设置流从头读起
drugon 2004-08-11
  • 打赏
  • 举报
回复
TO shine333(enihs):

这样在做法上是绝对行得通的,但这样不太好吧,好象一般流的创建和关闭都是要花很多资源和时间的。
drugon 2004-08-11
  • 打赏
  • 举报
回复
如果不用RandomAccessFile.seek(0),而用FileInputStream,FileReader这样的类时,又是如何处理?
shine333 2004-08-11
  • 打赏
  • 举报
回复
最简单,但一定不是最好的方法,关掉原来的,new 一个新的FileInputStream
andy_zhang_ping 2004-08-11
  • 打赏
  • 举报
回复
以-1来判断是不是结束
RandomAccessFile.seek(0)是到起点

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧