JavaRush /Java Blog /Random-KO /키보드에서 읽기 - "독자"

키보드에서 읽기 - "독자"

Random-KO 그룹에 게시되었습니다
안녕하세요! 강의와 작업에서 우리는 데이터를 콘솔에 출력하는 방법과 그 반대로 키보드에서 데이터를 읽는 방법을 배웠습니다. 키보드에서 읽기 - "독자" - 1이를 위해 복잡한 구성을 사용하는 방법도 배웠습니다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
하지만 우리는 아직 한 가지 질문에 답하지 않았습니다.

이것은 어떻게 작동합니까?

실제로 어떤 프로그램도 그 자체로 존재하지 않는 경우가 많습니다. 다른 프로그램, 시스템, 인터넷 등과 통신할 수 있습니다. "의사소통"이라는 단어는 우선 "데이터 교환"을 의미합니다. 즉, 외부에서 일부 데이터를 수신하고 반대로 자신의 데이터를 어딘가로 보냅니다. 일상생활에서도 프로그램 간 데이터 교환의 예는 많습니다. 따라서 많은 사이트에서는 등록하는 대신 Facebook이나 Twitter 계정을 사용하여 로그인할 수 있습니다. 이 상황에서는 Twitter와 등록하려는 사이트 등 두 프로그램이 서로 필요한 데이터를 교환한 후 최종 결과인 성공적인 인증을 볼 수 있습니다. " 흐름 "이라는 용어는 프로그래밍에서 데이터 교환 프로세스를 설명하는 데 자주 사용됩니다 . 이 이름은 어디서 유래한 걸까요? "흐름"은 프로그래밍보다는 강이나 하천과 더 관련이 있습니다. 사실, 이것은 이유가 없는 것은 아닙니다 :) 스트림은 본질적으로 움직이는 데이터 조각입니다. 즉, 프로그래밍에서 스트림을 따라 "흐르는" 것은 물이 아니라 바이트 및 문자 형태의 데이터입니다. 데이터 스트림에서 데이터를 부분적으로 수신하고 이를 사용하여 작업을 수행할 수 있습니다. 다시 한 번, "물이 흐르는 것"에 비유해 봅시다. 강에서 물을 떠서 수프를 요리하거나, 불을 끄거나, 물꽃을 피울 수 있습니다. 스트림을 사용하면 인터넷, 컴퓨터의 파일 시스템 등 모든 데이터 소스로 작업할 수 있습니다. 이는 중요하지 않습니다. 스트림은 범용 도구입니다. 이를 통해 프로그램은 어디에서나(들어오는 스트림) 데이터를 수신하고 어디에서나(나가는 스트림) 보낼 수 있습니다. 그들의 임무는 하나입니다. 한 곳에서 데이터를 가져와 다른 곳으로 보내는 것입니다. 스트림은 두 가지 유형으로 나뉩니다.
  1. 들어오는 스트림( 입력 ) - 데이터를 수신하는 데 사용됩니다.
  2. 나가는 스트림( 출력 ) - 데이터 전송용.
Java의 들어오는 데이터 흐름은 클래스에서 구현되고 InputStream나가는 데이터 흐름은 클래스에서 구현 됩니다 OutputStream. 그러나 스레드를 나누는 또 다른 방법이 있습니다. 들어오는 것과 나가는 것뿐만 아니라 바이트문자 로도 구분됩니다 . 여기서는 설명 없이도 의미가 명확합니다. 바이트 스트림은 바이트 집합 형태로 정보를 전송하고, 문자 스트림은 문자 집합 형태로 정보를 전송합니다. 이번 강의에서는 들어오는 스트림에 대해 자세히 살펴보겠습니다. 그리고 마지막에 나가는 링크에 대한 정보를 첨부할 것이며 이에 대해 직접 읽을 수 있습니다. :) 따라서 우리의 코드는 다음과 같습니다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
강의를 읽으면서 꽤 무섭다고 생각하셨나요? :) 하지만 이는 이것이 어떻게 작동하는지 알아내기 전까지만 가능합니다. 지금 고치자! 끝부터 시작합시다. 는 우리가 처음에 이야기했던 System.in수업의 객체입니다 . InputStream이는 수신 스트림이며 시스템 입력 장치인 키보드에 연결되어 있습니다. 그건 그렇고, 당신은 그와 간접적으로 친숙합니다. 결국, 당신은 당신의 작업에서 그의 "동료"를 자주 사용합니다- System.out! - 이것은 시스템 데이터 출력System.out 스트림이며 , 지속적으로 사용하는 바로 그 방법으로 콘솔에 출력하는 데 사용됩니다. :) - 콘솔에 데이터를 전송하기 위한 스트림 및 - 키보드에서 데이터를 수신하기 위한 스트림입니다. 간단합니다 :) 또한, 키보드에서 데이터를 읽으려면 이렇게 큰 구성 없이 간단히 다음과 같이 작성할 수 있습니다 . System.out.println()System.outSystem.inSystem.in.read()
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
클래스 InputStream(그리고 는 System.in클래스의 객체입니다 ) 에는 데이터를 읽을 수 있는 InputStream메서드가 있습니다 . 한 가지 문제: 문자 가 아닌 바이트를read() 읽습니다 . 키보드에서 러시아어 문자 "Ya"를 읽어 봅시다. 콘솔 출력:
Я
208
175
10
러시아어 문자는 컴퓨터 메모리에서 2바이트를 차지합니다(1바이트만 차지하는 영어 문자와는 달리). 이 경우 스트림에서 3바이트를 읽었습니다. 처음 두 바이트는 문자 "I"를 나타내고 다른 바이트는 줄바꿈(Enter)을 나타냅니다. 따라서 "알몸"을 사용하는 옵션은 System.in우리에게 적합하지 않습니다. 인간은 (드문 예외를 제외하고!) 바이트를 읽을 수 없습니다. 이것은 다음 수업이 우리를 돕기 위해 오는 곳입니다 - InputStreamReader! 이것이 어떤 종류의 동물인지 알아 봅시다.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
우리는 스트림 System.inInputStreamReader. 일반적으로 이름을 러시아어로 번역하면 "들어오는 스트림의 리더"라는 모든 것이 분명해 보입니다. 사실 그게 바로 그 목적이에요! 클래스 객체를 생성 InputStreamReader하고 데이터를 읽어야 하는 수신 스트림을 전달합니다. 이 경우에는 ...
new InputStreamReader(System.in)
...우리는 "시스템 입력 스트림(키보드)에서 데이터를 읽을 것입니다."라고 말합니다. 하지만 이것이 유일한 기능은 아닙니다! InputStreamReader스트림으로부터 데이터를 수신할 뿐만 아니라 또한 바이트 스트림을 문자 스트림으로 변환합니다 . 즉, 읽은 데이터를 "컴퓨터" 언어에서 "인간" 언어로 번역하는 것에 대해 더 이상 걱정할 필요가 없습니다. InputStreamReader모든 작업이 자동으로 처리됩니다. InputStreamReader물론 콘솔뿐만 아니라 다른 곳에서도 데이터를 읽을 수 있습니다. 예를 들어, 파일에서:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
FileInputStream여기서는 들어오는 데이터 스트림 (이것은 다양한 유형 중 하나 ) 을 생성하고 InputStream파일 경로를 여기에 전달한 다음 스트림 자체를 InputStreamReader'y. 물론 이 경로에 파일이 존재하면 이제 이 파일에서 데이터를 읽을 수 있습니다. 데이터를 읽기 위해(콘솔, 파일 또는 다른 어느 곳에서든) 클래스 InputStreamReaderread(). System.in.read()이들그리고 의 차이점은 무엇인가요 InputStreamReader.read()? 를 사용하여 같은 문자 "I"의 수를 세어 봅시다 InputStreamReader. 제가 생각한 것은 다음과 같습니다 System.in.read().
Я
208
175
10
그는 어떻게 같은 일을 할 수 있습니까 InputStreamReader?
public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
콘솔 출력:
Я
1071
10
차이점은 즉시 눈에 보입니다. 줄 바꿈을 위한 마지막 바이트는 변경되지 않고(숫자 10) 유지되었지만 읽은 문자 "I"는 단일 코드 "1071"로 변환되었습니다. 이것은 기호로 읽는 것입니다! 갑자기 코드 1071이 문자 "I"를 의미한다고 믿지 않는다면 이를 쉽게 확인할 수 있습니다 :)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 1071;
       System.out.println(x);
   }
}
콘솔 출력:

Я
하지만 InputStreamReader그렇게 좋으면 왜 더 필요합니까 BufferedReader? InputStreamReader데이터를 읽고 바이트를 문자로 변환할 수 있습니다. 또 무엇이 필요합니까? 왜 또 다른 독자인가? :/ 대답은 매우 간단합니다. 생산성편의성을 높이기 위한 것입니다 . 성능부터 시작해 보겠습니다. 데이터를 읽을 때 BufferedReader는 특수 영역, 즉 버퍼를 사용하여 읽은 문자를 "추가"합니다. 결과적으로 프로그램에서 이러한 문자가 필요할 때 데이터 소스(키보드, 파일 등)에서 직접 가져오는 것이 아니라 버퍼에서 가져오므로 많은 리소스가 절약됩니다. 이것이 어떻게 작동하는지 이해하려면 예를 들어 대기업의 택배 직원의 작업을 상상해보십시오. 택배기사는 사무실에 앉아 배송을 위해 소포가 도착할 때까지 기다립니다. 그는 새 소포를 받을 때마다 즉시 길을 떠날 수 있습니다. 하지만 낮에는 소포가 많을 수 있으며 매번 사무실과 주소 사이를 이동해야 합니다. 대신 택배기사는 모든 사람이 소포를 넣을 수 있도록 사무실에 상자를 배치했습니다. 이제 택배기사는 침착하게 상자를 들고 주소로 이동할 수 있습니다. 매번 사무실로 돌아올 필요가 없기 때문에 많은 시간을 절약할 수 있습니다. 이 예에서 상자는 바로 버퍼이고 사무실은 데이터 소스입니다. 택배기사가 편지를 배달할 때 매번 사무실에 가는 것보다 일반 상자에서 편지를 꺼내는 것이 훨씬 쉽습니다. 가스도 절약됩니다. 프로그램에서도 마찬가지입니다. 매번 데이터 소스에 액세스하는 것보다 버퍼에서 데이터를 가져오는 것이 리소스 집약적이지 않습니다. BufferedReader이것이 +가 InputStreamReader단지 .보다 빠르게 작동하는 이유입니다 InputStreamReader. 성능은 정리했지만 편의성은 어떨까? 가장 큰 장점은 BufferedReader한 번에 한 문자씩( read()이러한 목적을 위한 방법도 있지만) 데이터를 읽을 수 있을 뿐만 아니라 전체 줄도 읽을 수 있다는 것입니다! 이는 readLine();
public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("We read this line from the keyboard:");
       System.out.println(s);
   }
}
콘솔 출력:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
이는 특히 많은 양의 데이터를 읽을 때 유용합니다. 한두 줄의 텍스트를 한 글자씩 읽을 수 있습니다. 그러나 "전쟁과 평화"를 한 번에 한 글자씩 세는 것은 다소 문제가 될 것입니다. :) 이제 스레드 작업이 훨씬 더 명확해졌습니다. 추가 연구를 위한 추가 소스는 다음과 같습니다. 여기에서 들어오고 나가는 흐름에 대해 자세히 알아볼 수 있습니다. BufferedReader우리 학생 중 한 명의 비디오 리뷰입니다 . 네, 네, 우리 학생들은 스스로 학습할 뿐만 아니라 다른 사람들을 위한 교육 비디오도 녹화합니다! 우리 채널을 좋아요하고 구독하는 것을 잊지 마세요 :)
연구 초기부터 공식 문서를 읽는 데 익숙해지는 것이 좋습니다. 이는 언어에 대한 지식의 주요 원천이며 대부분의 답변은 항상 그곳에서 찾을 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION