【发布时间】:2011-12-05 16:28:29
【问题描述】:
我需要能够多次重复使用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?
【问题讨论】:
-
一种方法是读取整个
byte[]并将它们用作ByteArrayInpoutStream的构造函数。这些资源有多大(通常)? -
你所说的'使用..多次..'是什么意思?你在哪里使用多次使用的代码?需要更明确的输入。
-
@AndrewThompson 很大。我们的想法是能够将 Excel 或(在这种情况下)CSV 电子表格加载和重新加载到该程序中,以便外部程序可以对其进行编辑以进行自定义。
-
我的意思是我希望方法
loadDatabaseToArrayTable()被多次调用,并且每次都有效。当我第二次或更长时间调用它时,fileScanner.hasNextLine()不断返回false,但第一次,它完美运行。
标签: java io inputstream