Java streamreader中是否可以使用相同的inputstream

Java streamreader中是否可以使用相同的inputstream,java,stream,inputstream,Java,Stream,Inputstream,我需要对文件进行处理,首先计算行数并与值进行比较 下一个是逐行读取文件并进行验证 如果第一个通过,我只需要做第二个过程 我使用FTP读取相同的文件 当我尝试创建不同的输入流时…ftp正忙于读取当前文件 像这样: (is1 = ftp.getFile(feedFileName);) 以下是剩余的部分: InputStream is = null; LineNumberReader lin = null; LineNumberReader lin1 = null; is = ftp.ge

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

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

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

我使用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;
两个流从开始到结束都将具有文件内容,或者在读取第一个流对象后,第二个对象将变为null


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

可以,但需要“倒带”输入流。首先需要对其调用mark()方法,然后重置。以下是文档:()

使用LineNumberReader后,关闭InputStream
is
。然后从FTP重新请求文件,它将不再繁忙。您不能“仅仅”读取同一个输入流,因为在完成LineNumberReader时,该输入流可能已耗尽。此外,并非所有输入流都支持
mark()
reset()
方法


然而,我认为只有在第一个过程成功时才进行第二个过程可能不是正确的方法。既然您正在以任何方式流式传输数据,为什么不将其流式传输到临时数据结构中,然后计算行数,然后在相同的数据结构上进行操作。

如果文件不大,您可以将数据保存到字符串中。 列克:

然后你可以在字符串中做进一步的事情 比如:


“ftp正忙于读取当前文件”是什么意思。有任何异常吗?有异常发生在我给出时:is1=ftp.getFile(feedFileName);因为ftp已经读取到is。你能给我一个编码演示吗?我需要数数行数,看看它是否等于同一文件中提到的计数。只有当它相等时,我需要对文件内容行进行验证,该行是csv格式的个人记录。所以当我完成计数并完成第一次验证时,我从一开始就需要流。因此,我对下一步做什么感到困惑…如果可能的话,请您建议如何将文件内容加载到数据结构,然后对其进行计数。您已经在使用InputStreamReader,并将其输入LineNumberReader。如果首先缓存
列表中的所有读取行
,则可以执行相同的操作,并且不需要对文件进行两次流式处理。
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;