3

Java パイプラインを使用して、解凍モジュール (JavaUncompress クラス) から解析モジュール (ハンドラー クラス) にデータ (アウトストリーム) を渡しています。ファイルが大きいため、最初にファイルを解凍し、解凍したファイルを保存する代わりに直接解析したいそして解析します。ただし、小さいサイズのファイルに対してのみ機能します。1G ファイルを入力すると、ファイルの一部 (たとえば 50000 行) だけが出力ストリームから解析モジュールの入力ストリームにパイプライン化されているようです。

非圧縮ファイルを保存するために文字列を使用しようとしましたが、同じことが起こりました.文字列には解凍されたファイルの一部しか含まれていません(パイプライン化されたバージョンと同じ50000行目で停止しました)。何が起こったのかについて何か考えはありますか?どうもありがとうございました。

パイプラインのコードは次のとおりです。

   {
   PipedInputStream in = new PipedInputStream(); // to output
   final PipedOutputStream out = new PipedOutputStream(in); // out is something from other

   new Thread(
    new Runnable(){
        public void run(){ 
                JavaUncompress.putDataOnOutputStream(inFile,out); }
        }
        ).start();

   doc = handler.processDataFromInputStream(in);
   }

   public static void putDataOnOutputStream(String inZipFileName, PipedOutputStream out){

   try {
          FileInputStream fis = new FileInputStream(inZipFileName);
          //FilterInputStream ftis = new FilterInputStream;
          ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
          ZipEntry entry;

          while((entry = zis.getNextEntry()) != null) {
             System.out.println("Extracting: " +entry);
             byte data[] = new byte[BUFFER];

             long len = entry.getSize();
             long blk = len/BUFFER;
             int  rem = (int)(len - blk*BUFFER);
             System.out.println(len+" = "+blk +"*BUFFER + "+rem);

             for(long i=0; i!=blk; ++i){
                 if ((zis.read(data, 0, BUFFER)) != -1) {
                     out.write(data);
                 }
             }

             byte dataRem[] = new byte[rem];
             if ((zis.read(dataRem, 0, rem)) != -1) {
                 out.write(dataRem);
                 out.flush();
                 out.close();
             }

          }
          zis.close();

       } catch(Exception e) {
          e.printStackTrace();
       }
   }
4

2 に答える 2

3

PipedOutputStream.write()対応するものが 4096 またはその背後にあるバイトを超えるとブロックさPipedInputStreamれますが、なぜこれを行うのでしょうか? ファイルを解凍して同じスレッドで処理しないのはなぜですか? マルチスレッド化する利点はありません。それは無意味な複雑さです。

私は Java で 15 年に 1 回だけパイプを使用しましたが、すぐにそれをキューに変更しました。

于 2012-07-09T23:33:46.000 に答える