보조 스트림은 다른 스트림과 연결돼서 문자 변환, 성능 향상 등 다양한 기능을 제공하며,
다른 보조 스트림과 체인처럼 연결되어 사용될 수 있습니다.
만약 보조 스트림을 사용하게 된다면 안쪽 보조 스트림을 가장 먼저 자원해제 해야합니다.
1. 문자 변환 보조 스트림
문자 변환 보조 스트림은 바이트를 문자로 변환하는 스트림입니다.
public class InputStreamReaderExample {
public static void main(String[] args) throws IOException {
// 바이트 기반의 기본 입력 스트림 생성
InputStream is = System.in; // 표준입력을 변수에 저장
// 기본 입력 스트림을 문자 기반의 입력 스트림(Reader)로 변환
// 즉, 기본 스트림에 보조 스트림을 사용함
Reader reader = new InputStreamReader(is);
// 보조스트림을 사용했으므로, 문자 기반으로 입력 수행
int readCharNo;
char[] cbuf = new char[100]; // 문자 기반 배열 생성
// EOF(스트림의 끝)를 만날때까지, 문자기반의 입력 수행
while ((readCharNo = reader.read(cbuf)) != -1) { // EOF(-1)
// cbuf 크기만큼의 문자들을 읽어서, 문자열 조각 생성
String data = new String(cbuf, 0, readCharNo);
// 문자열 조각 출력
System.out.println(data);
} // while
// 보조 스트림 자원 해제 후, 기본 스트림 자원 해제
reader.close(); // 보조
is.close(); // 기본
} // main
} // end class
사용자가 입력한 내용을 그대로 출력하는 코드입니다.내용을 입력하고 엔터를 누르면 보조스트림이 바이트 코드로 변환 후 프로세스에 전달합니다.
여기서 윈도우 운영체제에서는 엔터를 누를 때 발생하는 두 개의 문자가 있습니다.
- Carriage Retrun (CR) : 현 행의 가장 처음 칼럼으로 이동
- Line Feed (LF) : 다음 로우로 이동
즉, 엔터키를 누르면 CR이 발생하여 현 행의 가장 처음 칼럼으로 이동 후 LF가 발생해 바로 다음 로우로 이동해서 줄 변환이 이루어집니다.
반면, Linux나 Unix, Mac 등 다른 운영체제에서는 LF, CR중 1개의 문자만 발생합니다.
다만, 위 코드에서는 CR/LF에 대한 처리를 따르 하고있지 않기 때문에, 사용자가 텍스트 입력 후 엔터를 눌렀다면,
CR/LF도 출력 결과에 포함되어 나오게 됩니다.
그렇기 때문에, 입력한 각 줄이 새로운 줄에 출력됩니다.
2. 성능 향상 보조 스트림
기본 스트림의 입출력 성능을 향상시키는 보조 스트림입니다.
네트워크의 버퍼는 데이터의 조각인 패킷을 임시로 저장하는 공간입니다.
이와 유사하게 성능 향상 보조 스트림도 버퍼 기반으로 동작을 수행하는데, 이는 데이터를 한번에 쓰고 읽는데 효율적입니다.
다만, 버퍼의 크기를 너무 크거나 작게 설정하면 오히려 성능 저하를 일으킬 수 있기 때문에 여러 요인을 고려해서 신중하게 버퍼의 크기를 선택해야 합니다.
@log4j2
public class FileOutputStreamExample {
public static void main(String[] args) throws Exception{
long start = 0;
long end = 0;
String sourcePath = "C:/Temp/WINDOWS.X64_193000_db_home.zip";
String targetPath = "C:/Temp/WINDOWS.X64_193000_db_home_target.zip";
@Cleanup
FileInputStream fis = new FileInputStream(sourcePath);
BufferedInputStream bis = new BufferedInputStream(fis);
@Cleanup
FileOutputStream fos = new FileOutputStream(targetPath);
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 바이트 배열(100바이트)을 생성 후
// 소스 파일에 대한 입력스트림에서 바이트들을 읽어서,
// 타겟 파일에 대한 출력스트림(원래는 출력 버퍼)에 출력하여
// 복사 기능을 수행
int readByteNo; // 한번 바가지로 읽을 때마다, 실제 읽어낸 바이트의
// 갯수를 저장할 변수 선언
// 입출력 용도로 사용할 바이트 배열(100바이트) 생성
byte[] readBytes = new byte[500];
// 입력 버퍼로부터 바가지 크기만큼 읽어내고,
// 입력 버퍼의 EOF(스트림의 끝)을 만날 대까지 실제로 읽어낸 바이트들을
// 출력
// ---------------------------------
start = System.currentTimeMillis();
// ---------------------------------
while((readByteNo = bis.read(readBytes)) != -1) { // 복사 기능 수행
bos.write(readBytes, 0, readByteNo); // 실제 읽어낸 바이트 개수 사용
} // while
// ---------------------------------
end = System.currentTimeMillis();
// ---------------------------------
// 출력 버퍼 플러싱
bos.flush();;
log.info("time : {}", end - start);
} // main
} // end class
성능 향상 보조 스트림의 사용 유무에 따라 효율이 크게 차이나게 됩니다.
'Java' 카테고리의 다른 글
레코드 (0) | 2023.09.06 |
---|---|
객체 입출력 스트림 (0) | 2023.08.18 |
파일 클래스 (0) | 2023.08.17 |
Exception Handling (0) | 2023.07.28 |
Exception (0) | 2023.07.27 |