[F-Lab 모각코 챌린지] 9일차 - Thread 복습 & IO
F-Lab 모각코 챌린지 9일차 를 진행하며 정리 한 글입니다 Thread 에 대한 간단한 복습과 IO 클래스를 소개하였습니다. IO 클래스는 하위 구현 클래스의 간단한 설명을 함께 첨부하였습니다.
![[F-Lab 모각코 챌린지] 9일차 - Thread 복습 & IO](/content/images/size/w1200/2023/06/-------_--------_-------2.png)
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: 파일, 네트워크 연결...)
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 작업을 효율적으로 수행 가능 - 속도 향상: 버퍼링 기능에 의해 입출력 작업 속도 향상.
데이터를 한 번에 읽거나 쓰는 것은 시스템 호출 오버헤드를 줄이고 작업을 메모리 내의 버퍼에서 처리 할 수 있음 - 문자 단위 처리
- 라인 단위 처리