Für diesen speziellen Fall, würde ich die Datei lokal mit Java cache Sie können eine geringe Speicherübertragung der Datei auf Ihrem Computer haben, dann können Sie durchlaufen Zeile für Zeile, ohne die Datei in den Arbeitsspeicher als auch zu laden und ziehen die Daten, die Sie benötigen, oder alle gleichzeitig laden.
BEARBEITEN: Änderungen an Variablennamen vorgenommen habe ich dies aus meinem Code gezogen und vergessen, die Variablen zu neutralisieren. Auch FileChannel transferTo/transferFrom kann viel effizienter sein, da es potentiell weniger Kopien gibt und je nach Operation von SocketBuffer -> Disk gehen kann. FileChannel API
String urlString = "http://update.domain.com/file.json" // File URL Path
Path diskSaveLocation = Paths.get("file.json"); // This will be just help place it in your working directory
final URL url = new URL(fileUrlString);
final URLConnection conn = url.openConnection();
final long fileLength = conn.getContentLength();
System.out.println(String.format("Downloading file... %s, Size: %d bytes.", fileUrlString, fileLength));
try(
FileOutputStream stream = new FileOutputStream(diskSaveLocation.toFile(), false);
FileChannel fileChannel = stream.getChannel();
ReadableByteChannel inChannel = Channels.newChannel(conn.getInputStream());
) {
long read = 0;
long readerPosition = 0;
while ((read = fileChannel.transferFrom(inChannel, readerPosition, fileLength)) >= 0 && readerPosition < fileLength) {
readerPosition += read;
}
if (fileLength != Files.size(diskSaveLocation)) {
Files.delete(diskSaveLocation);
System.out.println(String.format("File... %s did not download correctly, deleting file artifact!", fileUrlString));
}
}
System.out.println(String.format("File Download... %s completed!", fileUrlString));
((HttpURLConnection) conn).disconnect();
Sie können nun diese gleiche Datei lesen Sie ein NIO2 Methode, die Sie Zeile für Zeile lesen können, ohne in den Speicher geladen werden. Mit Scanner- oder RandomAccessFile-Methoden können Sie das Lesen von Zeilen in den Heap verhindern. Wenn Sie die ganze Datei einlesen möchten, können Sie dies auch lokal aus der zwischengespeicherten Datei tun, indem Sie viele Methoden von Javas Files
Hilfsmethoden verwenden.
Java Read Large Text File With 70million line of text
Ich nehme an, Sie MB bedeuten, sonst wird Ihre Datei auf 2 milliBit klein sein würde: P – MrKickkiller
'lineAllOfIt + = Zeile;' ist „falsch“, da Strings unveränderlich sind und Sie neue schaffen mit zunehmender Größe über und immer wieder. Verwenden Sie einen String-Builder oder es mögen http://stackoverflow.com/a/37079572/995891 – zapl
Möchten Sie eine Antwort schreiben? Das ist die Lösung –