2

ファイルに対してプロセスを実行する必要があります。最初に行数を数え、値と比較します。

次は、ファイルを1行ずつ読み取り、検証を行うためのものです。

最初のものだけが合格した場合、私は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;

両方のストリームが最初から最後までファイルの内容を持っているか、最初のストリームオブジェクトが読み取られるとすぐに2番目のオブジェクトがnullになりますか。

では、残っている唯一のオプションは、ストリームを個別に読み取るための新しい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からファイルを再要求します。これで、ビジー状態はなくなります。LineNumberReaderが実行されるまでに、同じInputStreamが使い果たされる可能性があるため、同じInputStreamから「ただ」読み取ることはできません。さらに、すべてのInputStreamがmark()およびreset()メソッドをサポートしているわけではありません。

ただし、最初のプロセスが成功した場合にのみ2番目のプロセスを実行することは、正しい方法ではない可能性があることをお勧めします。とにかくデータをストリーミングしているので、一時的なデータ構造にストリーミングしてから行数を数え、同じデータ構造で操作してみませんか。

于 2012-08-10T13:51:13.197 に答える
1

ファイルが大きくない場合は、データを文字列に保存できます。liek:

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 に答える