java – 使一个InputStream不止一次读取,而不管markSupported()

我需要能够多次重复使用java.io.InputStream,并且我认为以下代码可以工作,但它只能在第一次工作.

public class Clazz
{
  private java.io.InputStream dbInputStream, firstDBInputStream;
  private ArrayTable db;

  public Clazz(java.io.InputStream defDB)
  {
    this.firstDBInputStream = defDB;
    this.dbInputStream = defDB;
    if (db == null)
      throw new java.io.FileNotFoundException("Could not find the database at " + db);
    if (dbInputStream.markSupported())
      dbInputStream.mark(Integer.MAX_VALUE);
    loadDatabaseToArrayTable();
  }

  public final void loadDatabaseToArrayTable() throws java.io.IOException
  {
    this.dbInputStream = firstDBInputStream;
    if (dbInputStream.markSupported())
      dbInputStream.reset();

    java.util.Scanner fileScanner = new java.util.Scanner(dbInputStream);
    String CSV = "";
    for (int i = 0; fileScanner.hasNextLine(); i++)
      CSV += fileScanner.nextLine() + "\n";
    db = ArrayTable.createArrayTableFromCSV(CSV);
  }

  public void reloadDatabase()//A method called by the UI
  {
    try
    {
      loadDatabaseToArrayTable();
    }
    catch (Throwable t)
    {
      //Alert the user that an error has occurred
    }
  }
}

Note that ArrayTable is a class of mine, which uses arrays to give an interface for working with tables.

在这个程序中,数据库在调用reloadDatabase()方法后立即直接显示给用户,因此任何涉及将初始读取保存到内存中的对象的解决方案都是无用的,因为它不会刷新数据(想想它)像浏览器一样;当你按“刷新”时,你希望它再次获取信息,而不仅仅是显示它第一次获取的信息.如何多次读取java.io.InputStream?

解决方法:

您不一定能多次读取InputStream.有些实现支持它,有些则不支持.你正在做的是检查markSupported方法,如果你可以读两次相同的流,这确实是一个指标,但是你忽略了结果.您必须调用该方法以查看是否可以两次读取流,如果不能,则进行其他安排.

编辑(回应评论):当我写回答时,我的“其他安排”是获得一个新的InputStream.但是,当我在你的评论中读到关于你想做什么的问题时,我不确定是否可能.对于操作的基础知识,您可能需要RandomAccessFile(至少这是我的第一个猜测,如果它有效,那将是最简单的) – 但是您将遇到文件访问问题.你有一个应用程序主动写入文件,另一个读取该文件,你将遇到问题 – 究竟哪些问题将取决于操作系统,所以无论什么解决方案需要更多的测试.我建议在SO上提出一个单独的问题,那个尝试过这个问题的人可能会给你更多的见解.

上一篇:Java资源关闭


下一篇:java – 用于进度报告的InputStream或Reader包装器