1. InputStreamReader클래스

스트림의 또 다른 흥미로운 기능은 여러 스트림을 체인 으로 결합할 수 있다는 것입니다 . 스트림은 내부 데이터 소스뿐만 아니라 다른 스트림 에서도 데이터를 읽을 수 있습니다 .

이는 하나의 스트림을 다른 스트림에 연결하여 복잡한 데이터 읽기 시나리오를 생성할 수 있게 해주는 Java의 매우 강력한 메커니즘입니다. 이러한 구성표는 다음과 같습니다.

InputStreamReader 클래스

프로그램이 데이터 스트림에서 데이터를 읽을 때 데이터 스트림은 데이터 소스(예: 다른 데이터 스트림 또는 파일)에서 데이터를 읽습니다.

또한 각 데이터 스트림은 데이터를 읽고 내보낼 뿐만 아니라 데이터를 변환하거나 다양한 작업을 수행할 수도 있습니다. 이러한 "중간 스트림"의 좋은 예는 클래스입니다 InputStreamReader.

우리는 이미 파일에서 데이터를 읽는 클래스 FileReader라는 것을 알고 있습니다. Reader그리고 InputStreamReader데이터는 어디에서 가져옵니까? 맞습니다 — InputStream.

개체를 만들 때 개체 또는 해당 하위 클래스 중 하나를 InputStreamReader전달해야 합니다 . InputStream예:

String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);

클래스 에는 클래스에 있는 InputStreamReader모든 메서드가 있으며 Reader정확히 동일한 방식으로 작동합니다.

InputStreamReader클래스와 예를 들어 클래스 간의 주요 차이점은 FileReader데이터를 읽는 위치입니다. FileReader파일에서 데이터를 읽지만(이게 바로 이라고 하는 이유 입니다 FileReader) .InputStreamReaderInputStream

FileReader메서드를 사용하여 개체 에서 문자를 읽으면 read()디스크의 파일에서 2바이트를 읽어 chars.

InputStreamReader메서드를 사용하여 개체 에서 문자를 읽으면 전달된 개체 read()에서 2바이트를 읽고 FileInputStream파일에서 데이터를 읽습니다. 결과는 메서드 에 대한 호출 체인read() 입니다 .


2. BufferedReader클래스

많이 사용하게 될 또 다른 흥미로운 클래스는 BufferedReader. 이것은 또한 다른 스트림에서 데이터를 읽는 "중간 스트림"입니다.

이름에서 알 수 있듯이 이 BufferedReader클래스는 의 하위 클래스 Reader이며 문자를 읽을 수 있습니다 . 그러나 가장 흥미로운 점은 문자를 읽을 수 있는 스트림 , 즉 클래스를 상속하는 스트림 의 형태로 데이터 소스를 전달해야 한다는 것입니다 Reader.

점은 무엇인가? 와 달리 InputStreamReaderBufferedReader클래스는 바이트를 문자로 변환하지 않습니다. 아무 것도 변환하지 않습니다. 대신 데이터를 버퍼링합니다 .

프로그램이 개체에서 단일 문자를 읽을 때 BufferedReader개체는 소스 스트림에서 한 번에 많은 문자 배열을 읽습니다. 그리고 내부적으로 저장합니다.

개체에서 다음 문자를 읽으면 BufferedReader내부 버퍼 배열에서 다음 문자를 가져와서 데이터 소스에 액세스하지 않고 반환합니다. 버퍼의 모든 문자가 사용된 경우에만 다른 큰 문자 배열에서 읽습니다.

이 클래스 에는 소스 스트림에서 전체 데이터 문자열을 한 번에 읽을 수 있는 BufferedReader매우 유용한 메서드도 있습니다 . String readLine()이 방법을 사용하여 파일을 읽고 그 내용을 한 줄씩 화면에 표시할 수 있습니다. 예:

이것이 얼마나 편리한지 설명하기 위해 특별히 간단한 코드를 작성했습니다. 이 코드는 조금 더 자세하게 작성할 수도 있습니다.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
개체를 만듭니다 FileReader. 데이터 원본은 파일입니다.
개체를 만듭니다 BufferedReader. 데이터 소스는 FileReader.
판독기에 아직 데이터가 있는 한
한 라인을 읽습니다.
라인을 표시합니다.
중요한 점:

여러 스트림을 함께 연결하는 경우 close()메서드는 그중 하나에서만 호출하면 됩니다. close()해당 스트림은 최종 데이터 스트림 에서 호출될 때까지 데이터 소스 등에서 메서드를 호출합니다 .



3. 콘솔에서 읽기

그리고 한 가지 더 흥미로운 사실은 Scanner클래스가 데이터 스트림이기도 한 에서 데이터를 읽는 중간 입력 스트림에 지나지 않는다는 점입니다 System.in.

다음은 콘솔에서 줄을 읽는 두 가지 방법입니다.

스캐너 클래스 BufferedReader 및 BufferedWriter 클래스
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

우리 친구는 클래스 의 정적 변수에 지나지 않습니다 . 이름이 입니다 .System.ininSystemInputStreamin

따라서 거의 CodeGym에 대한 Java 연구 초기부터 데이터 스트림으로 작업하고 그로부터 체인을 구축했습니다. 그러나 이제 당신은 더 의식적으로 그것을 할 것입니다.