CodeGym/Java Blog/무작위의/키보드에서 읽기: "독자"
John Squirrels
레벨 41
San Francisco

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

무작위의 그룹에 게시되었습니다
회원
안녕! 레벨 3의 학습 및 작업에서는 콘솔에 항목을 표시하는 방법과 다른 방향으로 이동하여 키보드에서 데이터를 읽는 방법을 가르쳤습니다.
키보드에서 읽기: "독자" - 1
이를 위해 다음과 같은 복잡한 구조를 사용하는 방법도 배웠습니다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
하지만 아직 대답하지 않은 질문이 하나 있습니다.

이게 어떻게 작동합니까?

실제로 프로그램은 완전히 독립적인 경우가 드뭅니다. 그들은 다른 프로그램, 시스템, 인터넷 등과 통신합니다. "통신"이란 주로 "데이터 교환"을 의미합니다. 즉, 일부 외부 데이터를 수신하고 내부 프로그램 데이터도 어딘가로 보냅니다. 데이터를 교환하는 프로그램의 예는 일상 생활에 많이 있습니다. 예를 들어 많은 웹사이트에서는 등록 대신 Facebook 또는 Twitter 계정을 사용하여 로그인할 수 있습니다. 이 상황에서 두 프로그램(예: Twitter와 로그인하려는 웹 사이트)이 필요한 데이터를 교환합니다. 최종 결과는 성공적으로 로그인되었다는 것입니다. "스트림" 이라는 단어데이터 교환 프로세스를 설명하는 데 사용됩니다. 이 이름은 어디에서 왔습니까? 귀하의 경험에 따르면 "스트림"은 프로그래밍보다는 강과 더 관련이 있을 수 있습니다. 우연이 아닙니다 :) 본질적으로 스트림은 움직이는 데이터 조각입니다. 즉, 프로그래밍에서 흐르는 것은 물이 아니라 바이트와 문자 형태의 데이터입니다. 데이터 스트림에서 데이터 비트를 수신한 다음 사용할 수 있습니다. 다시 물/흐름 비유를 사용합니다. 강에서 물을 떠서 수프를 만들거나 불을 끄거나 꽃에 물을 줄 수 있습니다. 스트림을 사용하면 인터넷이든, 컴퓨터의 파일 시스템이든, 다른 어떤 것이든 상관없이 모든 데이터 소스로 작업할 수 있습니다. 스트림은 범용 도구입니다. 이를 통해 프로그램은 어디에서나 데이터를 수신하고(입력 스트림) 어디로든 보낼 수 있습니다(출력 스트림). 그들의 임무는 동일합니다. 한 곳에서 데이터를 가져와 다른 곳으로 보내는 것입니다. 두 가지 유형의 스트림이 있습니다.
  1. 입력 스트림은 데이터를 수신하는 데 사용됩니다.
  2. 출력 스트림은 데이터를 전송하기 위한 것입니다.
Java에서 이러한 스트림은 InputStreamOutputStream클래스에 의해 구현됩니다. 그러나 스트림은 다른 방식으로 분류될 수 있습니다. 입력 및 출력 스트림 외에도 바이트 스트림문자 스트림 에 대해서도 이야기합니다 . 여기서 의미는 충분히 명확해야 합니다. 바이트 스트림은 정보를 바이트 집합으로 전송하고 문자 스트림은 정보를 문자 집합으로 전송합니다. 이 레슨에서는 입력 스트림에 대해 설명합니다. 강의 마지막에 출력 스트림에 대한 정보가 포함된 링크를 추가하겠습니다. 직접 읽을 수 있습니다 :) 이제 다음 코드를 살펴보세요.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
수업을 들으면서 이 대사가 상당히 위협적이라고 생각하지 않았나요? :) 작동 방식을 살펴본 후에는 그렇지 않습니다. 일을 바로 잡자. 끝에서 시작하겠습니다. 앞에서 이야기한 클래스의 인스턴스인 개체 System.in입니다 . InputStream시스템 입력 장치(키보드)에 연결된 입력 스트림입니다. 그건 그렇고, 당신은 이 흐름에 대해 간접적으로 익숙합니다. 결국 "coworker"를 자주 사용합니다 — System.out! System.out시스템 출력 스트림입니다. System.out.println()지속적으로 사용하는 좋아하는 방법을 통해 콘솔에 데이터를 출력하는 데 사용됩니다 :) System.out콘솔에 데이터를 전송하기 위한 스트림입니다.System.in키보드에서 데이터를 가져오기 위한 것입니다. 모두 간단합니다 :) 게다가 이 거대한 구조 없이도 키보드에서 데이터를 읽을 수 있습니다. 간단히 다음과 같이 작성할 수 있습니다. System.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()데이터를 읽을 수 있는 메서드가 있습니다. 한 가지 문제가 있습니다. 문자 가 아닌 바이트를 읽습니다 . 영문 만 사용하는 것은 지루하니 자판 에서 한자 "魚"를 읽어보자 . 그런데 이 문자는 '물고기'를 의미합니다. 콘솔 출력: 233 173 154 10 이 기호와 다른 많은 중국어는 컴퓨터 메모리에서 3바이트를 차지합니다(단지 1바이트를 차지하는 라틴 문자와 달리). 이 경우 스트림에서 4바이트를 읽습니다. 처음 3바이트는 "魚" 문자를 나타내고 다른 바이트는 새 줄(Enter)을 나타냅니다. 따라서 System.in꾸밈없는 형태는 우리에게 선택 사항이 아닙니다. 인간은(드문 경우를 제외하고!) 바이트를 읽는 방법을 모릅니다. 그러나 InputStreamReader수업이 구출됩니다! 어떤 종류의 동물인지 봅시다.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
InputStreamReaderSystem.in 개체 에 전달합니다 . 클래스 이름이 그것을 말합니다! 객체를 생성 하고 데이터를 읽을 입력 스트림을 전달합니다. 이 경우... InputStreamReader
new InputStreamReader(System.in)
... "시스템 입력 스트림에서 (키보드에서) 데이터를 읽을 것입니다"라고 말합니다. 그러나 이것이 유일한 기능은 아닙니다! InputStreamReader스트림에서 데이터만 수신하는 것은 아닙니다 . 또한 바이트 스트림을 문자 스트림으로 변환합니다 . 즉, 더 이상 데이터를 "1과 0"에서 "사람이 읽을 수 있는 언어"로 변환할 필요가 없습니다. 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. 이제 파일에서 데이터를 읽을 수 있습니다(물론 파일이 경로에 실제로 존재하는 경우). 또한 InputStreamReader클래스의 read()메서드를 사용하여 데이터를 읽습니다(데이터 소스는 중요하지 않습니다: 콘솔, 파일 또는 다른 곳). System.in.read()와 ?\ 의 차이점은 무엇입니까 InputStreamReader.read()?\ 다시 "魚" 문자를 InputStreamReader. System.in.read() 233 173 154 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);
       }
   }
}
콘솔 출력: 39770 10 차이가 즉시 나타납니다. 마지막 바이트(새 줄을 나타냄)는 변경되지 않고(숫자 10) 남아 있지만 문자 "魚"는 단일 코드 "39770"으로 변환되었습니다. 이것이 문자를 읽는다는 의미입니다! 39770이 "魚"라는 글자를 나타낸다는 것이 믿기지 않는다면 쉽게 납득하실 수 있습니다 :)
import java.io.IOException;

public class Main {

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

       char x = 39770;
       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);
   }
}
콘솔 출력: CodeGym은 Java 학습을 위한 최고의 웹사이트입니다! 우리는 키보드에서 다음 줄을 읽었습니다. CodeGym은 Java 학습을 위한 최고의 웹사이트입니다! 이것은 많은 양의 데이터를 읽을 때 특히 유용합니다. 문자별로 한 줄 또는 두 줄의 텍스트를 읽는 것은 여전히 ​​가능합니다. 그러나 "전쟁과 평화"에서 한 번에 한 글자씩 읽는 것은 다소 문제가 될 것입니다 :)

더 읽어보기:

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다