953061688145744
Park Hansu
  • 2016.6.28 21:04
  • 조회수 65
  • 답변수 2
953061688145744
Park Hansu
  • 2016.6.28 21:04
  • 조회수 65
  • 답변수 2

복습하고 있는데, 이번 강의에서 또 막히네요ㅜㅜ

1. FileInputStreamread메소드에 대한 질문입니다.

1-1. 지난 번 강의에서는 read 메소드를 인자 없이 사용했습니다.

int readData = -1; 
while((readData = fis.read())!= -1){
  fos.write(readData);
}           

이 경우에 fis.read()는 파일로부터 읽어들인 1byte를 리턴하는 건가요?

1-2. 이번 강의에서는 read 메소드에 buffer(배열)를 인자로 넣었습니다.

int readCount = -1; 
byte[] buffer = new byte[512];
while((readCount = fis.read(buffer))!= -1){
  fos.write(buffer,0,readCount);
}

이 경우에 fis.read(buffer)는 인자인 buffer에 파일로부터 읽어들인 1byte를 대입하고, 읽어들인 횟수를 리턴하는 건가요?

1-3. read 메소드는 오버로딩되어 있는 건가요?

(1)인자가 없는 경우에는 읽어들인 값을 리턴하고, (2)인자가 있는 경우에는 인자에 읽어들인 값을 대입하고 읽어들인 횟수를 리턴하는 건가요?


2. 예제 중 반복문에 대한 질문입니다.

2-1. 파일의 크기가 1000byte라면 이 반복문은 총 2회 반복되나요?

int readCount = -1; 
byte[] buffer = new byte[512];
while((readCount = fis.read(buffer))!= -1){
  fos.write(buffer,0,readCount);
}

파일의 크키가 1000byte라면,
1. 처음에 fis.read(buffer)가 512byte를 읽어 buffer[]에 입력하고 readCount에 511을 리턴한다.
그리고 fos.write(buffer,0,readCount)buffer[0]부터 buffer[511]까지 읽어서 출력한다.

2. 그 다음에는 fis.read(buffer)가 나머지 488byte를 읽어 buffer[]에 입력하고 readCount에 487을 리턴한다.
그리고 fos.write(buffer,0,readCount)buffer[0]부터 buffer[487]까지 읽어서 출력한다.

3. 그 다음에 fis.read(buffer)는 -1을 리턴하고, 반복문이 종료된다.

이렇게 실행되는 게 맞나요?

  • #자바 중급
  • #Byte 단위 입출력 심화

2 답변

  • Spgjnhnsidwygch8ddkd
    Chandler
    • 2016.6.29 14:25

    내용 설명을 위해 1-3부터 답하겠습니다.
    read 메소드는 오버로딩 되어 있습니다. 따라서 1-1과 1-2에서의 read 메소드의 행동이 전혀 다릅니다.

    1-1 fis.read()는 파일로부터 읽어들인 1byte를 리턴하는 건가요?
    아닙니다. 파일로 부터 읽어들인 문자 하나(크기는 4byte)를 리턴합니다.
    그러면 char형으로 리턴하면 되지, 왜 int형으로 리턴하는가에 의문이 남죠.
    그 이유는 자료형의 범위 때문인데요. char 자료형은 2byte로 (0 ~ 216 - 1) 의 범위를 가집니다.
    그러나 read()는 더 이상 읽을 문자가 없을 경우 -1을 리턴하기 때문에 실제로 필요한 범위는 (-1 ~ 216 - 1) 이죠.
    이 범위를 만족하는 가장 작은 자료형이 int형이므로 리턴값의 크기가 int형(4byte)이 된 것입니다.

    1-2 fis.read(buffer)는 인자인 buffer에 파일로부터 읽어들인 1byte를 대입하고, 읽어들인 횟수를 리턴하는 건가요?
    읽은 값을 buffer에 저장하는 것은 맞습니다.
    그러나 buffer의 크기가 512byte이기 때문에, buffer에 읽어들인 (최대)512byte를 저장하는 것 입니다.
    리턴값은 읽은 횟수가 아닌 읽은 값의 크기를 리턴합니다.
    예를 들어, 327byte인 파일이 있다고 한다면 buffer에는 327byte가 저장되고, readCount에는 읽은 값의 크기(byte 수)인 327을 리턴 받습니다.
    그리고 두번째 읽을 때 buffer에는 아무 값이 저장되지 않고, readCount에는 -1을 리턴 받고 종료 되겠죠.

    • 장황한 질문에 명쾌하게 답변해주셔서 감사합니다. 질문하면서 놓친 부분까지 바로잡아주셔서 이해가 더 잘 되었습니다!-Park Hansu
      2016.6.30 14:11
  • Spgjnhnsidwygch8ddkd
    Chandler
    • 2016.6.29 14:39

    두번째 질문에 관한 답변입니다.
    1. 처음에 fis.read(buffer)가 512byte를 읽어 buffer[]에 입력하고 readCount에 512을 리턴한다.
    그리고 fos.write(buffer,0,readCount)가 buffer[0]부터 buffer[511]까지 읽어서 출력한다.
    2. 그 다음에는 fis.read(buffer)가 나머지 488byte를 읽어 buffer[]에 입력하고 readCount에 488을 리턴한다.
    그리고 fos.write(buffer,0,readCount)가 buffer[0]부터 buffer[487]까지 읽어서 출력한다.
    3. 그 다음에 fis.read(buffer)는 -1을 리턴하고, 반복문이 종료된다.

    틀린 부분만 수정했습니다. 모르는 부분이 있다면 댓글 달아주세요 :)

    • 친절한 답변 정말 감사드립니다^^-Park Hansu
      2016.6.30 14:09
    • 그런데 1번에서 readCount에 512를 리턴하면,fos.write(buffer,0,512)가 되는데, 그럼 배열이 0부터 512까지 513개가 되어 오류가 발생하는 것 아닌가요?-Park Hansu
      2016.6.30 14:09
    • write 메소드 매개변수를 보면 write(buffer, index, size) 인데 여기서 index는 buffer의 시작 위치, size는 크기입니다. 따라서 fos.write(buffer,0,512)의 의미는 buffer의 0번 인덱스부터 크기 512만큼 출력 하라는 것 입니다. 즉 0부터 511, 크기 512만큼을 출력 하는 것이죠.-Chandler
      2016.7.2 00:07

답변 쓰기

이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.