2016-06-01 18 views
0

Ich muss eine URLConnection Antwort lesen, die 2MB von hübsch gedruckten JSON in Java enthält.Java lesen URLConnection mit vielen Zeilen effizient

2mb ist nicht "klein", aber keineswegs groß. Es enthält JSON. Es ist jedoch ziemlich print JSON mit rund 60k Zeilen. A

dauert ungefähr 10 Minuten, um diese Antwort zu lesen. Es muss etwas mit meiner Herangehensweise nicht stimmen, aber ich kann mir keinen besseren Ansatz vorstellen.

+0

Ich nehme an, Sie MB bedeuten, sonst wird Ihre Datei auf 2 milliBit klein sein würde: P – MrKickkiller

+1

'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

+0

Möchten Sie eine Antwort schreiben? Das ist die Lösung –

Antwort

1

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

Verwandte Themen