[F-Lab 모각코 챌린지] 9일차 - Thread 복습 & IO

F-Lab 모각코 챌린지 9일차 를 진행하며 정리 한 글입니다 Thread 에 대한 간단한 복습과 IO 클래스를 소개하였습니다. IO 클래스는 하위 구현 클래스의 간단한 설명을 함께 첨부하였습니다.

[F-Lab 모각코 챌린지] 9일차 - Thread 복습 & IO

Thread 복습

sleep 메서드를 호출 할 때 try-catch 로 감싸 주어야 하는 이유?

InterruptedException 을 처리하기 위함

sleep 을 호출하여 스레드가 정지되어 있는 동안 다른 스레드에서 해당 스레드를 인터럽트 할 수 있음

인터럽트?

실행중인 스레드에게 외부에서 신호를 보내어 현재 수행중인 작업을 중단하도록 하는 메커니즘

인터럽트가 발생하면 InterrutedException 발생

IO

  • IO: JVM 기준의 Input/Output 약자
  • 바이트 기반의 데이터 처리: InputStream, OutputStream
  • 문자 기반의 데이터 처리: Reader, Writer
  • 스트림: 끊기지 않고 연속적인 데이터
  • JDK 1.4 이후 부터는 보다 빠른 IO 를 위해 NIO(New IO) 가 추가됨
    NIO 는 스트림 기반 X, 버퍼(Buffer) 와 채널(Channel) 기반으로 데이터를 처리
  • Java 7 에서 NIO2 추가됨

class File

  • java.io 에 위치함
  • 이름은 File 이지만, 파일만 가리키는 것이 아니라 파일의 경로 정보도 포함
  • File 클래스는 정체가 불분명하고, 심볼릭 링크(Symbolic link) 와 같은 유닉스 계열의 파일에서 사용하는 몇몇 기능을 사용하지 못함
  • File.separator: OS 마다 디렉터리를 구분하는 기호가 다르기 때문에 제공.
  • NIO2 에서는 Files 라는 클래스에서 File 클래스에 있는 메소드들을 대체하여 제공
    Files 는 모든 메서드가 static
메서드 설명
File(String pathname) 주어진 경로에 해당하는 파일 또는 디렉토리를 나타내는 File 객체를 생성함.
File(String parent, String child) 지정된 부모 경로와 자식 경로를 결합하여 파일 또는 디렉토리를 나타내는 File 객체를 생성.
File(File parent, String child) 지정된 부모 파일과 자식 경로를 결합하여 파일 또는 디렉토리를 나타내는 File 객체를 생성.
boolean exists() 파일이나 디렉토리가 실제로 존재하는지 확인.
boolean isDirectory() 현재 File 객체가 디렉토리인지 확인.
boolean isFile() 현재 File 객체가 파일인지 확인.
String getName() 파일 또는 디렉토리의 이름 리턴.
String getPath() 파일 또는 디렉토리의 경로 리턴.
String getAbsolutePath() 파일 또는 디렉토리의 절대 경로 리턴.
long length() 파일의 크기를 바이트 단위로 리턴.
boolean createNewFile() 지정된 경로에 새로운 빈 파일을 생성.
boolean delete() 파일 또는 디렉토리를 삭제.
boolean renameTo(File dest) 파일 또는 디렉토리의 이름을 변경.
String[] list() 디렉토리에 포함된 파일과 하위 디렉토리의 이름을 문자열 배열로 리턴.
File[] listFiles() 디렉토리에 포함된 파일과 하위 디렉토리를 File 배열로 리턴.
boolean mkdir() 디렉토리를 생성.
boolean mkdirs() 디렉토리와 하위 디렉토리를 모두 생성.

Stream

스트림은 데이터의 연속적인 흐름을 나타내는 추상화 개념

데이터 소스로 부터 데이터를 읽어오거나 출력하는 작업을 수행

InputStream, OutputStream

Java 에서 제공하는 abstract class 로서, 바이트 형태의 데이터를 다루기 위한 클래스

  • InputStream: 어떤 대상의 데이터를 읽을 때 사용
  • OutputStream: 어떤 대상의 데이터를 쓸 때 사용

InputStream

어떤 대상의 데이터를 읽을 때 사용

💡
InputStream 에서는 Closable 이라는 인터페이스가 존재.
Closable: "닫을 수 있다" 는 것을 의미.
리소스를 닫는 기능의 함수를 제공하는데, InputStream 을 통해 어떤 데이터를 읽었을 때 반드시 닫아야 하기 때문
여기서 리소스란, 스트림을 통해서 작업할 수 있는 모든 것. (ex: 파일, 네트워크 연결...)

InputStream 을 상속한 주요 확장 클래스들이 존재

  • AudioInputStream: 오디오 데이터를 읽기 위한 입력 스트림 클래스
  • ByteArrayInputStream: 바이트 배열로부터 데이터를 읽기 위한 입력 스트림 클래스
  • FileInputStream: 파일로부터 데이터를 읽기 위한 입력 스트림 클래스
  • FilterInputStream: 다른 입력 스트림을 래핑하여 추가적인 기능을 제공하는 필터 클래스
  • ObjectInputStream: 객체를 역직렬화하여 읽기 위한 클래스로, InputStream을 기반으로 동작
  • PipedInputStream: 파이프로부터 데이터를 읽기 위한 클래스로, 다른 스레드로부터 파이프를 통해 데이터를 받을 수 있음
  • SequenceInputStream: 여러 개의 입력 스트림을 연속적으로 연결하여 하나의 입력 스트림으로 읽기 위한 클래스
  • StringBufferInputStream: 문자열 버퍼로부터 데이터를 읽기 위한 클래스

OutputStream

어떤 대상의 데이터를 쓸 때 사용

OutputStream 을 상속한 주요 확장 클래스들이 존재

  • ByteArrayOutputStream: 바이트 배열에 데이터를 쓰는(write) 스트림 클래스
  • FileOutputStream: 파일에 데이터를 쓰는(write) 스트림 클래스
  • FilterOutputStream: 다른 출력 스트림을 래핑하여 추가 기능을 제공하는 필터 클래스
  • ObjectOutputStream: 객체를 직렬화하여 쓰는(write) 스트림 클래스
  • PipedOutputStream: 파이프를 통해 데이터를 쓰는(write) 스트림 클래스
  • BufferedOutputStream: 버퍼를 사용하여 데이터를 쓰는(write) 스트림 클래스
  • DataOutputStream: 원시 데이터 타입을 바이트로 변환하여 쓰는(write) 스트림 클래스
  • PrintStream: 텍스트 데이터를 쓰는(write) 스트림 클래스로, 추가적인 서식화 기능을 제공
  • GZIPOutputStream: GZIP 압축을 사용하여 데이터를 쓰는(write) 스트림 클래스

Reader 와 Writer

문자 단위의 데이터를 처리(읽기/쓰기)하기 위해 Java 에서 제공하는 abstract class.

여러 인코딩을 제공하며 다양한 형태의 텍스트 파일을 처리 할 수 있음

  • Reader: 문자 데이터를 입력받는 기능을 제공
  • Writer: 문자 데이터를 출력하는 기능 제공

Reader

  • BufferedReader: 버퍼 문자열 데이터를 읽기 위한 클래스로, Reader 객체를 래핑하여 추가적인 기능을 제공
  • CharArrayReader: 문자 배열로부터 데이터를 읽기 위한 클래스
  • FilterReader: 다른 Reader 클래스를 래핑하여 추가적인 기능을 제공하는 필터 클래스
  • InputStreamReader: 바이트 기반의 입력 스트림에서 문자열 데이터를 읽기 위한 클래스
  • LineNumberReader: 행 번호를 추적하면서 문자열 데이터를 읽기 위한 클래스로, BufferedReader를 상속
  • PipedReader: 파이프로부터 문자열 데이터를 읽기 위한 클래스
  • StringReader: 문자열로부터 데이터를 읽기 위한 클래스

Writer

  • BufferedWriter: 버퍼링된 문자열 데이터를 쓰기 위한 클래스로, Writer 객체를 래핑하여 추가 기능을 제공
  • CharArrayWriter: 문자 배열에 데이터를 쓰기 위한 클래스
  • FilterWriter: 다른 Writer 클래스를 래핑하여 추가 기능을 제공하는 필터 클래스
  • OutputStreamWriter: 바이트 기반의 출력 스트림에 문자열 데이터를 쓰기 위한 클래스
  • PipedWriter: 파이프에 문자열 데이터를 쓰기 위한 클래스
  • PrintWriter: 텍스트 데이터를 포맷화하여 출력하는 클래스로, Writer를 상속
  • StringWriter: 문자열 버퍼에 데이터를 쓰기 위한 클래스

BufferedReader 와 BufferedWriter 를 사용하는 이유?

  • 버퍼링 기능: 내부에 데이터를 임시로 저장하는 버퍼 기능을 가지고있음
    이를 통해 데이터를 일괄적으로 읽거나 쓸 수 있으며, 시스템 호출 횟수를 줄이고 IO 작업을 효율적으로 수행 가능
  • 속도 향상: 버퍼링 기능에 의해 입출력 작업 속도 향상.
    데이터를 한 번에 읽거나 쓰는 것은 시스템 호출 오버헤드를 줄이고 작업을 메모리 내의 버퍼에서 처리 할 수 있음
  • 문자 단위 처리
  • 라인 단위 처리