Below is the code that is written using byte stream non-buffer class FileInputStream
and FileOutputStream
with the usage of explicit user buffers.
public class FileCopyUserBuffer{
public static void main(String[] args){
String inFileStr = "C:\\practice_in.jpg";
String outFileStr = "C:\\practice_out.jpg";
FileInputStream in = null;
FileOutputStream out = null;
try{
in = new FileInputStream(inFileStr);
out = new FileOutputStream(outFileStr);
startTime = System.nanoTime();
byte[] byteBuf = new byte[4096];
int numBytesRead;
while((numBytesRead = in.read(byteBuf)) != -1){
out.write(byteBuf, 0, numBytesRead);
}
}catch(IOException ex){
ex.printStackTrace();
}
}
}
Below is the program written using byte based buffer I/O stream class BufferedOutputStream
& BufferedInputStream
.
public class FileCopyBufferedStream{
public void main(String[] args){
String inFileStr = "C:\\practice_in.jpg";
String outFileStr = "C:\\practice_out.jpg";
BufferedInputStream in = null;
BufferedOutputStream out = null;
File fileIn = new File(inFileStr);
System.out.println("File size is: " + fileIn.length() + " bytes");
try{
in = new BufferedInputStream(new FileInputStream(inFileStr));
out = new BufferedOutputStream(new FileOutputStream(outFileStr));
startTime = System.nanoTime();
int byteRead;
while((byteRead = in.read()) != -1){
out.write(byteRead);
}
}catch(IOException ex){
ex.printStackTrace();
}
}
}
Above two programs perform the same functionality but am not clear about the functionality of write(#bytes)
method of class BufferedOutputStream
.
Based on the observation, below two classes have their own buffers.
public class BufferedInputStream extends FilterInputStream {
.........
protected volatile byte buf[];
..........
}
public class BufferedOutputStream extends FilterOutputStream {
........
protected byte buf[];
.......
}
In second program, How does out
object of class BufferedOutputStream
is able to write the buffer that is part of class BufferedInputStream
? Because we are not passing buffer as argument of out.write(#bytes)
method[which looks non-intuitive] unlike the first program which passes user buffer out.write(byteBuf,,)
? In second program, out
object should at-least have access to object reference in
to access the buffer populated using in.read()
.
InputStream.read(...)
method is overloaded. Callingread()
without any arguments returns "the next byte of data, or -1 if the end of the stream is reached.". See docs.