[Java] 입출력 (I/O) 2
지난 시간에 바이트기반 스트림에 대해 알아봤으니 이번에는 문자기반 스트림에 대해 알아보자.
바이트기반 스트림과 문자기반 스트림은 매우 유사하다.
집중해서 봐야 할 부분은 byte[] 에서 char[]로 바뀌었다는 점이다.
단위만 문자 단위로 쓰는구나... 라고 생각하고 공부하자.
위쪽 부분에서 FileInputStream은 바이트단위로 처리하고, FileReader는 문자 단위로 처리한다.
FileInputStream을 통해 파일 내용을 읽게 되면 영어는 1바이트로 처리할 수 있어 제대로 처리되지만, 한글은 2바이트가 이상이기 때문에 (UTF-8 16 인코딩에 따라 다르긴 함) 텍스트가 깨진다.
똑같은 문장을 FileReader로 읽을 경우에는 문자 단위로 처리하기 때문에 텍스트가 깨지지 않는다.
PipeReader와 PipeWriter는 프로세스(쓰레드)간의 통신에 사용된다. (쓰레드끼리의 통로를 만듦 쓰레드끼리 자원을 공유할 때 전역변수를 생성하고... 이렇게 할 수 있지만 쓰레드끼리의 통로를 만들어 처리할수도 있다.)
당연히 바이트 단위로 처리하는 PipeInputStream과 PipeOutputStream도 존재한다.
connect 메서드로 Reader와 Writer를 이어준다.
connect는 쌍방향이기 때문에 Input에서 Output으로 가든 반대로 가든 상관 없다.
getOutput()은 pipewriter를 return 함.
쓰레드 간의 통신을 수행하는 방법 중 하나로 생각하자.
문자기반의 보조스트림에도 Buffered가 존재한다.
여기서 readLine()메서드가 매우 중요한데, sc.nextLine()으로 입력받을 때는 개행문자 "\n"가 하나의 문자로 인식되기 때문에 readLine()으로 읽을 시 "\n"가 파싱된(제거된) 상태로 읽어올 수 있어서 굉장히 편한 메서드이다.
newLine() 메서드로 개행문자 "\n" 을 출력해 줄 수 있음.
사용 예시를 살펴보자.
보조스트림을 사용하기 위해 BufferdReader의 인자로 FileReader를 넣어줬다.
한줄씩 line에 저장하고 line에 ; 가 포함돼있으면 해당 line을 출력한다.
보조 스트림 Buffer 를 잘 사용할 수 있도록 익숙해지자!!
표준 입출력...
출력을 수행할 때 System.out.print(""); 를 밥먹듯 사용했고
입력을 수행할 때 Scanner sc = new Scanner(System.in); 을 밥먹듯 사용했다. (이제 readLine()도 가능)
근데 System.out 과 System.in이 뭐길래 계속 사용하는 걸까?
표준 입력은 키보드, 표준 출력은 모니터 (화면)이라고 생각하자.
System을 관장하는 클래스가 있고, 여기서 정의되는 클래스 메서드들이 존재한다.
println은 클래스 메서드니까 객체를 생성할 필요 없이 바로바로 사용할 수 있다.
System.in : 데이터를 입력받을 때 사용
System.out : 데이터를 출력할 때 사용
System.err : 데이터를 출력할 때 사용 특히 에러메세지
in은 InputStream으로 정의돼있고, out과 err은 PrintStream(보조스트림)으로 정의돼있다.
out과 err을 사용하려면 원래 스트림이 있어야 한다.
표준 출력은 모니터인데, 파일에다가 출력되도록 출력 소스를 바꾸고 싶으면 setOut을 사용하면 된다.
setOut의 인자로 PrintStream이 들어가는데, 여기에 어떤 파일InputStream을 인자로 받는 PrintStream을 넣어주면 System.out의 출력 소스가 변경된다.
setIn은 InputStream을 인자로 받기 때문에 바로 사용할 수 있다.
그러니까... System.out.println()으로 항상 콘솔창에 출력을 진행했었는데 이건 내가 setOut으로 출력 소스를 바꾸지 않아서 화면에 출력되는거였구나~~ 이것도 일종의 Writer 였구나~~
System.in은 키보드로 입력받는다는걸 의미하는 거구나~~ setIn으로 입력 소스를 바꾸지 않으면 키보드로 입력받는다는거구나~~ 라고 생각하자.
키보드로 입력 받으면 입력받은걸 byte 단위로 읽어서 출력한다.
hello를 입력했고, h e l l o를 모두 읽은 다음에는 줄바꿈문자와 파일의 끝을 출력했다.
끝내려면 ctrl + z (Signal 이라는건데, 운영체제에서 배우기)
줄바꿈문자 없이 바로 String으로 읽고 싶다.
BufferedReader를 사용하자. BufferedReader의 인자에는 다른 Reader가 들어가야 한다.
BufferedReader로 처리 시 한번에 출력된다.
파일을 관리할 때 사용하는 메서드들에 대해 알아보자. (시스템 프로그래밍에서 자주 사용됨)
절대경로 : 최상위 경로. C드라이브부터 시작 ~ 파일의 위치
상대경로 : 특정 위치를 기준으로 시작 ~ 파일의 위치
정규경로 : 정형화된 format을 지정해 줌. 정형화된 형태의 하나의 경로만 인정. (Canonical) fixed된 format 으로 생각
사용 예시 보고 마무리하자.
필요하면 그때그때 reference 참고해서 사용하자.
'Programming Language > Java' 카테고리의 다른 글
[Java] 네트워킹 (Networking) 2 (0) | 2021.12.13 |
---|---|
[Java] 네트워킹 (Networking) 1 (0) | 2021.12.05 |
[Java] 입출력 (I/O) 1 (0) | 2021.11.21 |
[Java] 쓰레드 (Thread) 2 (0) | 2021.11.12 |
[Java] 쓰레드 (Thread) 1 (0) | 2021.11.08 |
댓글
이 글 공유하기
다른 글
-
[Java] 네트워킹 (Networking) 2
[Java] 네트워킹 (Networking) 2
2021.12.13 -
[Java] 네트워킹 (Networking) 1
[Java] 네트워킹 (Networking) 1
2021.12.05 -
[Java] 입출력 (I/O) 1
[Java] 입출력 (I/O) 1
2021.11.21 -
[Java] 쓰레드 (Thread) 2
[Java] 쓰레드 (Thread) 2
2021.11.12