2017-08-14 3 views
3

Ich bin neu zu vertx verwenden und ich benutze vertx Dateisystem API, um Datei von großer Größe zu lesen.Lesen Sie große Datei mit vertx

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

Aber das RAM ist alles verbraucht, während das Lesen und die Ressource nicht einmal nach dem Gebrauch gespült. Das vertex-Dateisystem api schlägt außerdem vor. Verwenden Sie diese Methode nicht, um sehr große Dateien zu lesen, oder riskieren Sie, dass der verfügbare RAM nicht ausreicht.

Gibt es eine Alternative dazu?

+0

Ich denke, vertx hat nicht diese Art von api. Warum liest du keine Dateien mit anderen Java-Lösungen? – zella

Antwort

0

Der Grund dafür ist, dass intern .readFile Aufrufe an Files.readAllBytes.

Was sollten Sie stattdessen tun ist, um einen Strom aus Ihrer Datei erstellen, und übergibt es an Vertx Handler:

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

Zum Lesen/Prozess eine große Datei in Blöcken Sie die open() Methode verwenden müssen, die eine AsyncFile auf Erfolg zurückgeben. Auf dieser AsyncFile Sie setReadBufferSize() (oder nicht, ist der Standardwert 8192), und fügen Sie eine handler(), die eine Buffer von höchstens der Größe des Lesepuffers, die Sie gerade festgelegt übergeben werden.

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()); 
    } 
}); 

Sie benötigen READ_BUFFER_SIZE irgendwo natürlich definieren:

Im Beispiel unten Ich habe auch ein endHandler() drucken eine abschließende Newline zu bleiben im Einklang mit dem Beispielcode Sie in der Frage zur Verfügung gestellt angebracht.

1

große Datei zu lesen, sollten Sie öffnen eine AsyncFile:

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

Dann wird ein AsyncFile ist ein ReadStream so können Sie es mit einer Pumpe verwenden zusammen, um die Bits zu einem WriteStream zu kopieren:

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

Es gibt verschiedene Arten von WriteStream, wie AsyncFile, net-Sockets, HTTP-Server-Antworten, ... etc.