2

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

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

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

我使用 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 对象来单独读取流吗?

4

3 回答 3

4

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

于 2012-08-10T13:37:05.970 回答
2

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

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

于 2012-08-10T13:51:13.197 回答
1

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

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;
于 2012-08-10T14:34:15.033 回答