- InputStream:
- 바이트(byte) 단위로 읽어들인다.
- 주로 파일, 네트워크 연결, 시스템 입력 등과 같은 원시 바이트 데이터를 읽을 때 사용된다.
- read() 메서드를 통해 한 바이트씩 데이터를 읽는다.
- 이 클래스를 통해 문자나 숫자를 읽어들이면, 아스키코드 값이 출력된다.
=> 아스키 코드 값이 출력되므로 우리가 다시 문자로 해석해야하는 불편함이 있다.
InputStream is = new FileInputStream("example.txt");
int data = is.read();
우리가 입력한 문자를 그대로 출력하고 싶다면 - !
- InputStreamReader:
- 바이트 스트림을 문자 스트림으로 변환하는 역할을 한다.
- InputStream 을 통해 입력받은 뒤 문자로 변환시키는 중개자 역할을 한다.
BUT ... 🫠 모든 유니코드 문자를 완전히 지원하진 못한다 ( ex. 한글을 제대로 인식하지 못한다)
- 고정된 길이로만 데이터를 읽을 수 있다.
InputStreamReader의 read() 메서드는 1 바이트 단위로 읽어 들인다.
- InputStreamReader의 생성자는 IOException을 던질 수 있다.
InputStreamReader isr = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8");
int data = isr.read();
이것도 불편하다.. 고정된 길이 말고 사용자가 입력한 입력을 전부 받고 싶다면 ?
- BefferedReader:
- 문자 입력 스트림에 버퍼링 기능을 추가하는 클래스
- BefferedReader 객체 생성 시 생성자의 입력값으로 InputStreamReader 의 객체가 필요하다.
- readLine() 메서드를 사용하여 한 줄씩 문자열을 읽을 수 있다.
=> 한 줄씩 읽는 데 유용하다 !
- BefferedReader 객체 생성 시 생성자의 입력값으로 InputStreamReader 의 객체가 필요하다.
BufferedReader br = new BufferedReader(new FileReader("example.txt"));
String line = br.readLine();
- Scanner:
- 텍스트를 파싱하여 원하는 형식으로 읽을 수 있다.
- 특정 데이터 유형에 대한 메서드 (nextInt(), nextDouble() 등)를 제공하여 간편하게 입력을 처리할 수 있다.
=> 다양한 타입의 데이터를 입력받을 수 있다
- Scanner 클래스는 생성자의 입력값으로 System.in, 즉 InputStream 이 필요하다.
Scanner scanner = new Scanner(new File("example.txt"));
int value = scanner.nextInt();
BefferedReader 와 Scanner 의 차이점이 궁금하다 🧐
[ 주요한 차이점 ]
-
버퍼링:
- BufferedReader: 데이터를 효율적으로 읽기 위해 내부에 버퍼를 사용한다. 따라서 입출력이 더 효율적이고 빠르다.
- Scanner: 내부에 버퍼를 사용하지 않는다. 이로 인해 입출력이 덜 효율적일 수 있다.
-
파싱:
- BufferedReader: 주로 문자열을 읽는 데 중점을 두고, 특별한 파싱 기능을 제공하지 않는다.
- Scanner: 입력된 데이터를 간단하게 파싱하여 특정 데이터 타입으로 변환할 수 있는 메서드를 제공한다.
-
사용 편의성:
- BufferedReader: 주로 문자열을 읽는 데 사용되며, 더 저수준의 입출력을 다루는 데 유용하다.
- Scanner: 다양한 유형의 입력 데이터를 간편하게 처리할 수 있어서 사용자 입력이나 파일 입력을 다루는 데 편리하다.
사용 목적, 요구 사항, 편의성에 따라 BufferedReader 또는 Scanner 중 선택하여 사용하면 될 듯 하다 !