Programming/Java

[Java] 스트림 (Stream)

2023. 8. 8. 15:09
목차
  1. 💡쓰기 스트림
  2. FileOutputStream Class
  3. FileWriter Class
  4. BufferedWriter Class
  5. 💡읽기 스트림
  6. FileInputStream Class
  7. FileReader Class
  8. BufferedReader Class
  9. 💡메모장 만들기
  10. 메모장 쓰기
  11. 메모장 읽기

💡쓰기 스트림


FileOutputStream class > FileWriter class > BufferedWriter class

우리가 사용하는 대부분의 스트림은 일방통행이며, 내뱉기만 하는 빨대가 따로 있고, 들이마시는 빨대가 따로 있다.
양방향인 스트림보다 단방향인 스트림이 더 안정적이고 효율적이기 때문에 구분하여 사용하는 편이다.

 

FileOutputStream Class

try {
    File file = new File("C:\\Class\\code\\java\\file\\list.txt");
    FileOutputStream stream = new FileOutputStream(file);

    stream.write(65); // A
    stream.write(66); // B
    stream.write(67); // C

    // 스트림 닫기
    stream.close();

    System.out.println("종료");

} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}

스트림 열기

스트림 객체를 생성하는 행위를 스트림을 '연다(open)'고 표현한다.
stream을 가지고 쓰기 작업을 하면 file에 적용이 되며, 현재 경로에 list.txt 파일은 없지만, 쓰기 작업을 하면 자동으로 파일이 생성된다.

이 방식은 바이트 단위 쓰기(1byte)를 하므로 한글은 작성할 수 없으므로 주의한다.

 

스트림 닫기

스트림을 썼으면 반드시 닫아주는 작업이 필요하다. 스트림을 닫지 않으면 저장이 안 되고, 잠긴 파일이 되는 현상이 일어날 수 있다. write() 메소드가 실시간으로 작성하는 게 아니기 때문이다.
write() 메소드는 실제 파일이 아닌 메모리 임시 버퍼에 저장을 해 두었다가 close() 메소드가 실행되는 순간 텍스트 파일에 기록한다는 특징이 있다.

file 경로에 list.txt 파일이 생성되고, "ABC"가 저장된 것을 확인할 수 있다.

 

생성 모드, 추가 모드

FileOutputStream stream = new FileOutputStream(file, true); // 추가 모드
FileOutputStream stream = new FileOutputStream(file, false); // 생성 모드

file 뒤에 boolean 값이 있는데, true일 경우 추가 모드(Append mode), false 또는 아무것도 적지 않으면 생성 모드(Create mode)이다.

생성 모드는 덮어쓰기를 하며, 실행할 때마다 기존에 파일이 있든 말든 새로 만들고 새로운 내용을 추가한다.

그리고 추가 모드는 기존 내용을 내버려 두고 그 다음에 이어쓴다.

이클립스에서는 덮어쓰기 하는 생성 모드가 기본값으로 설정되어 있는데, 그 이유는 추가 모드보다 생성 모드를 훨씬 많이 쓰기 때문이다.

 

FileWriter Class

try {
    FileWriter writer = new FileWriter("C:\\Class\\code\\java\\file\\member.txt");

    // writer.write(65);
    // writer.write("Isaac");
    writer.write("아이작");

    // 스트림 닫기
    writer.close();

    System.out.println("종료");

} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}

FileWriter 클래스를 사용하면 문자열을 저장할 수 있다.

 

BufferedWriter Class

try {
    BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Class\\code\\java\\file\\memo.txt"));

    writer.write("하나");
    writer.write('A');
    writer.write("\r\n");
    writer.write("둘");
    writer.newLine(); // BufferedWriter에만 있는 기능
    writer.write("셋");

    // 스트림 닫기
    writer.close();

    System.out.println("종료");

} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}

BufferedWriter 클래스는 FileWriter 클래스와 기능이 동일하지만, newLine() 메소드가 있다.

 

💡읽기 스트림


FileInputStream class > FileReader class > BufferedReader class

FileInputStream Class

try {
    FileInputStream stream = new FileInputStream(Ex65_File.FILE);

    int code = -1;

    while ((code = stream.read()) != -1) {
        System.out.print((char)code);
    }
    
    System.out.println();

    // 스트림 닫기
    stream.close();
    
    System.out.println("종료");
    
} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}

스트림으로 모든 데이터를 출력하고 나면 그 이후부터는 '-1'이 출력된다.

이러한 특징을 이용해 -1이 출력되기 전까지 텍스트를 출력하게 할 수 있다.

 

스트림 경로 관리

public static final String FILE = "C:\\Class\\code\\java\\file\\list.txt";

경로를 final 상수로 정의하면 편하게 사용할 수 있다.

 

FileReader Class

try {
    FileReader reader = new FileReader("C:\\Class\\code\\java\\file\\member.txt");

    int code = -1;

    while ((code = reader.read()) != -1) {
        System.out.print((char)code);
    }

    // 스트림 닫기
    reader.close();

    System.out.println("종료");

} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}

 

 

BufferedReader Class

try {
    BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in)); // 키보드 입력을 받는 스트림
    BufferedReader reader2 = new BufferedReader(new FileReader("C:\\Class\\code\\java\\file\\memo.txt"));

    // String line = reader2.readLine();
    // System.out.println(line);

    String line = null;

    while ((line = reader2.readLine()) != null) {
        System.out.println(line);
    }

    // 스트림 닫기
    reader1.close();
    reader2.close();

    System.out.println("종료");

} catch (Exception e) {
    System.out.println("Error");
}

BufferedReader 클래스는 라인 단위로 읽을 수 있어서 선호도가 높다.

 

💡메모장 만들기


메모장 쓰기

try {
    Scanner scan = new Scanner(System.in);

    System.out.print("저장할 파일명: ");
    String filename = scan.nextLine();

    BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Class\\code\\java\\file\\memo.txt" + filename + ".txt"));

    boolean loop = true;

    while (loop) {
        System.out.print("입력: ");
        String line = scan.nextLine();

        if (line.equals("exit")) {
            break;
        }

        writer.write(line); // 한 줄 입력(scan) > 한 줄 쓰기(writer)
        writer.write("\r\n");
    }

    writer.close();

} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}

 

메모장 읽기

try {
    BufferedReader reader = new BufferedReader(new FileReader("C:\\Class\\code\\java\\JavaTest\\src\\com\\test\\java\\collection\\Ex61_Stack.java"));

    String line = null;
    int n = 1;

    while ((line = reader.readLine()) != null) {
        System.out.printf("%3d: %s\n", n, line);
        n++;
    }

	reader.close();
    
} catch (Exception e) {
    System.out.println("Error");
    e.printStackTrace();
}
더보기
저작자표시 비영리 변경금지
  1. 💡쓰기 스트림
  2. FileOutputStream Class
  3. FileWriter Class
  4. BufferedWriter Class
  5. 💡읽기 스트림
  6. FileInputStream Class
  7. FileReader Class
  8. BufferedReader Class
  9. 💡메모장 만들기
  10. 메모장 쓰기
  11. 메모장 읽기
'Programming/Java' 카테고리의 다른 글
  • [Java] List Interface: LinkedList Class
  • [Java] 사용자 정의 정렬: Anonymous Class, sort(), compareTo(), compareToIgnoreCase()
  • [Java] 인코딩, 디코딩 (Encoding, Decoding)
  • [Java] File/Directory: Input/Output (IO)
Isaac-Christian
Isaac-Christian
내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 (빌립보서 4:13)
Isaac-Christian
Bible, Lee, Data
Isaac-Christian
전체
오늘
어제
  • Isaac (504)
    • Worship (5)
    • Portfolio (12)
      • Bigdata (5)
      • License (3)
      • Service (4)
    • Programming (360)
      • C (3)
      • C++ (2)
      • Git (2)
      • Java (59)
      • JDBC (22)
      • Oracle (55)
      • HTML (19)
      • CSS (31)
      • JavaScript (47)
      • TypeScript (2)
      • React (5)
      • jQuery (5)
      • Servlet (4)
      • JSP (12)
      • Spring (32)
      • AWS (18)
      • R (9)
      • AI (6)
      • Python (14)
      • Figma (9)
      • NVIDIA Omniverse (2)
    • Problem Solving (84)
    • Learning (20)
      • English (15)
      • Spanish (0)
      • Chinese (2)
      • Task (3)
    • Daily Life (23)
      • Review (11)
      • Music (1)
      • Diary (7)
      • ROKMC (4)

블로그 메뉴

  • 🏕️ Home
  • 🌟 GitHub
  • 🪐 BOJ
  • 🗃️ Portfolio
  • 🏷️ tag

공지사항

  • 로마서 12:11-17
  • 데살로니가전서 5:16-18
  • 마태복음 11:28-30

인기 글

태그

  • Spring
  • class
  • JavaScript
  • Server
  • JDBC
  • io
  • JSP
  • DBeaver
  • English
  • problem solving
  • Java
  • Client
  • SQL
  • CSS
  • array
  • AWS
  • oracle
  • HTML
  • VS Code
  • 개발자 환경 구축

최근 댓글

최근 글

hELLO · Designed By 정상우.
Isaac-Christian
[Java] 스트림 (Stream)
상단으로

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.