코드 리뷰에 앞서 이 코드는 수업을 위해 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 안 쓴다고 합니다
'개발자 성장 일지' 카테고리의 다른 글
2022.03.21 다양한 예외 처리 (0) | 2022.03.21 |
---|---|
2022.03.21 예외 처리 (0) | 2022.03.21 |
2022.03.17 수업 정리< 입출력 용어 정리 > (0) | 2022.03.20 |
2022.03.16 Interpace 활용 <3단 구현> 코드로 보기 (0) | 2022.03.16 |
2022.03.16 Interpace 활용 <3단 구현> (0) | 2022.03.16 |