Di seguito è riportato il codice che viene scritto utilizzando la classe% buffer non-buffer FileInputStream
e FileOutputStream
con l'utilizzo di buffer utente espliciti.
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();
}
}
}
Di seguito è riportato il programma scritto utilizzando la classe del flusso I / O del buffer basato su byte 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();
}
}
}
I due programmi precedenti hanno le stesse funzionalità ma non sono chiari sulla funzionalità del metodo write(#bytes)
di class BufferedOutputStream
.
Sulla base dell'osservazione, sotto le due classi ci sono i loro buffer.
public class BufferedInputStream extends FilterInputStream {
.........
protected volatile byte buf[];
..........
}
public class BufferedOutputStream extends FilterOutputStream {
........
protected byte buf[];
.......
}
Nel secondo programma, in che modo out
oggetto di class BufferedOutputStream
è in grado di scrivere il buffer che fa parte di class BufferedInputStream
? Perché non stiamo passando il buffer come argomento del metodo out.write(#bytes)
[che sembra non intuitivo] a differenza del primo programma che passa il buffer utente out.write(byteBuf,,)
? Nel secondo programma, l'oggetto out
dovrebbe almeno avere accesso al riferimento all'oggetto in
per accedere al buffer popolato utilizzando in.read()
.