[Java] 47. 자바 IO 기본(2)

2025. 7. 1. 16:52·Java/IO, Network
IO 기본(2)

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로 변환해주는 기능을 대신 처리해주는 클래스 등장


/문자 다루기2 - 스트림을 문자로

  • 문자를 바이트로, 바이트를 문자로 바꿔주는 기능을 지원하는 스트림 등장(보조 스트림)
    • 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로는 표현하지 못하기 때문.

/문자 다루기3 - Reader, Writer

  • 문자를 다루는 클래스는 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 를 상속하기 때문이다.

/문자 다루기4 - BufferedReader

  • 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

Ref) 김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션 강의 | 김영한 - 인프런

'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
'Java/IO, Network' 카테고리의 다른 글
  • [Java] 50. 네트워크 - 프로그램(1)
  • [Java] 49. File, Files
  • [Java] 48. 자바 I/O 활용
  • [Java] 46. 자바 IO 기본(1)
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (457)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Java] 47. 자바 IO 기본(2)
상단으로

티스토리툴바