2016-03-23 7 views
0

Ich versuche, Datei von Mongodb herunterzuladen. Die Größe der hochgeladenen Datei ist 2106 Bytes und chunkSize=2048 Bytes, so teilt GridFS die Datei in 2 Chunks. Wenn ich die Codes von downloadStream.read(bytesToWriteTo) ausführe, lese nur Daten des ersten Chunks und kann die Daten des zweiten Chunks nicht lesen. Wie kann ich alle Daten lesen?GridFSDownloadStream kann nicht alle Daten lesen

public class OpenDownloadStreamDemo { 

      public static void main(String[] args) { 
      MongoClient mongoClient = new MongoClient("127.0.0.1", 27017); 
      MongoDatabase mongoDatabase = mongoClient.getDatabase("demo"); 
      GridFSBucket gridFSBucket = GridFSBuckets[enter image description here][1].create(mongoDatabase); 
      ObjectId fileId = new ObjectId("56f25a8b163b4598987b666b"); 
      GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId); 
      int fileLength = (int) downloadStream.getGridFSFile().getLength(); 
      byte[] bytesToWriteTo = new byte[fileLength]; 
      downloadStream.read(bytesToWriteTo); 
      downloadStream.close(); 
      System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8)); 
     } 
    } 

The files Collection

The chunks Collection

Antwort

1

Ich weiß es eine sehr späte Antwort ist, können Sie versuchen Implementierung folgende Verwendung

public static void main(String[] args) { 
     MongoClient mongoClient = new MongoClient("127.0.0.1", 27017); 
     MongoDatabase mongoDatabase = mongoClient.getDatabase("demo"); 
     GridFSBucket gridFSBucket = GridFSBuckets.create(mongoDatabase); 
     ObjectId fileId = new ObjectId("56f25a8b163b4598987b666b"); 
     GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId); 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     int data = downloadStream.read(); 
     while (data >= 0) { 
      outputStream.write((char) data); 
      data = downloadStream.read(); 
     } 
     byte[] bytesToWriteTo = outputStream.toByteArray(); 
     downloadStream.close(); 
     System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8)); 
    } 
} 
0

Sie können die Eingabestrom direkt verwenden. Der offene Download-Datenstrom ist genug, um alle Stücke zu bekommen

GridFSDownloadStream downloadStream = mongo.getGridFSBucket().openDownloadStream(fileId);  
//int fileLength = (int) downloadStream.getGridFSFile().getLength();  
//byte[] bytesToWriteTo = new byte[(fileLength];  
//downloadStream.read(bytesToWriteTo);  
return downloadStream; 
0

Das bin ich für einen Tag stapfte hatte, das Beispiel auf der GridFS Seite nur Anrufe einmal gelesen, sondern um all die Stücke zum Download müssen Sie rufen es wiederholt. Jeder Aufruf gibt Ihnen die Anzahl der Bytes zurück, die er aus dem aktuellen Chunk gelesen hat, also müssen Sie die Werte addieren, um die aktuelle Position zu verfolgen und diesen Wert wieder in les (...) zu übergeben, um den Chuck in das richtige zu kopieren Position in Ihrem Byte-Array. So habe ich es umgesetzt.

public class OpenDownloadStreamDemo { 

     public static void main(String[] args) { 
     MongoClient mongoClient = new MongoClient("127.0.0.1", 27017); 
     MongoDatabase mongoDatabase = mongoClient.getDatabase("demo"); 
     GridFSBucket gridFSBucket = GridFSBuckets[enter image description here][1].create(mongoDatabase); 
     ObjectId fileId = new ObjectId("56f25a8b163b4598987b666b"); 
     GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId); 
     int fileLength = (int) downloadStream.getGridFSFile().getLength(); 
     byte[] bytesToWriteTo = new byte[fileLength]; 
     int streamDownloadPosition = 0; 
     while(streamDownloadPosition != -1) { 
      streamDownloadPosition += downloadStream.read(bytesToWriteTo, streamDownloadPosition, fileLength); 
     } 
     downloadStream.close(); 
     System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8)); 
    } 
} 
Verwandte Themen