IO 기본(2)
#Java/adv2
문자를 스트림에서 편리하게 사용하기
/문자 다루기1 - 시작
- 기본적으로 스트림에는 byte를 전달해야 한다 String을 byte로 변환한 다음 전달
byte[] writeBytes = writeString.getBytes(인코딩)
fos.write(writeBytes)
String readString = new String(readBytes, UTF_8)
fis.readAllBytes()
- 문자를 byte로 변환해야하는 번거로움 문자를 byte로 변환해주는 기능을 대신 처리해주는 클래스 등장
- 문자를 바이트로, 바이트를 문자로 바꿔주는 기능을 지원하는 스트림 등장(보조 스트림)
- OutputStream, InputStream의 자식이 아니다.
- 문자를 다루는 클래스인 Writer, Reader의 자식이다.
- Writer, Reader의 자식이라 쓰기/읽기 시에 파라미터로 string을 넘길 수 있다.
- OutputStreamWriter: 스트림에 byte 대신에 문자를 저장할 수 있게 지원한다.
OutputStreamWriter osw = new OutputStreamWriter(fos, UTF_8);
- 변환해주는 책임을 지고, 실제로 write할 스트림을 전달받아 write를 호출한다.
osw.write(string)
- InputStreamReader: 스트림에 byte 대신에 문자를 읽을 수 있게 지원한다.
InputStreamReader isr = new InputStreamReader(fis, UTF_8);
int ch = isr.read()
- char로 캐스팅해서 사용해야 한다. 파일의 끝인 -1을 char로는 표현하지 못하기 때문.
- 문자를 다루는 클래스는
Writer
,Reader
의 자식이다.- OutputStreamWriter, FileWriter, BufferedWriter
- InputStreamReader, FileReader, BufferedReader
- 내부적으로는 문자를 byte로 인코딩해서 저장한다.
- /FileWriter, FileReader
FileWriter fw = new FileWriter(FILE_NAME, UTF_8);
- 내부에서 스스로 FileOutputStream을 하나 생성하기 때문에, fos를 따로 전달해주지 않아도 된다.
fw.write(writeString);
FileReader fr = new FileReader(FILE_NAME, UTF_8);
- 내부에서 스스로 FileInputStream을 하나 생성하기 때문에, fis를 따로 전달해주지 않아도 된다.
int ch = fr.read();
FileWriter
코드와OutputStreamWriter
를 사용한 코드의 구조가 거의 비슷하다. (fis 전달 유무 차이)FileWriter
는OutputStreamWriter
를 상속하기 때문이다.
- InputStream, OutputStream에 버퍼 기능을 제공해주는
BufferedOutputStream
,BufferedInputStream
가 있듯이,Reader
,Writer
에도 버퍼 보조 기능을 제공하는BufferedReader
,BufferedWriter
클래스가 있다. - BufferedWriter
BufferedWriter bw = new BufferedWriter(fw, BUFFER_SIZE);
- 대상 스트림을 전달해야 한다. (버퍼 기능을 제공해주는 보조이므로)
bw.write(writeString);
- BufferedReader
BufferedReader br = new BufferedReader(fr, BUFFER_SIZE);
- 대상 스트림을 전달해야 한다. (버퍼 기능을 제공해주는 보조이므로)
line = br.readLine())
- 한 줄 단위로 문자를 읽는 기능
- EOF에 도달하면 null 반환
- /PrintStream
System.out
에서 사용되는 스트림PrintStream
도 보조 클래스라PrintStream
과FileOutputStream
을 조합하면 마치 콘솔에 출력하듯이 파일에 출력할 수 있다.PrintStream printStream = new PrintStream(fos);
printStream.println("hello java!");
- /DataOutputStream, DataInputStream
- 자바의
String
,int
,double
,boolean
같은 데이터 형을 편리하게 다룰 수 있다. - 이 스트림과
FileOutputStream
을 조합하면 파일에 자바 데이터 형을 편리하게 저장할 수 있다. DataOutputStream dos = new DataOutputStream(fos);
- dos.writeUTF("회원A");
- dos.writeInt(20);
- writeDouble(), writeBoolean(), …
DataInputStream dis = new DataInputStream(fis);
- System.out.println(dis.readUTF());
- readInt(), readDouble,() readBoolean(), …
- 이 스트림을 사용할 때 주의할 점으로는 꼭! 저장한 순서대로 읽어야 한다. 안 그러면 잘못된 데이터가 조회될 수 있다.
writeUTF()
의 경우 UTF-8 형식으로 저장하지만, 나머지의 경우 문자가 아니라 각 타입에 맞는 byte 단위로 저장되어 에디터에서 제대로 보이지 않는다.
- 자바의
- 기본(기반, 메인) 스트림
- File, 메모리, 콘솔등에 직접 접근하는 스트림
- 단독으로 사용할 수 있음
- 예)
FileInputStream
,FileOutputStream
,FileReader
,FileWriter
,ByteArrayInputStream
,ByteArrayOutputStream
- 보조 스트림
- 기본 스트림을 도와주는 스트림
- 단독으로 사용할 수 없음, 반드시 대상 스트림이 있어야함
- 예)
BufferedInputStream
,BufferedOutputStream
,InputStreamReader
,OutputStreamWriter
,DataOutputStream
,DataInputStream
,PrintStream
'Java > IO, Network' 카테고리의 다른 글
[Java] 51. 네트워크 - 프로그램(2) (0) | 2025.07.01 |
---|---|
[Java] 50. 네트워크 - 프로그램(1) (0) | 2025.07.01 |
[Java] 49. File, Files (0) | 2025.07.01 |
[Java] 48. 자바 I/O 활용 (0) | 2025.07.01 |
[Java] 46. 자바 IO 기본(1) (0) | 2025.07.01 |