본 게시글은 대학 전공수업을 들으며 노션에 정리한 내용을 블로그로 옮긴 것으로, 노션 웹을 통해 최적화된 형태로 읽으시길 권장드립니다.(➡️ 노션 링크)

9강 - Java.io:입출력스트림

입출력 스트림

Java 프로그램에서, 스트림을 통해 입출력을 수행. (Java.io패키지에서 제공)

  • 입력 : 데이터 생산자(소스)와 프로그램을 연결
  • 출력 : 프로그램과 소비자(목적지)를 연결

입출력 종류와 상관없이 동일한 방법으로 프로그램 작성

What is stream?

  • 생산자 또는 소비자와 프로그램 사이의 데이터 ‘흐름’
  • 순서가 있는 흐름으로 정해진 방향. 순차적 접근!

스트림

스트림의 분류

  • 입력스트림 vs 출력 스트림 :

  • 바이트 스트림 vs 캐릭터 스트림

    • : 바이트 단위(_InputStream/OutputStream)
    • vs 문자단위(_Reader /Writer)
  • 기본 스트림 vs 보조 스트림

    • 주기능(입출력) 제공 vs 보조기능 제공

    • 기본 스트림 객체 먼저 생성 → 기본 스트림을 감싸 보조스트림 객체를 생성

      FileInputStream fis = new FileInputStream("text.txt"); //생성
      BufferedInputStream bis = new BufferedInputStream(fis); //보조스트림 생성


바이트스트림과 캐릭터 스트림

InputStream 클래스

  • 바이트단위 입력 스트림 클래스 중, 최상위 추상 클래스.
    • 하위 클래스들은 ___InputStream

메소드

abstract int rea()

  • 입력 스트림으로부터 1바이트를 읽어 정수로 리턴

int read(byte[] b)

  • 입력 스트림으로부터 읽어서 byte 배열에 저장, 읽어들인 바이트 개수를 리턴

int read(byte[] b, int off, int len)

  • len 바이트를 읽어 바이트 배열의 off위치부터 저장

int available()

  • 다음 read()할 때, 블로킹 없이 입력 스트림에서 읽을 수 있는 바이트 단위의 데이터 길이

long skip(long n)

  • 입력 스트림에서 n바이트를 건너 뜀

void mark(int readlimit)

  • 입력 스트림에서 현재 위치를 표시함

void reset()

  • mark()에서 표시된 위치로 스트림의 현재 위치를 이동

OutputStream 클래스

바이트 단위 출력 스트림 클래스 중, 최상위 추상 클래스

  • 하위클래스들은 ___OutputStream

메소드

abstract void write(int b)

  • 1바이트 데이터를 출력 스트림에 씀

void write(byte[] b)

  • byte형 배열b의 모든 바이트를 출력 스트림에 씀

void write(byte[] b, int off, int len)

  • byte형 배열 b의 off위치부터 len 바이트를 출력 스트림에 씀

void close()

  • 출력 스트림을 닫고 자원을 돌려줌

void flush()

  • 출력 스트림에 남아있는 모든 데이터를 최종 목적지로 보냄

Reader클래스

입력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스

하위클래스 : ___Reader

(후략)

Writer클래스

출력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스

하위 : ___Writer

(후략)

파일 입출력

File클래스

  • 상대/절대 path를 가지는 파일 또는 디렉터리를 표현
    • 이름/경로의 조회 / 생성 / 삭제
    • 입출력 메소드 제공❌
  • File myFile1 = new File(”D:₩₩Intelij₩₩JavaStudy₩₩src”);
  • File myFile2 = new FIle(”notepad.exe”);

메소드

boolean exists()

  • file객체가, 파일 또는 디렉터리로 존재하는가?

boolean isDirectory()

  • 경로가 디렉터리인가?

boolean isFile()

  • 경로가 파일인가?

String getName() : 이름 리턴

String get Path() : 경로 전체 리턴

long length() : 크기를 바이트 단위로 리턴

boolean createNewFile()

  • 파일 객체에 지정된 파일을 생성

boolean deletE()

  • File객체에 지정된 파일 또는 디렉터리를 삭제

boolean mkdir()

  • file객체에 지정된 것을 디렉터리로 만듦(맨 마지막 디렉터리만 생성)

boolean mkdirs()

  • mkdir과 같으나, 지정된 경로상의 모든 필요한 디렉터리 생성

String[] list()

  • 파일과 디렉터리를 문자열 배열로 리턴

File[] listFiles()

  • 위와 같으나, File객체의 배열로 리턴

String getParent()

  • 상위 디렉터리 이름을 문자열로 리턴

File getParentFIle()

  • 상위 디렉터리를 File객체로 리턴

static File[] listRoots()

  • 루트 디렉터리를 File객체의 배열로 리턴

RandomAccessFile클래스

  • 파일의 임의 위치에서 읽기 또는 쓰기 연산을 지원
    • 파일 오픈 / 위치 지정 / 읽기 또는 쓰기
  • 읽고 쓰는 위치는 파일 포인터가 가리킴
  • byte단위로 읽고 씀, 읽거나 쓸 때 파일 포인터가 이동됨.
    • 따라서 커다란 byte배열로 볼 수 있음.

FileInput/OutputStream

파일로부터 데이터를 읽기/쓰기 위한 입력/출력용 기본 스트림

  • 바이트단위의 입/출력 : 이미지/오디오파일시 유용

생성자 : FileInputStream(File file 또는 String name)

……

FileReader/ FileWriter

Console클래스

: 콘솔 입출력을 제공하는 클래스.

  • 키보드 입력과 화면 출력을 편리하게 지원
  • 터미널 창과 같은 콘솔 환경에서 사용자와의 상호작용 지원.
  • Console con = System.console();을 사용, 콘솔객체 생성

메소드

String readLine()

  • 콘솔에서 한 라인을 읽음

char[] readPassword()

  • 콘솔에서 비밀번호를 읽음. (입력하더라도 화면에 보이지 않음)

PrintWriter writer()

  • 콘솔과 연결된 PrintWriter객체를 리턴함

Reader reader()

  • 콘솔과 연결된 Reader 객체를 리턴

  • 코드

      package lecture09;
    
      import java.io.Console;
    
      public class ConsoleClass {
    
        public static void main(String args[]) {
          String name;
          char[] pw;
          //Eclipse, IntelliJ와 같은 GUI /IDE환경에서는 실행X
          Console con = System.console();
    
          if (con == null) {
            System.out.println("Console not found");
            System.exit(0);
          }
    
          System.out.print("name : ");
          name = con.readLine();
          System.out.print("password : ");
          pw = con.readPassword();
          con.printf("name : %s\n", name);
          con.printf("password : %s\n", new String(pw));
        }
      }