当前位置: 首页 > 面试题库 >

不管markSupported()如何,都使一次InputStream读取一次以上

夹谷星纬
2023-03-14
问题内容

我需要能够重复使用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
    }
  }
}

请注意,ArrayTable是我的一类,它使用数组来提供用于处理表的接口。

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


问题答案:

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

编辑(回应评论):当我写下答案时,我的“其他安排”是获得一个新的InputStream。但是,当我读到您对您想做什么的问题的评论时,我不确定是否有可能。对于该操作的基础知识,您可能需要RandomAccessFile(至少这是我的第一个猜测,如果可行,那将是最简单的方法)-但是,您将遇到文件访问问题。您有一个正在积极地写入文件的应用程序,而另一个正在读取该文件的应用程序则会遇到问题-
确切的问题将取决于操作系统,因此无论哪种解决方案都需要进行更多测试。我建议在此问题上提出一个关于SO的单独问题,尝试过该问题的人也许可以为您提供更多见解。



 类似资料:
  • 问题内容: 我想使用其中包含图像。 我不想使用,因为我想将此主体直接写入文件并希望对其进行解码,所以我只想使用对内容的引用来传递给进一步的函数调用, 我尝试创建读取器的多个实例,如下所示 但是在第二次通话中它总是导致。 请帮助我如何为同一读者传递多个单独的参考? 问题答案: 被视为流。因此,您无法阅读两次。想象一下传入的TCP连接。您无法倒带进来的内容。 但是您可以使用复制流: Go Playgr

  • 问题内容: 我有一个文件的InputStream,我使用apache poi组件像这样从中读取: 问题是我需要多次使用同一流,并且POIFSFileSystem在使用后会关闭流。 缓存来自输入流的数据,然后将更多输入流提供给不同的POIFSFileSystem的最佳方法是什么? 编辑1: 高速缓存是指存储供以后使用,而不是用来加速应用程序。将输入流读入数组或字符串,然后为每次使用创建输入流是否更好

  • 问题内容: 是否有比从Python中的文件一次读取第二行更好的方法呢? 我在2.5.4中。较新版本有何不同? 编辑:删除的答案指出:在py3k中,您需要执行next(f)而不是f.next()。更不用说打印更改 问题答案: import itertools las,需要Python 2.6或更高版本;2.5仅具有,如果有奇数行,它将截断最后一行。当然,提供与生成器相同的功能非常容易。 这是一个更一

  • 问题内容: 我有一个千兆字节的JSON文件。该文件由每个不超过几千个字符的JSON对象组成,但是记录之间没有换行符。 使用Python 3和模块,如何一次将一个JSON对象从文件读入内存? 数据在纯文本文件中。这是类似记录的示例。实际记录包含许多嵌套的字典和列表。 以可读格式记录: 实际格式。新记录一个接一个地开始,没有任何中断。 问题答案: 一般而言,将多个JSON对象放入一个文件会使该文件 无

  • 问题内容: 我正在编写一个解析文本文件的python脚本。此文本文件的格式是这样的,文件中的每个元素都使用两行,为了方便起见,我想在解析之前先读取这两行。可以用Python完成吗? 我想要一些类似的东西: 但这打破了这样的说法: ValueError:混合迭代和读取方法将丢失数据 问题答案: 这里有类似的问题。您不能混合使用迭代和readline,因此您需要使用其中之一。

  • 我在三个阶段阅读xml文件,在每个阶段,我对不同的元素感兴趣,基于输入参数。 使用XMLStreamReader多次读取一个xml文件的最佳方法是什么? 其中inputStream是FileInputStream实例 目前,我得到了StreamClosed异常或streamReader。当我开始第二阶段读取时,hasNext()为false。