IT자료실/Java
Java (java.io 패키지)
Ramda
2022. 4. 20. 00:55
java.io 패키지
- java.io 패키지는 다양한 입력/출력 방식의 기능을 제공하지만
주로 현업에서 사용하는 건 문서 자료 형식의 자료의 입출력이다.
Stream
- java.io 패키지 클래스들을 사용하려면 우선 Stream의 개념을 알아야 한다.
- 네트워크에서 자료의 흐름과 물의 흐름이 비슷하다고 하여 붙여진 이름이다.
- 저장소로 부터 프로그램으로 데이터를 읽어들이기 위한 연결을 "입력 스트림", 프로그램에서 목적지까지 데이터 출력을 "출력 스트림" 이라 한다.
- 비슷한 개념으로 한쪽으로만 흐르는 파이프를 생각하면 된다.
입출력 클래스의 분류
- 입력 스트림은 InputStream 과 Reader 가 있다. (나머지 입력 스트림은 두 클래스의 하위 클래스)
- 출력 스트림은 OutputStream 과 Writer 가 있다.(나머지 출력 스트림은 두 클래스의 하위 클래스)
- InputStream, Reader, Outpotstream, writer 클래스는 추상 클래스이다.
- 클래스에 Buffered가 붙은 클래스는 입출력 시 속도를 빠르게 할 수 있다. (필터 스트림의 일종)
- InputStream, Outpotstream은 주로 동영상, 사진, 등에 사용한다.
- Reader, Writer 는 주로 문서 자료 형식에 사용 된다.
자바의 표준 입출력
- 자바는 입출력에 System 클래스의 멤버변수인 in, out을 이용.
- in은 static 변수이며, InputStream 타입의 입력 스트림 객체를 참조한다.
- out은 PrintStream 타입의 출력스트림 객체를 참조한다.
- Inputstream, OutputStream은 바이트 타입의 클래스이므로 문자를 반환 못 한다.
- 모든 입출력 스트림의 작업은 종료를 실행해줘야 한다. (ex. input.close, output.close)\
- 모든 입출력 작업은 IOException이 발생할 수 있어서 예외 처리를 해줘야 안전하다.
read() 메서드
- InputStream 사용 시 주로 사용하는 메서드는 read()이다.
- read() 메소드는 입력받은 데이터 중 1byte의 데이터만 읽어서 (int)로 반환한다.
- read()메소드를 문자로 출력하려면 (char)타입으로 명시적 타입변환을 해줘야 한다. (한글은 깨진다)
자바의 문자 단위 입력
- FileInputstream, Fileoutputstream은 대부분 문자의 묵시적형변환을 필요하고 한글이 깨지는 상황으로 주로 사용하지 않는다.
- FileReader를 주로 사용한다.
- FileReader도 사용 후 종료가 필요하다.
필터 스트림 결합
- 데이터를 읽을 때 성능 향상을 위해 BufferedReader 스트림을 사용한다.
- BufferedReader 스트림은 속도가 FileReader 보다 더 빠르다.
- 두 가지 스트림을 결합하는 방식으로 사용한다
결합 방식은 아래와 같이 사용
FileReader reader = new FileReader("read.txt");
BufferedReader buffReader = new BufferedReader(reader);
위 방식을 하나로 합칠 수 있다.
BufferedReader buffReader = new BufferedReader(FileReader reader = newFileReader("read.txt"));
- 위 두 스트림의 결합은 거의 같이 사용한다.
라인단위 입력 (readLine() 메서드)
- 필터 스트림을 결합하면 라인 단위로 데이터를 읽어 들일 수 있는 readLine() 메서드를 사용할 수 있다.
- 앞서 배운 .split 메서드와 같이 사용하면 원하는 위치에서 분할 하여 라인단위로 읽을 수 있다.
자바의 문자 단위 출력
- 입력과 특징은 같다.
- 출력은 특정 파일과 연결된 출력 스트림을 생성하여 출력하는 것 이다.
- 문자 단위 출력은 FileWriter를 사용한다.
Scanner 입출력
- java.util에 있는 Scanner 기능으로 자바 프로그램 상에서 입출력을 할 시 자주 사용한다.
사용 예시 코드
public class ScannerTest {
public static void main(String[] args) throws IOException {
// 사용자가 입력한 메시지를 읽기 위한 Scanner 객체
Scanner input = new Scanner(System.in);
// 사용자가 입력한 메시지를 읽는 작업을 무한 반복하는 반복문
while (true) {
System.out.println("메시지 입력 후 Enter를 치세요.(종료는 quit)");
String message = input.nextLine();
if(message.equals("quit")) {
// 읽은 메시지가 quit인 경우 while 블록을 종료
break;
}
System.out.println("입력한 메시지 : " + message);
}
// Scanner를 종료한다.
input.close();
System.out.println(“프로그램 종료”);
}
}