>我需要对文件做处理,首先计算行数并与值进行比较。
下一个是逐行读取文件并进行验证。
如果第一个只通过,我需要做第二个过程。
我使用 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() 方法,然后重置。以下是文档: http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#reset()
完成 LineNumberReader 后,关闭 InputStream is
。然后从FTP重新请求文件,它将不再繁忙。您不能"只是"从同一个输入流中读取,因为当LineNumberReader完成时,该输入流可能已经耗尽。此外,并非所有输入流都支持 mark()
和reset()
方法。
但是,我建议仅在第一个过程成功时才执行第二个过程可能不是正确的方法。无论如何,当您流式传输数据时,为什么不将其流式传输到临时数据结构中,然后计算行数,然后对同一数据结构进行操作。
如果你的文件不大,你可以将数据保存到字符串中。喜欢:
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;