На самом деле данные были в состоянии читать из GridFSDownloadStream.Но когда я делаю это:
GridFSDownloadStream st = gridFSBucket.openDownloadStream(filename);
st.available();
Всегда я получаю "0".
GridFSDownloadStream не поддерживает метод available (), по крайней мере вы не можете получить правильную длину файла, сохраненного в нескольких чанках через это.Если вы хотите получить длину GridFSDownloadStream, используйте взамен getGridFSFile (). GetLength ().
GridFSDownloadStream st = gridFSBucket.openDownloadStream(filename);
st.getGridFSFile().getLength();
При чтении данных из GridFSDownloadStream с буфером стоит отметить, что размер буфера НЕ должен превышатьразмер куска.Поскольку метод read () может считывать данные только из одного чанка каждый раз.
GridFSDownloadStream st = gridFSBucket.openDownloadStream(filename);
byte[] buffer = new buffer[stream.getGridFSFile().getLength()];
st.read(buffer);
Если данные сохраняются в нескольких чанках, это может не сработать.Только данные из первого блока будут считаны в буфер!
Так что вы можете попробовать следующее, чтобы избежать этого:
GridFSDownloadStream st = gridFSBucket.openDownloadStream(filename);
int bufferSize = 1024;
int chunkSize = st.getGridFSFile().getChunkSize();
if (bufferSize > chunkSize)
bufferSize = chunkSize;
byte[] buffer = new byte[bufferSize];
// Loop
st.read(buffer);