IO [Java]

SnowCat·2023년 6월 8일
0

Java - Language

목록 보기
14/17

스트림

  • 자바에서는 파일, 콘솔의 입출력을 스트림이라는 흐름을 통해 다룸
  • 스트림은 운영체제에 의해 프로그램과 IO의 중간 매개자 역할을 하게 됨
    스트림 api와의 혼동 주의

입출력 스트림

  • 스트림은 한 방향으로만 통신이 가능하기 때문에 사용 목적에 따라 입력 스트림과 출력 스트립으로 구분됨
  • 자바에서는 java.io 패키지를 통해 InputStream, OutputStream을 별도로 제공하고 있음
  • 각 클래스에는 read(), write() 메서드가 추상 메서드로 포함되어 있으며, 상황에 맞게 이를 적절히 구현해야 함

바이트 기반 스트림

  • 자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송함
  • 자바에서는 아래와 같은 바이트 기반의 입출력 스트림을 기본 제공함
    • 파일 -> FileInputStream, FileOutputStream
    • 메모리 -> ByteArrayInputStream, ByteArrayOutputStream
    • 프로세스 -> PipedInputStream, PipedOutputStream
    • 오디오 장치 -> AudioInputStream, AudioOutputStream

보조 스트림

  • 자바에서 보조 스트림은 실제 데이터를 주고받을수는 없지만 다른 스트림의 기능을 향상시키거나 새로운 기능을 추가해주는 스트링을 의미함

문자 기반 스트림

  • 자바에서 스트림은 바이트 단위로 데이터를 전송하기 때문에 최소 2바이트인 문자열의 처리는 스트림으로 원활한 처리가 힘들때가 많음
  • 이를 해결하기 위해 자바에서는 문자 기반의 스트림을 제공하며, 이는 InputStream을 Reader로, OutputStream을 Writer로 변경해 사용할 수 있음

표준 입출력

  • 자바에서는 System 클래스를 통해 표준 입출력 클래스를 정의하고 있음
  • System.in은 InputStream을 통해 콘솔로부터 데이터를 입력받고, System.out, System.err는 PrintStream을 통해 콘솔로 데이터를 출력해줌
  • 만약 스트림의 입출력 대상을 다른 장치로 변경하고 싶은 경우 setIn, setOut, setErr 메서드를 사용

File

  • 입출력 스트림을 사용하면 파일을 통한 입출력 작업을 수행할수 있음
  • 하지만 파일의 제거나 디렉터리 작업은 불가능하며, 이를 위해서는 File 클래스를 사용해야 함
public static void main(String[] args){
    File dir = new File("D:\\data"); // 디렉터리 생성
    File file = new File(dir, "data.txt"); // 파일 생성

    if(!file.exists()) {
        System.out.println("파일이 존재하지 않습니다.");
        System.exit(0);
    }

    System.out.println(file.getPath()); // D:\data\data.txt
    System.out.println(file.length()); // 파일 크기 반환
}

RandomAccessFile

  • 입출력 스트림의 경우 파일에 순차적으로 입출력 작업을 수행함
  • 만약 임의 지점에 직접 접근하고 싶은 경우 RandomAccessFile 클래스 사용
public static void main(String[] args){
    try {
        RandomAccessFile file = new RandomAccessFile("data.txt", "rw"); // 앍기모드 (r, rw) 설정 필요
        System.out.println(file.getFilePointer()); // 0
        file.writeInt(10);
        System.out.println(file.getFilePointer()); // 4
        file.seek(20); // 파일 포인터 이동
        System.out.println(file.getFilePointer()); // 20
    } catch (IOException e) {
        e.printStackTrace();
    }
}

출처:
http://www.tcpschool.com/java/java_io_stream

profile
냐아아아아아아아아앙

0개의 댓글