Внутренний ли метод IOUtils.toByteArray (inputStream) закрывает объект inputStream? - PullRequest
0 голосов
/ 13 ноября 2018

Вот мой поток кода, для которого содержимое файла теряется, и я думаю, что может быть проблема с строкой IOUtils.toByteArray (), пожалуйста, укажите, что на самом деле идет не так.

Потеряно содержимое файла:

InputStream stream = someClient.downloadApi(fileId);
byte[] bytes = IOUtils.toByteArray(stream); 
String mimeType = CommonUtils.fileTypeFromByteArray(bytes);
String fileExtension=FormatToExtensionMapping.getByFormat(mimeType).getExtension();
String filePath = configuration.getDownloadFolder() + "/" ;
String fileName = UUID.randomUUID() + fileExtension;    
File file = new File(filePath+fileName);    
file.createNewFile();    
FileUtils.copyInputStreamToFile(stream,file);    
int length = (int)file.length();

Теперь значение длины здесь 0 в основном без содержимого. Позвольте мне сказать вам, что inputStream, полученный от downloadApi (), имеет контент, который наверняка предоставлен. Но если я попробую приведенную ниже модификацию в коде, я получу длину файла.

Содержимое файла НЕ теряется:

InputStream stream = someClient.downloadApi(fileId);
byte[] bytes = IOUtils.toByteArray(stream);
String mimeType = CommonUtils.fileTypeFromByteArray(bytes);
String fileExtension=FormatToExtensionMapping.getByFormat(mimeType).getExtension();
String filePath = configuration.getDownloadFolder() + "/" ;
String fileName = UUID.randomUUID() + fileExtension;
stream = new ByteArrayInputStream(bytes); //Again converted bytes to stream    
File file = new File(filePath+fileName);    
file.createNewFile();    
FileUtils.copyInputStreamToFile(stream,file);    
int length = (int)file.length();

Теперь я получаю содержимое файла. Может ли какой-нибудь орган сказать, что технически не так в первом фрагменте кода?

ТИА

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Нет, это не так.

Первая версия вашего кода (воспроизведенная ниже с некоторыми добавленными комментариями) не работает, потому что вы читаете из потока, который уже находится в конце позиции потока.

InputStream stream = someClient.downloadApi(fileId);

// This reads the entire stream to the end of stream.
byte[] bytes = IOUtils.toByteArray(stream);

String mimeType = CommonUtils.fileTypeFromByteArray(bytes);
String fileExtension = 
        FormatToExtensionMapping.getByFormat(mimeType).getExtension();
String filePath = configuration.getDownloadFolder() + "/" ;
String fileName = UUID.randomUUID() + fileExtension;    
File file = new File(filePath+fileName);    
file.createNewFile();    

// Now you attempt to read more data from the stream.
FileUtils.copyInputStreamToFile(stream,file);    

int length = (int)file.length();

Когда вы пытаетесь скопировать из потока, который находится в конце потока, вы получаете ... ноль байтов. А это значит, что вы получите пустой выходной файл.

0 голосов
/ 13 ноября 2018

Нет, этот поток должен быть закрыт.

Это целевой метод IOUtils :

public static long copyLarge(final InputStream input, final OutputStream output, final byte[] buffer)
        throws IOException {
    long count = 0;
    int n;
    while (EOF != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

// create stream and use it
InputStream stream = someClient.downloadApi(fileId);
byte[] bytes = IOUtils.toByteArray(stream); 

// then us it again
FileUtils.copyInputStreamToFile(stream,file);

// FIXED VERSION
FileUtils.copyInputStreamToFile(new ByteArrayInputStream(bytes),file);
...