2014-12-14 3 views
1

Недавно у меня были проблемы с InputStreams и OutputStreams, когда я пытался реализовать базовый загрузчик файлов в своем приложении для Android. Чтобы продумать все, как это сделал я.Is BufferedInputStream и BufferedOutputstream отличаются от InputStream и Outputstream

Я получаю объект InputStream, используя классы apache HttpClient, затем попытался записать поток в файл .. но странно, когда я буфера InputStream или OutputStream я получаю нечитаемый файл .... это код ..

// Чтобы сделать код кратким, я удалил исключения и закрыл поток.

private void download(InputStream in,String fileName){ 

//if i dont use the buffered thing and read directly from in everything is ok 
// same is the buffered out i had to use in/outstream 
BufferedInputStream bufferedIn = new BufferedInputStream(in); 
FileOutputStream fout = new FileOutputStream(new File(fileName)); 

BufferedOutputstream bufferedOut = new BufferedOutputstream(fout);  
int read = -1; 

while((read = bufferedIn.read()) != -1){ 
    bufferedOut.write(read); 
} 
//close the buffers 
} 
+1

Что вы хотите сказать, не прочитанные? Действительно нечитабельно? Усеченный результат? Пустой файл? Будьте осторожны, чтобы действительно закрыть файлы в конце! Они «Буферизованные» потоки, поэтому их закрытие не может привести к записи un'flush в конце ... –

+1

Вам нужно «сбросить» ваш буфер. Это берет все остаточные данные, оставшиеся в буфере, и записывает их в ваш поток. – MeetTitan

+0

Вы уверены, что код установлен правильно? Вы читаете 'буферизированный' не в' bufferedIn'. Кажется, вы упростили свой код ... Пожалуйста, дайте нам оригинальный код. Вы действительно закрываете 'BufferedOutputStream'? –

ответ

2

Вы должны очистить буферный выходной поток, когда закончите с ним.

+0

Флеш ... или закрыть. Вообще говоря, закрытие лучше, потому что это касается утечек ресурсов. –

2

В любом случае вы, вероятно, хотите flush() свой вывод (сделано неявно close()), но с BufferedOutputStream это даже более важно, чем с другими OutputStream с. Если у вас есть FileOutputStream, выполняется только буферизация операционной системы. Если у вас есть BufferedOutputStream, Java выполняет свою собственную буферизацию поверх нее.

Если вы используете Java 7 или более поздней версии, я рекомендовал бы написать такой код:

try (BufferedInputStream bIn = new BufferedInputStream(in); 
    BufferedOutputStream bOut = new BufferedOutputStream(new FileOutputStream(fileName))) { 
    for (int read; ((read = bIn.read()) != -1;) 
     bOut.write(read); 
} 

В вашем случае я подозреваю, что вы закрывали FileOutputStream но не BufferedOutputStream. Поэтому файл был усечен или даже пуст, потому что данные, буферизованные в BufferedOutputStream, не были сброшены.

+0

Могу ли я использовать java 7 для android .. am on linux with openJdk 6 i закрыл все потоки ... его документ с текстом –

+0

Вы можете - и должны - использовать Java 7 для Android. –