2016-03-23 16 views
0

mongodbからファイルをダウンロードしようとしています。アップロードされるファイルのサイズは2106バイト、chunkSize=2048バイトなので、GridFSはファイルを2つのチャンクに分割します。 downloadStream.read(bytesToWriteTo)のコードを実行すると、最初のチャンクのデータのみを読み込み、2番目のチャンクのデータは読み込めません。どのようにしてすべてのデータを読むことができますか?GridFSDownloadStreamがすべてのデータを読み取ることができません

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

答えて

1

私はそれが非常に返事が遅れている知っている、あなたは、実装あなたが直接入力ストリームを使用することができます

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

次を使用して試すことができます。オープンダウンロード・ストリームは、すべてのチャンク

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

はこの日のために私を困惑させていた取得するのに十分である、GridFSページ上の例では、一度だけ読んで呼び出しますが、チャンクの全てをダウンロードするためにあなたが呼び出す必要がありますそれは繰り返します。各呼び出しは、現在のチャンクから読み込んだバイト数を返します。したがって、現在の位置を追跡し、その値をread(...)に渡して正しい値にチャックをコピーする必要がありますバイト配列の位置。これは私がそれを実装した方法でした。

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)); 
    } 
} 
関連する問題