Java I / O에서 "스트림"과 "버퍼"는 정확히 무엇을 의미합니까?


82

방금 BufferedReader.

나는 정확히 용어의 의미는 무엇인지 알고 싶어 Stream하고 Buffer?

또한이 코드 줄은 우리에게 무엇을 제공합니까?

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

답변:


201

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.


1
답변 해주셔서 감사하지만 혼란 스럽습니다. 한 번에 수천 바이트를 읽고 버퍼에 넣었다고 말했듯이 버퍼가 우리가 물건을 저장하는 메모리의 한 장소라는 의미입니까?
user122345656

3
@Jesper. "속도를 높이는 한 가지 방법은 버퍼를 사용하는 것입니다. 한 번에 한 바이트를 읽는 대신 한 번에 수천 바이트를 읽고 메모리의 버퍼에 넣습니다. 그런 다음 바이트를 볼 수 있습니다. 버퍼에 하나씩. " 예, 사실이지만 버퍼도 함께 생각합니다. 한 번에 단일 바이트를 읽습니다. 유일한 차이점은 버퍼와 프로그램에 넣고 디스크 대신 버퍼에서 읽습니다.
M Sach

7
@ user122345656 예, 버퍼는 데이터를 임시로 저장하기위한 메모리의 장소입니다.
Jesper

14
@MSach 하드 디스크에서 데이터를 읽으려고 할 때 어떤 일이 발생하는지 생각해보십시오. 특정 위치에서 바이트를 읽으려면 헤드가 읽을 바이트가있는 디스크의 위치 위에 올 때까지 디스크가 회전 할 때까지 기다려야합니다. 그 순간에 1 바이트 만 읽었고 다음 바이트는 나중에 읽었다면 디스크가 다음 바이트를 읽기 위해 완전히 회전 할 때까지 기다려야합니다. 연속 바이트 블록을 읽는 것이 훨씬 더 효율적입니다.
Jesper

2
@parsecer 스트림은 바이트 읽기 용입니다. 독자는 텍스트 (문자)를 읽기위한 것입니다. 에서 텍스트를 읽을 수 있도록 InputStreamReader하는 래퍼 입니다. 문자가 아닌 바이트 만 읽으려면 . 바이트를 텍스트 문자로 해석하려는 경우 유용합니다. InputStreamInputStreamInputStreamReader
Jesper

19

완충기:

데이터가 한 위치에서 다른 위치로 이동하는 동안 일시적으로 데이터를 저장 하는 데 사용되는 물리적 메모리 저장소영역 입니다 . 그 물리적 메모리 저장소RAM 이 될 것입니다. 대부분의 경우 (랜덤 액세스 메모리).

하지만이 질문의 맥락에서 Buffer 는 데이터를 읽고 쓰는 동안 사용됩니다. 데이터를 한 곳에서 다른 곳으로 이동하는 동안에는 사용할 필요가 없습니다.

버퍼의 예 : 시스템에 4GB의 RAM이있는 경우 시스템에서 4KB의 메모리 (RAM)를 버퍼 에 할당 할 수 있습니다 . KB-킬로바이트, GB-기가 바이트

I / O 스트림 (또는) 스트림 :

I / O 스트림 은 입력 소스 또는 출력 대상을 나타냅니다. 스트림은 디스크 파일, 장치, 기타 프로그램 및 메모리 배열을 포함하여 다양한 종류의 소스와 대상을 나타낼 수 있습니다.

I / O는 입력 / 출력을 의미합니다.

따라서 입력 스트림은 디스크 파일, 네트워크 연결 등과 같은 입력 소스가 될 수 있습니다.

그리고 출력 스트림은 디스크 파일, 네트워크 연결 등과 같은 출력 대상이 될 수 있습니다.

JAVA 공식 문서 에 따르면 Streams는 3 가지 유형입니다.

  1. 바이트 스트림 ( 바이트 읽기 또는 쓰기)
  2. 문자 스트림 ( 문자 읽기 또는 쓰기)
  3. 버퍼링 된 스트림 ( 효율성을 위해 버퍼 에서 읽기 또는 쓰기 )

바이트 스트림 :

8 비트 바이트의 입력 및 출력을 수행합니다. 모든 바이트 스트림 클래스는 InputStreamOutputStream의 자손입니다 .

바이트 입력 스트림 클래스는 입력을 원시 바이트 로 가져 옵니다 . 바이트 출력 스트림 클래스는 출력을 원시 바이트 로 제공 합니다 .

InputStream- 직접 알려진 하위 클래스

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream- 직접 알려진 하위 클래스

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

캐릭터 스트림 : 바이트 스트림 위에있는 레이어입니다. 문자 인코딩을 사용하여 바이트 (이진 데이터)를 문자로, 문자를 바이트로 변환합니다.

모든 문자 스트림 클래스는 ReaderWriter의 자손입니다 .

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 개의 버퍼링 된 스트림 클래스가 있습니다.

만들려면 버퍼 바이트 스트림 사용 BufferedInputStreamBufferedOutputStream클래스.

만들려면 버퍼 스트림은 문자 사용 BufferedReaderBufferedWriter클래스를.


1
Java io에 대한 자세한 설명을 찾고있었습니다. 대단히 감사합니다.
Arif Reza 2018

14

java.io 패키지 작업을 시작하는 모든 사람의 마음에있는 질문입니다. 귀하의 질문에 답하기 위해 InputStreamReader 및 BufferedReader는 자바 객체만을 나타내지 만 (특별한 것은 없음) 파일, 객체 등과 같은 다른 입력 / 출력에서 ​​읽고 쓰는 것과 같은 io 작업을 위해 생성됩니다.

이제 줄을 서자

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

InputStreamReader는 바이트의 입력 스트림을 읽는 클래스이지만 각 바이트를 읽는 것은 비용이 많이 드는 작업이므로 버퍼링되도록 BufferedReader를 감싸고 있습니다 (데코레이터 패턴입니다).

따라서 읽기를 시작하기 전이라도 bufferedReader는 레지스터에 일부 바이트 청크를 저장하고 읽기 작업을 수행 할 때 발생합니다. 콘솔 / 파일에서 읽는 것보다 훨씬 저렴한 그 위치에서 읽습니다. 그러나 InputStreamReader의 경우 디스크 액세스 작업이 발생할 때마다 읽기 작업을 수행 할 때


+1하지만 정보 데코레이터에 대한 링크 참조를 추가하고 디스크 액세스 작업이 발생할 때마다 센 턴스가 발생하면 선호합니다
shareef

마지막 단락은 이점을 잘 요약합니다. 감사합니다.
Dave Voyles

3

스트림은 지점간에 전달되는 연결 및 실제 정보입니다. 버퍼는 스트리밍 된 데이터의 일부 또는 전체를 저장하고이를 출력 장치에 공급하는 저장 컨테이너입니다.

물론 요점은 스트림이 데이터를 표시하는 데 필요한 데이터 속도 이상으로 느려지면 출력이 일시 중지된다는 것입니다. 버퍼는 이것을 방지합니다.


ans에 감사드립니다.하지만 내 마음에 떠오른 질문은 스트리밍 데이터가 무엇을 의미합니까? Plz는 이것을 자세히 설명합니다.
user122345656 apr

1
늦은 답변 죄송합니다. 서버에있는 10Mb 파일의 간단한 예를 상상한다면. 서버는 전체 파일을 가지고 있지만 전체 파일을 하나의 패킷으로 보낼 수 없습니다. 대신 파일은 유한 한 수의 블록으로 분할됩니다. 그런 다음 각 블록이 원격 컴퓨터로 전송되고 재 조립됩니다. 라이브 데이터 스트리밍의 경우 동일한 이론이 적용됩니다. 그러나 서버는 라이브 데이터를 가져 와서 stream패킷 으로 보냅니다 . 그런 다음 원격 컴퓨터는 각 패킷을 버퍼에 저장합니다. 원격 컴퓨터는 버퍼에서 데이터를 읽고 여기에서 비디오를 만듭니다. 이게 도움이 되길 바란다!
PGallagher 2013

1

버퍼는 주변 장치의 데이터 스트림을 저장하는 데 사용되는 메모리의 일부입니다. 그런 다음이 버퍼에서이 데이터 스트림을 수집하여 변수에 저장합니다. 스트림은 연속적인 데이터 흐름으로 정의 할 수 있습니다.

"입력 / 출력"이라는 용어는 데이터를 버퍼 안팎으로 이동하는 것 이상을 의미하지 않습니다. 항상 마음에 두십시오. 프로세스는 운영 체제에 데이터를 버퍼에서 드레인 (쓰기 작업)하거나 버퍼에 데이터를 채우도록 (읽기 작업) 요청하여 I / O를 수행합니다.
데이터 이동 방식에 대한 논리적 다이어그램

간단히 말해서 키보드로 데이터를 입력 할 때 데이터가 파이프 ( 스트림 )를 통해 버퍼로 이동 한 다음 버퍼에서 디스크 (쓰기 작업)로 이동한다고 상상해보십시오 . 마찬가지로 데이터가 디스크에서 버퍼로 , 버퍼에서 콘솔로 이동할 때 읽기 작업입니다.

더 나은 이해를 위해 링크를 읽을 수 있습니다. 도움이 되었기를 바랍니다!.
자바의 버퍼 란?
여기에 링크 설명을 입력하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.