以-1来判断是不是结束
RandomAccessFile.seek(0)是到起点

解决方案 »

  1.   

    最简单,但一定不是最好的方法,关掉原来的,new 一个新的FileInputStream
      

  2.   

    如果不用RandomAccessFile.seek(0),而用FileInputStream,FileReader这样的类时,又是如何处理?
      

  3.   

    TO shine333(enihs):这样在做法上是绝对行得通的,但这样不太好吧,好象一般流的创建和关闭都是要花很多资源和时间的。
      

  4.   

    in.reset() 如果没有mart()方法的话 可设置流从头读起
      

  5.   

    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.Supported());
            System.out.println(br.Supported());
            System.out.println(isr.Supported());        for (int i = 0; i < 3; i++) {
                br.(fileSize + 1); // Bypass EOF
                while ((data = br.read()) != -1) {
                    System.out.print((char)data);
                }
                br.reset();
                System.out.println("\ni = " + i);
            }
        }
    }正常情况下读写是一定要 Buffer 的
    如果文件非常小, 可以将文件完全 Buffer, 同时实现 () 和 reset() 功能
    如果是大文件, 可以选择部分 Buffer
    将 br = new BufferedReader(isr, fileSize); 中的 fileSize 换为希望的 Buffer 大小即可
      

  6.   

    请问br.(fileSize + 1);和br.(1)有什么区别吗?为什么不能直接用(1)将文件流直接指到文件开头的地方?
      

  7.   

    to drugon(personal):
    如果你使用 br.(1),
    读两个字节  标签就作废, 调用 reset() 时会产生异常;
    br.(fileSize + 1) 代表将文件读完后标签不作废;
     是在当前位置设置标签, reset 是跳转到设置好的标签的位置to alaal(穷街):
    不设置  默认是抛出异常
      

  8.   

    to registered(已注册) 是抛出异常 ,但你能告诉我加比不加有什么好处吗?
      

  9.   

    shine333(enihs) 的方法可行你要是真考虑到效率的话,还是用RandomAccessFile吧
      

  10.   

    to alaal(穷街):
    本例中抛出异常后不会重置流异常代表一种错误
    如果你不处理这种错误那他就是 Bug
    如果你是在作试验, 这样压制异常无所谓
    如果你是在做产品, 你这样的实现方法是不妥的 ,而且容易埋下隐患