개발자 성장 일지

2022.03.18 입출력 속도

NEWDODORIPYO 2022. 3. 20. 20:04

코드 리뷰에 앞서 이 코드는 수업을 위해 bad code로 작성되었습니다 

코드

 //bad code
    public static void main(String[] args) throws Exception{
        //저장된 사진 불러오기
        InputStream inputStream = new FileInputStream("C:\\zzz\\aaa.jpg");

        System.out.println(inputStream);
        //복사본 만들기
        OutputStream outputStream = new FileOutputStream("C:\\zzz\\copy.jpg");
        //읽고 쓰는 시간 측정하기 위한
        //시작점
        long start = System.currentTimeMillis(); // 1970-01-01 이 기준점

        //배열로 읽기 위해 배열 생성 <입출력 수를 줄이기 위해 배열로 읽기>
        //한번에 100개씩 읽기
        byte[] buffer = new byte[100];

       //파일을 읽기 위해 하지만 얼마나 읽어야 하는지 알지 못하기에 for 가 아닌 while
        while(true){
            //배열로 읽기
            int count = inputStream.read(buffer);
            if(count== -1){
                break;
            }
            //             (배열   , 복사 시작점 , 몇개 복사할 것인지)
            // 복사시 손실 없게 하기 위해 outputStream.write(buffer,0,count) 이 메소드를 사용
            outputStream.write(buffer,0,count);
        }//end while
        //시간 체크 종료지점
        long end = System.currentTimeMillis();

        System.out.println("-----------------");
        System.out.println(end-start);
    }
}

pc에 저장된 파일을 복사하는 로직을 만들어 보았습니다 

 

중요했던 내용 

이 코드를 작성하면서 중요하게 말씀해 주셨던 내용들을 정리해 보겠습니다

 

입출력 속도 

입출력의 수가 줄어들수록 속도가 빨라진다(성능 향상) <byte 로 읽는 거보다 byte [ ]로 읽는다> 읽을 때 8kb[ ] 가장 효율이 좋다

 

InputStream

 

InputStream 안에는 read  메소드가 있다  

 

read 메소드마다 int의 개념이 다르다 

read( ) -> int ------1 byte 내용물 (내용물 자체가 반환 값)

read(byte [ ]) -> int ---------내용물은 byte [ ]로 들어가고  int 카운트 <몇 개나 새로운 데이터를 있는지>

 

OutputStream

OutputStream 안에는 write 메소드가 있다 

 

write(int)

write(byte[ ])

write(byte [ ] , int , int) ---이것만 사용한다 <배열 안에 있는 내용물의 전체가 담기면 원본과 틀어진다>

byte[ ] 안에서의 기록의 시작 위치와 (첫 번째 int 파라미터)와 기록을 원하는 데이터의 수(두 번째 int 파라미터)를 제어할 수 있습니다. 이렇게 byte[ ]을 세밀히 처리할 수 있기 때문에 실제로 코드를 작성하면서 가장 많이 사용하는 메소드

 

믿었던 System.out.println 의 배신 

코드를 작성하던중 코드의 변화는 없는 데 속도가 느려지는 현상이 생겼습니다 이유를 전혀 모르고 있었는데 그 이유는 바로 System.out.println 이었습니다 System.out.println를 많이 사용하면 성능이 떨어지기에 엔터프라이즈급 작업을 할때는  System.out.println 안 쓴다고 합니다