import java.io.*;
public class ReadCharactersOffset
{
public static void main(String args[]){
try{
int bufferCapacity = 80;
int size=0;
int dataRead;
byte buffer[] = new byte[bufferCapacity];
while((dataRead = System.in.read(buffer, size, bufferCapacity-size)) = 0){
size += dataRead; // 다음 문장을 읽을 수 있도록 한다.
System.out.print(bufferCapacity-size);
}
System.out.write(buffer, 0, size);
}catch(IOException e){
System.err.println(스트림으로부터 데이터를 읽을 수 없습니다.);
}
}
}이 예제는 책에 있던건데요.
저 코드에 쓰인 read() 메소드는 스트림으로부터 bufferCapacity-size개의 데이터를 읽어서
buffer배열의 size위치부터 차례로 저장되는 거잖아요.
bufferCapaciry-size 부분이 좀 이상합니다.만약에 처음에 안녕하세요라는 말을 입력하고 엔터를 쳤다고 가정하면
스트림에 10바이트+케리지리턴+뉴라인값해서 총 12바이트의 메모리를(?) 사용하게 됩니다.
그래서 offset은 12가 되어서 다음에 입력받을 내용을 buffer의 12부터 쓰게 됩니다.
그런데입력받은 스트림에서 처음에 bufferCapacity-size(80이죠)을 입력받고 다음에
는(80-12) 68만큼의 데이터를 읽어오는 까닭은 무엇인지요? ㅠㅠ
스트림에 있는안녕하세요를 가지고 오려면
그냥 size(10)만저 자리에 들어가면 되는거 아닌가요??
고수님들의 답변을 ㅠㅠ
매력돋는 유진님 2026.01.24
즉 \안녕하세요\를 입력하였으면 님이 말씀하신대로 12바이트를 입력 받습니다. 하지만 이것은 처음에 정해준 버퍼크기(80바이트)보다 작기 때문에 계속 입력받으려고 대기합니다. 80바이트가 다 찰때까지 무한으로 대기합니다. 그러다가 80바이트가 다 입력되면 드디어 출력하러 갑니다. 출력내용은 80바이트의 모든 내용이구요.
님이 원하시는 \안녕하세요\만 출력하려면 System.out.write(buffer, 0, 10); 을 출력하면 되겠군요
푸른마을 2026.01.24
프로그램을 보니 버퍼의 크기를 80으로 잡아 놓고 그 곳에 입력 데이터가 꽉 찰때까지 계속 입력을 받습니다.
즉 80바이트를 모두 입력 받아야지만이 출력하는 곳으로 가는 것이지요. 출력도 버퍼안의 모든 내용(80바이트)를 출력하는 것이구요.