Query su java I / O BufferedOutputStream metodo write ()

1

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() .

    
posta overexchange 21.12.2014 - 15:59
fonte

1 risposta

1

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,,)?

No, non stai passando il buffer come argomento, stai passando il singolo byte che hai letto. Hai quel singolo byte nella variabile byteRead , restituito da BufferedInputStream , e stai passando quel singolo byte in BufferedOutputStream .

In second program, out object should at-least have access to object reference in to access the buffer populated using in.read().

No, BufferedOutputStream non ha accesso al buffer di BufferedInputStream .

Sembra che tu abbia semplicemente frainteso ciò che .read() senza argomenti fa davvero. Non c'è niente di magico da fare qui.

    
risposta data 21.12.2014 - 17:53
fonte

Leggi altre domande sui tag