JavaRush /Java Blog /Random-KO /BufferedReader 및 InputStreamReader 클래스 작업 연습

BufferedReader 및 InputStreamReader 클래스 작업 연습

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘 강의는 두 부분으로 나누어 진행됩니다. 이전에 이미 다루었던 몇 가지 이전 주제를 반복하고 몇 가지 새로운 기능을 살펴보겠습니다. :) BufferedReader 및 InputStreamReader 클래스 작업 연습 - 1첫 번째 항목부터 시작하겠습니다. 반복은 배움의 어머니입니다 :) 와 같은 수업을 이미 사용해 보셨을 겁니다 BufferedReader. 이 명령을 아직 잊지 않으셨기를 바랍니다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in, InputStreamReader, BufferedReader더 읽기 전에 각 구성 요소( )가 담당하는 것과 필요한 것이 무엇인지 기억해 보세요 . 일어난? 그렇지 않다면 걱정하지 마세요 :) 이 시점에서 잊어버린 것이 있다면 독자를 위한 이 강의를 다시 읽어보세요. 그들 각각이 무엇을 할 수 있는지 간단히 기억해 봅시다. System.in키보드로부터 데이터를 수신하기 위한 스레드입니다. 원칙적으로 텍스트를 읽는 논리를 구현하려면 하나면 충분합니다. 그러나 기억하는 것처럼 System.in문자는 읽을 수 없고 바이트만 읽을 수 있습니다.
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
이 코드를 실행하고 콘솔에 문자 "Y"를 입력하면 다음과 같이 출력됩니다.

Й
208
153
10
키릴 문자는 메모리에서 2바이트를 차지하며 이는 화면에 표시됩니다(그리고 숫자 10은 줄바꿈의 바이트 표현입니다(예: Enter 누르기).) 바이트를 읽는 것은 매우 즐겁기 때문에 System.in순수한 형태로 사용하는 것은 불편할 것입니다. 모든 사람이 이해할 수 있는 키릴 문자(뿐만 아니라)를 읽기 위해 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);
       }
   }
}
콘솔에 동일한 문자 "Y"를 입력하면 이번에는 결과가 달라집니다.

Й
1049
10
InputStreamReader두 개의 읽은 바이트(208, 153)를 단일 숫자 1049로 변환했습니다. 이는 문자 단위로 읽는 것입니다. 1049는 문자 "Y"에 해당하며 쉽게 확인할 수 있습니다.
public class Main {

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

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

Й
BufferedReader음, 'a (및 일반적으로 BufferedAnything) 의 경우 버퍼링된 클래스가 성능을 최적화하는 데 사용됩니다. 데이터 소스(파일, 콘솔, 인터넷 리소스)에 액세스하는 것은 성능 측면에서 다소 비용이 많이 드는 작업입니다. 따라서 이러한 호출 수를 줄이기 위해 BufferedReader나중에 수신할 수 있는 특수 버퍼에 데이터를 읽고 축적합니다. 결과적으로 데이터 소스에 대한 호출 횟수가 몇 배, 심지어는 수십 배까지 줄어듭니다! BufferedReader'a와 일반에 비해 장점 ' 의 또 다른 추가 기능은 데이터를 개별 숫자가 아닌 전체 문자열로 읽는 InputStreamReader매우 유용한 방법입니다 . 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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
BufferedReader 및 InputStreamReader 클래스 작업 연습 - 2물론 BufferedReader이것은 매우 유연한 메커니즘이며 키보드로만 작업할 수 있는 것은 아닙니다. 예를 들어 필요한 URL을 리더에 전달하기만 하면 인터넷에서 직접 데이터를 읽을 수 있습니다.
public class URLReader {
   public static void main(String[] args) throws Exception {

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
경로를 전달하여 파일에서 데이터를 읽을 수 있습니다.
public class Main {
   public static void main(String[] args) throws Exception {

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

System.out 대체

이제 이전에 다루지 않았던 흥미로운 가능성 하나를 살펴보겠습니다. 아마 기억하시겠지만, System클래스에는 두 개의 정적 필드( System.in및 ) 가 있습니다 System.out. 이 쌍둥이 형제는 스레드 클래스 개체입니다. System.in- 추상 수업 InputStream. A System.outPrintStream. 이제 구체적으로 이야기하겠습니다 System.out. 클래스의 소스 코드로 들어가면 System다음과 같은 내용을 볼 수 있습니다.
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
따라서 System.out일반 정적 클래스 변수입니다System . 거기에는 마법이 없습니다 :) 변수는 out클래스에 속합니다 PrintStream. 흥미로운 질문이 있습니다. 코드를 실행할 때 System.out.println()출력이 다른 곳이 아닌 콘솔에 나타나는 이유는 무엇입니까? 그리고 이것을 어떻게든 바꿀 수 있나요? 예를 들어 콘솔에서 데이터를 읽고 텍스트 파일에 쓰려고 합니다. 추가 판독기 및 작성기 클래스를 사용하지 않고 간단히 System.out? 여전히 가능합니다 :) 변수가 System.out수식어로 지정 되더라도 final여전히 그렇게 할 수 있습니다! BufferedReader 및 InputStreamReader 클래스 작업 연습 - 3그러면 우리에게 무엇이 필요합니까? 첫째PrintStream , 현재 클래스 객체 대신 새로운 클래스 객체가 필요합니다 . 기본적으로 클래스에 설치된 현재 객체는 System우리에게 적합하지 않습니다. 이는 콘솔을 가리킵니다. 데이터의 "대상"으로 텍스트 파일을 가리키는 새 파일을 만들어야 합니다. 둘째 , 변수에 새 값을 할당하는 방법을 이해해야 합니다 System.out. 로 표시되어 있기 때문에 그렇게 할 수는 없습니다 final. 끝부터 시작합시다. 클래스에는 System우리에게 필요한 메소드가 정확히 포함되어 있습니다 setOut(). 객체를 입력으로 받아 PrintStream출력 지점으로 설정합니다. 우리에게 딱 필요한 것! 남은 것은 객체를 생성하는 것뿐입니다 PrintStream. 이 작업도 쉽습니다.
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
전체 코드는 다음과 같습니다.
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
결과적으로 첫 번째 줄은 텍스트 파일에 기록되고 두 번째 줄은 콘솔에 출력됩니다. :) 이 코드를 IDE에 복사하여 실행할 수 있습니다. 텍스트 파일을 열면, 필요한 라인이 성공적으로 작성되었음을 확인할 수 있습니다 :) 이것으로 강의를 마칩니다. 오늘 우리는 스트림과 리더로 작업하는 방법을 기억하고, 서로 어떻게 다른지 기억하고, System.out거의 모든 수업에서 사용했던 새로운 기능에 대해 배웠습니다. :) 다음 강의에서 만나요!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION