방금 BufferedReader
.
나는 정확히 용어의 의미는 무엇인지 알고 싶어 Stream
하고 Buffer
?
또한이 코드 줄은 우리에게 무엇을 제공합니까?
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
답변
Java에는 입력 및 출력 (I / O)을위한 두 가지 종류의 클래스, 즉 스트림 및 리더 / 라이터가 있습니다.
스트림 ( InputStream
, OutputStream
이러한 확장 다) 읽기, 파일, 네트워크, 또는 어떤 다른 장치에서 바이너리 데이터를 쓰기위한 것입니다.
독자와 작가는 텍스트 (문자)를 읽고 쓰기위한 것입니다. 이진 데이터 (바이트)를 문자 인코딩을 사용하여 문자 로 변환하고 역으로 변환하는 스트림 상단의 레이어입니다 .
디스크에서 바이트 단위로 데이터를 읽는 것은 매우 비효율적입니다. 속도를 높이는 한 가지 방법은 버퍼를 사용하는 것입니다. 한 번에 한 바이트를 읽는 대신 한 번에 수천 바이트를 읽고 메모리의 버퍼에 넣습니다. 그런 다음 버퍼의 바이트를 하나씩 살펴볼 수 있습니다.
I / O에 대한 Oracle의 Java 자습서 에서 자세히 설명합니다.
제공 한 코드 줄을 살펴 봅니다.
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.in
입니다 InputStream
. InputStreamReader
에서 바이트를 읽는을 만듭니다 System.in
. 그런 다음 그것을 BufferedReader
.
그래서, 결국, 당신은이 BufferedReader
에서 읽는 InputStreamReader
에서 읽는 것을 System.in
.
답변
완충기:
데이터가 한 위치에서 다른 위치로 이동하는 동안 일시적으로 데이터를 저장 하는 데 사용되는 물리적 메모리 저장소 의 영역 입니다 . 그 물리적 메모리 저장소 는 RAM 이 될 것입니다. 대부분의 경우 (랜덤 액세스 메모리).
하지만이 질문의 맥락에서 Buffer 는 데이터를 읽고 쓰는 동안 사용됩니다. 데이터를 한 곳에서 다른 곳으로 이동하는 동안에는 사용할 필요가 없습니다.
버퍼의 예 : 시스템에 4GB의 RAM이있는 경우 시스템에서 4KB의 메모리 (RAM)를 버퍼 에 할당 할 수 있습니다 . KB-킬로바이트, GB-기가 바이트
I / O 스트림 (또는) 스트림 :
I / O 스트림 은 입력 소스 또는 출력 대상을 나타냅니다. 스트림은 디스크 파일, 장치, 기타 프로그램 및 메모리 배열을 포함하여 다양한 종류의 소스와 대상을 나타낼 수 있습니다.
I / O는 입력 / 출력을 의미합니다.
따라서 입력 스트림은 디스크 파일, 네트워크 연결 등과 같은 입력 소스가 될 수 있습니다.
그리고 출력 스트림은 디스크 파일, 네트워크 연결 등과 같은 출력 대상이 될 수 있습니다.
JAVA 공식 문서 에 따르면 Streams는 3 가지 유형입니다.
바이트 스트림 :
8 비트 바이트의 입력 및 출력을 수행합니다. 모든 바이트 스트림 클래스는 InputStream 및 OutputStream의 자손입니다 .
바이트 입력 스트림 클래스는 입력을 원시 바이트 로 가져 옵니다 . 바이트 출력 스트림 클래스는 출력을 원시 바이트 로 제공 합니다 .
InputStream
– 직접 알려진 하위 클래스
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.
OutputStream
– 직접 알려진 하위 클래스
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
캐릭터 스트림 :
바이트 스트림 위에있는 레이어입니다. 문자 인코딩을 사용하여 바이트 (이진 데이터)를 문자로, 문자를 바이트로 변환합니다.
Reader
-직접 알려진 하위 클래스
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer
-직접 알려진 하위 클래스
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
바이트 스트림 및 문자 스트림 은 버퍼링되지 않은 I / O를 사용합니다. 합니다.
이는 각 읽기 또는 쓰기 요청이 기본 OS에서 직접 처리됨을 의미합니다. 이러한 각 요청은 종종 디스크 액세스, 네트워크 활동 또는 상대적으로 비용이 많이 드는 다른 작업을 트리거하기 때문에 프로그램의 효율성이 훨씬 떨어질 수 있습니다. 이러한 종류의 오버 헤드를 줄이기 위해 Java 플랫폼은 버퍼링 된 I / O 스트림을 구현합니다.
버퍼링 된 스트림 :
버퍼 된 입력 스트림 은 버퍼 로 알려진 메모리 영역 에서 데이터를 읽습니다. . 기본 입력 API는 버퍼가 비어있을 때만 호출됩니다.
마찬가지로 버퍼링 된 출력 스트림은 데이터를 buffer에 쓰고 기본 출력 API는 버퍼가 가득 찬 경우에만 호출됩니다.
프로그램은 래핑 관용구를 사용하여 버퍼링 되지 않은 스트림을 버퍼링 된 스트림으로 변환 할 수 있습니다 . 여기서 버퍼링되지 않은 스트림 객체는 버퍼링 된 스트림 클래스 의 생성자에 전달됩니다 .
예:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
버퍼링되지 않은 스트림을 래핑하는 데 사용되는 4 개의 버퍼링 된 스트림 클래스가 있습니다.
만들려면 버퍼 바이트 스트림 사용 BufferedInputStream
및 BufferedOutputStream
클래스.
만들려면 버퍼 스트림은 문자 사용 BufferedReader
과 BufferedWriter
클래스를.
답변
java.io 패키지 작업을 시작하는 모든 사람의 마음에있는 질문입니다. 귀하의 질문에 답하기 위해 InputStreamReader 및 BufferedReader는 자바 객체만을 나타내지 만 (특별한 것은 없음) 파일, 객체 등과 같은 다른 입력 / 출력에서 읽고 쓰는 것과 같은 io 작업을 위해 생성됩니다.
이제 줄을 서자
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
InputStreamReader는 바이트의 입력 스트림을 읽는 클래스이지만 각 바이트를 읽는 것은 비용이 많이 드는 작업이므로 버퍼링되도록 BufferedReader를 감싸고 있습니다 (데코레이터 패턴입니다).
따라서 읽기를 시작하기 전이라도 bufferedReader는 레지스터에 일부 바이트 청크를 저장하고 읽기 작업을 수행 할 때 발생합니다. 콘솔 / 파일에서 읽는 것보다 훨씬 저렴한 그 위치에서 읽습니다. 그러나 InputStreamReader의 경우 디스크 액세스 작업이 발생할 때마다 읽기 작업을 수행 할 때
답변
스트림은 지점간에 전달되는 연결 및 실제 정보입니다. 버퍼는 스트리밍 된 데이터의 일부 또는 전체를 저장하고이를 출력 장치에 공급하는 저장 컨테이너입니다.
물론 요점은 스트림이 데이터를 표시하는 데 필요한 데이터 속도 이상으로 느려지면 출력이 일시 중지된다는 것입니다. 버퍼는 이것을 방지합니다.
답변
버퍼는 주변 장치의 데이터 스트림을 저장하는 데 사용되는 메모리의 일부입니다. 그런 다음이 버퍼에서이 데이터 스트림을 수집하여 변수에 저장합니다. 스트림은 연속적인 데이터 흐름으로 정의 할 수 있습니다.
“입력 / 출력”이라는 용어는 데이터를 버퍼 안팎으로 이동하는 것 이상을 의미하지 않습니다. 항상 마음에 두십시오. 프로세스는 운영 체제에 데이터를 버퍼에서 드레인 (쓰기 작업)하거나 버퍼에 데이터를 채우도록 (읽기 작업) 요청하여 I / O를 수행합니다.
데이터 이동 방식에 대한 논리적 다이어그램
간단히 말해서 키보드로 데이터를 입력 할 때 데이터가 파이프 ( 스트림 )를 통해 버퍼로 이동 한 다음 버퍼에서 디스크 (쓰기 작업)로 이동한다고 상상해보십시오 . 마찬가지로 데이터가 디스크에서 버퍼로 , 버퍼에서 콘솔로 이동할 때 읽기 작업입니다.
더 나은 이해를 위해 링크를 읽을 수 있습니다. 도움이 되었기를 바랍니다!.
자바의 버퍼 란?
여기에 링크 설명을 입력하십시오.