본문 바로가기

카테고리 없음

Java BufferedInput/OutputStream example

InputStream과 BufferedInputStream의 차이점 및 성능비교


InputStream클래스는 abstract 클래스이므로 직접 인스턴스를 생성하여 사용할 수 없지만, BufferedInputStream은 온전한 클래스이기 때문에 직접 인스턴스를 생성하고 사용할 수 있는 점이 다르며,

InputStream은 노드 스트림이기 때문에 데이터의 소스에 직접 연결되고 BufferedInputStream은 필터스트림이기 때문에 다른 InputStream과 연결되는 점이 또한 다르다.


성능면에서는 BufferedInputStream 은 데이터를 읽어오는 작업을 수행시 미리 버퍼에 데이터를 복사해놓는 방법을 이용하므로 read() 를 호출하기 전에 읽어 올 데이터가 준비되어 있어서 read() 호출할 때 즉시 리턴되는 점이 다르다


아래의 코드는 기본 FileInputStream을 이용하여 파일을 복사하는데 소요되는 시간과 BufferedInputStream을 사용하여 동일한 작업을 수행하는데 소요된 시간을 비교하기 위해 작성한 예제이다


private void basicStream() {

        

        FileInputStream fin = null;

        FileOutputStream fout = null;

        BufferedInputStream bin = null;

        BufferedOutputStream bout = null;

        

        try {

            fin = new FileInputStream("d:/test/sample.jpg");

            fout = new FileOutputStream("d:/test/imgCpy.jpg");


            byte[] buf = new byte[256];

            int read = 0;

            

            long start = System.currentTimeMillis();

            while((read=fin.read(buf, 0, buf.length))!=-1) {

                fout.write(buf, 0, read);

            }

            long end = System.currentTimeMillis();

            

            fin.close();

            fout.close();

            System.out.println("기본 스트림, 이미지 파일복사 완료("+(end-start)+")");

            

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }


    private void filterStream() {

        

        FileInputStream fin = null;

        FileOutputStream fout = null;

        BufferedInputStream bin = null;

        BufferedOutputStream bout = null;

        

        try {

            fin = new FileInputStream("d:/test/sample.jpg");

            bin = new BufferedInputStream(fin);

            fout = new FileOutputStream("d:/test/imgCpy.jpg");

            bout = new BufferedOutputStream(fout);

            

            byte[] buf = new byte[256];

            int read = 0;

            

            long start = System.currentTimeMillis();

            while((read=bin.read(buf, 0, buf.length))!=-1) {

                bout.write(buf, 0, read);

            }

            long end = System.currentTimeMillis();

            

            bin.close();

            bout.close();

            System.out.println("필터스트림, 이미지 파일복사 완료("+(end-start)+")");

            

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }