2017-08-14 5 views
3

私はvertxを初めて使っていますが、私は大きなファイルを読み込むためにvertxファイルシステムapiを使っています。vertexを使って大きなファイルを読む

vertx.fileSystem().readFile("target/classes/readme.txt", result -> { 
    if (result.succeeded()) { 
     System.out.println(result.result()); 
    } else { 
     System.err.println("Oh oh ..." + result.cause()); 
    } 
}); 

しかし、読み取り中にRAMがすべて消費され、使用後にリソースがフラッシュされません。頂点ファイルシステムapiも提案します 非常に大きなファイルを読み取るためにこのメソッドを使用しないでください、または使用可能なRAMがなくなる危険があります。

この代替手段はありますか?

+0

私はvertxがこの種のAPIを持っていないと思います。なぜあなたは他のJavaソリューションとファイルを読んでいないのですか? – zella

答えて

0

これは、内部で.readFileFiles.readAllBytesを呼び出すためです。

あなたが代わりにやるべきことは、あなたのファイルのうち、ストリームを作成し、VERTXハンドラに渡しです:

try (InputStream steam = new FileInputStream("target/classes/readme.txt")) { 
     // Your handling here 
    } 
0

/プロセスにあなたがいるでしょうopen()メソッドを使用する必要があるチャンクで大容量のファイルを読むには成功したらAsyncFileを返します。このAsyncFileの場合、setReadBufferSize()(デフォルトでは8192)で、handler()を添付して、設定した読み込みバッファの最大サイズのBufferが渡されます。 I以下の例では

はまた、あなたが質問で提供されるサンプル・コードを持つ行に滞在する最後の改行を印刷するendHandler()を添付しています

vertx.fileSystem().open("target/classes/readme.txt", new OpenOptions().setWrite(false).setCreate(false), result -> { 
    if (result.succeeded()) { 
     result.result().setReadBufferSize(READ_BUFFER_SIZE).handler(data -> System.out.print(data.toString())) 
              .endHandler(v -> System.out.println()); 
    } else { 
     System.err.println("Oh oh ..." + result.cause()); 
    } 
}); 

あなたはもちろんのREAD_BUFFER_SIZEどこかを定義する必要があります。

1

あなたがAsyncFileを開く必要があり、大きなファイルを読むために:

OpenOptions options = new OpenOptions(); 
fileSystem.open("myfile.txt", options, res -> { 
    if (res.succeeded()) { 
     AsyncFile file = res.result(); 
    } else { 
     // Something went wrong! 
    } 
}); 

その後AsyncFileはそうあなたがWriteStreamにビットをコピーするポンプと一緒に使用することができReadStreamです:

Pump.pump(file, output).start(); 
file.endHandler((r) -> { 
    System.out.println("Copy done"); 
}); 

AsyncFileのような異なる種類のWriteStream、ネットソケット、HTTPサーバー応答などがあります。

関連する問題