문제

1) 버퍼 스트림은 배경에서 어떻게 작동합니까, 일반 스트림과 어떻게 다르고 사용의 장점은 무엇입니까?

2) DataInputStream 또한 바이트 기반을 둔. 그러나 그것은 방법이 있습니다 readLine(). 여기의 요점은 무엇입니까?

도움이 되었습니까?

해결책

BufferedInputStream Javadoc에서 :

BufferedInputStream은 다른 입력 스트림에 기능을 추가하여 입력을 버퍼링하고 마크 및 재설정 방법을 지원하는 기능을 추가합니다. BufferedInputStream이 생성되면 내부 버퍼 배열이 생성됩니다. 스트림의 바이트를 읽거나 건너 뛰면 내부 버퍼는 함유 된 입력 스트림에서 필요에 따라 리필됩니다. 한 번에 많은 바이트가 있습니다. 마크 조작은 입력 스트림의 점을 기억하고 재설정 작업은 포함 된 입력 스트림에서 새로운 바이트를 가져 오기 전에 가장 최근의 마크 작업이 다시 표시되기 때문에 모든 바이트를 읽습니다.

내부적으로 버퍼 배열이 사용되며 기본 입력 스트림에서 개별적으로 바이트를 읽는 대신 버퍼를 채우기 위해 충분한 바이트를 읽습니다. 이는 일반적으로 기본 입력 스트림에서 읽기가 적 으면서 더 빠른 성능을 제공합니다.

그런 다음 BufferedOutputStream의 경우 반대입니다.

mark () 및 reset ()는 다음과 같이 사용할 수 있습니다.

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

마크/재설정을 더 설명하려면 ...

BufferInputStream은 내부적으로 버퍼의 현재 위치를 기억합니다. 바이트를 읽으면 위치가 증가합니다. Mark (10) 호출은 현재 위치를 저장합니다. 후속 읽기 호출은 현재 위치를 계속 증가 시키지만 재설정 호출은 Mark가 호출 될 때 현재 위치를 해당 값으로 다시 설정합니다.

Mark에 대한 인수는 Mark 위치가 무효화되기 전에 Mark를 호출 한 후 읽을 수있는 바이트 수를 지정합니다. 마크 위치가 무효화되면 더 이상 리셋을 호출하여 반환 할 수 없습니다.

예를 들어, Mark (2)가 4 행에서 사용 된 경우 2 바이트를 읽기 때문에 Mark 위치가 무효화되었으므로 Reset ()가 6 행에서 호출 될 때 IoException이 발생하면 IOException이 발생합니다.

다른 팁

버퍼링 된 독자/작가/입력 스트림/출력 스트림은 최적화를 위해 큰 청크로 OS를 읽고 씁니다. 작가 및 출력 스트림의 경우, 큰 청크를 작성하기에 충분히 수집 될 때까지 데이터가 메모리에 버퍼링됩니다. 독자 및 입력 스트림의 경우, 큰 청크는 읽기 형태 디스크/네트워크/... 버퍼로 형태로 형태로 표시되며 버퍼가 비어있을 때까지 해당 버퍼에서 모든 읽기가 수행되고 새 청크가 읽습니다.

DatainputStream은 실제로 바이트 기반입니다. READLINE 메소드가 더 이상 사용되지 않습니다. 내부적으로 디스크/네트워크에서 바이트를 읽습니다. 따라서이 스트림은 소스로서 BufferedInputStream을 사용하여 스파크를 만들 수 있으며, 라인의 바이트는 디스크에서 직접 대신 내부 버퍼에서 읽습니다.

부러지는 I/O의 경우 각 읽기 또는 쓰기 요청은 운영 체제로 직접 전달됩니다. Java의 버퍼링 된 I/O 스트림은 자체 메모리 버퍼 (보통 바이트 어레이)에 데이터를 읽고 씁니다. 운영 체제에 대한 통화는 버퍼가 비어 있거나 (읽기를 수행 할 때) 버퍼가 가득 차면 (쓰기를 할 때) 만 이루어집니다. 애플리케이션에서 중요한 점수 후에 버퍼를 수동으로 플러시하는 것이 좋습니다.

운영 체제 API 호출은 디스크 액세스, 네트워크 활동 등을 초래할 수 있으므로 비용이 많이들 수 있습니다. 버퍼를 사용하여 기본 운영 체제 I/O를 더 큰 청크로 배치하면 종종 성능이 크게 향상됩니다.

버퍼링 된 스트림은 더 큰 덩어리로 데이터를 쓰거나 읽습니다. 버퍼링. 기본 스트림에 따라 성능이 급격히 증가 할 수 있습니다.

에서 java.io.bufferedoutputstream의 Javadocs :

이러한 출력 스트림을 설정함으로써 응용 프로그램은 각 바이트에 대한 기본 시스템에 대한 호출을 일으키지 않고 기본 출력 스트림에 바이트를 작성할 수 있습니다.

이러한 종류의 오버 헤드를 줄이기 위해 Java 플랫폼은 버퍼링 된 I/O 스트림을 구현합니다. 버퍼 입력 스트림 버퍼로 알려진 메모리 영역에서 데이터를 읽습니다. 기본 입력 API는 버퍼가 비어있을 때만 호출됩니다. 마찬가지로, 버퍼링 된 출력 스트림은 버퍼에 데이터를 작성하고, 기본 출력 API는 버퍼가 가득 찼을 때만 호출됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top