본문 바로가기

데이터 입출력

성능 향상 스트림

메모리 버퍼로 실행 성능을 높이는 보조 스트림

  • 프로그램이 중간에 메모리 버퍼buffer와 작업해서 실행 성능 향상 가능
  • 출력 스트림의 경우 직접 하드 디스크에 데이터를 보내지 않고 메모리 버퍼에 데이터를 보냄으로써 출력 속도를 향상. 입력 스트림에서도 버퍼를 사용하면 읽기 성능 향상


    출처, 이것이 자바다



    출처, 이것이 자바다


  • 바이트 스트림에는 BufferedInputStream, BufferedOutputStream이 있고 문자 스트림에는 BufferedReader, BufferedWriter가 있음


    출처, 이것이 자바다


package ch18.sec07.exam01;

/*
바이트 스트림 사용
버퍼기능을 제공하는 보조스트림을 이용하여, 이미지 파일 복사 작업하는 예제.
*/

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class BufferExample {

    public static void main(String[] args) throws Exception {
        //입출력 스트림 생성(버퍼 스트림 미사용)
        String originalFilePath1 = BufferExample.class.getResource("originalFile1.jpg").getPath();
        String targetFilePath1 = "C:/dev/temp/targetFile1.jpg";
        FileInputStream fis = new FileInputStream(originalFilePath1); //입력스트림
        FileOutputStream fos = new FileOutputStream(targetFilePath1); //출력스트림. 파일생성

        //입출력 스트림 + 버퍼 스트림 생성

        //1)입출력 스트림
        String originalFilePath2 = BufferExample.class.getResource("originalFile2.jpg").getPath();
        String targetFilePath2 = "C:/dev/temp/targetFile2.jpg";
        FileInputStream fis2 = new FileInputStream(originalFilePath2);
        FileOutputStream fos2 = new FileOutputStream(targetFilePath2);

        //2)보조 스트림
        BufferedInputStream bis = new BufferedInputStream(fis2);
        BufferedOutputStream bos = new BufferedOutputStream(fos2);

        //버퍼 미사용 복사
        long nonBufferTime = copy(fis, fos);
        System.out.println("버퍼 미사용:\t" + nonBufferTime + " ns");

        //버퍼 사용 복사
        long BufferTime = copy(bis, bos);
        System.out.println("버퍼 사용:\t" + BufferTime + " ns");

        fis.close();
        fos.close();

        //사용시 예외발생
//        fis2.close();
//        fos2.close();

        bis.close();
        bos.close();
    }

    public static long copy(InputStream is, OutputStream os) throws Exception {
        //시작 시간 저장
        long start = System.nanoTime();

        //1바이트를 읽고, 스트림 버퍼에 1바이트를 출력
        while(true) {
            int data = is.read();
            if(data == -1) break;
            os.write(data);
        }
        os.flush();
        //끝 시간 저장
        long end = System.nanoTime();

        //복사 작업한 시간 리턴
        return (end-start);
    }
}

package ch18.sec07.exam02;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

/*
 문자스트림
 문자스트림에 버퍼기능의 보조스트림을 사용하여, 파일의 내용을 읽어오는 예제.
 */

public class ReadLineExample {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("src/ch18/sec07/exam02/ReadLineExample.java"));

        int lineNo = 1;
        while(true) {
            String str = br.readLine();
            if(str == null) break;
            System.out.println(lineNo + "\t" + str);
            lineNo++;
        }        
        br.close();
    }
}

'데이터 입출력' 카테고리의 다른 글

프린트 스트림  (0) 2023.02.08
기본 타입 스트림  (0) 2023.02.08
문자 변환 스트림  (0) 2023.02.08
보조 스트림  (0) 2023.02.08
문자 입출력 스트림  (0) 2023.02.08