简体   繁体   中英

Is BufferedInputStream and BufferedOutputstream different from InputStream and Outputstream

recently i had troubles working with InputStreams and OutputStreams when i was trying to implement a basic file downloader in my android application.. to elaborate things this is how i did it..

i get an InputStream object using the apache HttpClient classes then tried writing the stream to a file.. but strangely when i buffer the InputStream or the OutputStream i get an unreadable file.... this is the code..

//to make the code concise i removed exceptions and stream closing..

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
}

完成后,您必须刷新缓冲的输出流。

In any case you probably want to flush() your output (done implicitly by close() ), but with BufferedOutputStream this is even more important than with a other OutputStream s. If you have a FileOutputStream , the only buffering performed is that of the OS. If you have a BufferedOutputStream , Java performs its own buffering on top of it.

If you use Java 7 or newer, I'd recommend to write the code like this:

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

In your case I suspect you were closing the FileOutputStream but not the BufferedOutputStream . Therefore the file was truncated or even empty because the data buffered in the BufferedOutputStream was not flushed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM