【问题标题】:Can same inputstream be used in streamreader可以在流阅读器中使用相同的输入流吗
【发布时间】:2012-08-07 19:42:00
【问题描述】:

我需要对文件进行处理,首先计算行数并与一个值进行比较。

下一个是逐行读取文件并进行验证。

如果第一个通过,我需要做第二个过程。

我使用 FTP 读取相同的文件。

当我尝试创建不同的输入流时...ftp 正忙于读取当前文件。

像这样:

(is1 = ftp.getFile(feedFileName);)

下面是剩下的:

 InputStream is = null;
LineNumberReader lin = null;
    LineNumberReader lin1 = null;
is = ftp.getFile(feedFileName);  
lin = new LineNumberReader(new InputStreamReader(is));

所以我可以像下面这样使用:

 is1=is;

两个流是否都具有从头到尾的文件内容,或者一旦读取第一个流对象,第二个对象将变为空。

那么剩下的唯一选择是创建一个新的 ftp 对象来单独读取流吗?

【问题讨论】:

  • “ftp 正忙于读取当前文件”是什么意思。有什么例外吗?
  • 是的,当我给 :is1=ftp.getFile(feedFileName); 时发生异常由于 ftp 已经在读取到 is.

标签: java stream inputstream


【解决方案1】:

可以,但您需要“倒带”输入流。首先你需要调用 mark() 方法,然后重置。以下是文档:http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#reset()

【讨论】:

  • 你能给我一个编码演示吗?
【解决方案2】:

使用完 LineNumberReader 后,关闭 InputStream is。然后重新从 FTP 请求文件,它就不会再忙了。您不能“只”从同一个 InputStream 中读取数据,因为 LineNumberReader 完成时可能已经耗尽。此外,并非所有 InputStreams 都支持 mark()reset() 方法。

但是,我建议仅在第一个过程成功时才执行第二个过程可能不是正确的方法。无论如何您都在流式传输数据,为什么不将其流式传输到一个临时数据结构中,然后计算行数,然后对相同的数据结构进行操作。

【讨论】:

  • 我需要对行数进行计数,看看它是否等于同一个文件中提到的计数。只有当它相等时,我才需要对文件内容行进行验证,它只是人的行以 csv 格式记录。所以当我完成计数并完成第一次验证时,我需要从一开始的流。所以我对下一步做什么感到困惑......如果可能的话,你能否建议如何加载文件的内容到一个数据结构,然后计算它。
  • 您已经在使用 InputStreamReader,您将其输入 LineNumberReader。如果您首先将所有读取的行缓存在List<String> 中,那么您可以这样做,并且不需要两次流式传输文件。
【解决方案3】:

如果你的文件不大,你可以将数据保存到一个字符串。 谎言:

StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1)
sb.append(buffer, 0, len);
String data = sb.toString();

那么你可以在字符串中做进一步的事情 喜欢:

int lineNumber = data.split("\n").length;

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2011-07-10
    • 2010-11-07
    • 2012-05-03
    • 2014-07-26
    相关资源
    最近更新 更多