2013-10-19 8 views
1

방금 ​​Java에서 I/O로 시작했고 내 의심이 어리석은 경우 실례합니다.하지만이 코드의 작동 방식을 이해하는 것이 어렵다고 생각하십니까? 아래 코드에서 변수 c가 증가하지 않으면 입력 스트림에 하나의 문자 만 있어도 while 루프가 종료되지 않고 출력 스트림이 한 문자 만 계속 채워지지만이 코드는 실제로 만족스럽게 작동합니다. 그 이유는 무엇입니까?이 코드는 어떻게 작동합니까?

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class CopyBytes { 
public static void main(String[] args) throws IOException { 

    FileInputStream in = null; 
    FileOutputStream out = null; 

    try { 
     in = new FileInputStream("xanadu.txt"); 
     out = new FileOutputStream("outagain.txt"); 
     int c; 

     while ((c = in.read()) != -1) { 
      out.write(c); 
     } 
    } finally { 
     if (in != null) { 
      in.close(); 
     } 
     if (out != null) { 
      out.close(); 
     } 
    } 
} 
} 
+0

저와 같은 의심이 있습니까? :) [스트리밍하는 동안 버퍼 바이트 배열을 계속 채우는 방법?] (http://stackoverflow.com/questions/18105971/how-the-buffer-byte-array-is-continuously-filling-while-streaming) –

답변

2

in.read() 메서드는 한 번에 한 문자 씩 읽습니다. 각 반복 one character을 읽고 c에 할당합니다.

xanadu.txt 파일에는 다음 문자가 있다고 가정합니다.

"ABCDE-1" 

참고 : 파일의 끝의 -1 의미

c=Awhile-> A!=-1 다음 사실 첫 번째 반복에서

(-1는 목적 만 설명 추가됩니다). while 루프를 계속 진행하고 c='A'outagain.txt 파일로 저장하십시오. 두 번째 반복에서

c=Bwhile -> B!=-1 다음 사실. while 루프를 계속 진행하고 c='B'outagain.txt 파일로 저장하십시오. 세 번째 반복에서

c=Cwhile -> C!=-1 다음 사실. while 루프를 계속 진행하고 c='C'outagain.txt 파일로 저장하십시오.네 번째 반복에서

c=Dwhile -> D!=-1 다음 사실. while 루프를 계속 수행하고 c='D'outagain.txt 파일로 저장하십시오. 다섯 번째 반복에서

c=Ewhile -> E!=-1 다음 사실. while 루프를 계속 진행하고 c='E'outagain.txt 파일로 저장하십시오. 여섯 번째 반복에서

c=-1while -> -1!=-1 다음 거짓. while 루프를 종료하십시오

4

Java API에서 : "FileInputStream은 파일 시스템의 파일에서 입력 바이트를 가져옵니다. 사용 가능한 파일은 호스트 환경에 따라 다릅니다."

문자 c가 스트림에서 바이트를 "읽는"데 사용됩니다. read() 메서드를 읽는 데 남은 바이트가 없을 때 -1을 반환하면 루프가 중단됩니다. 값이 될 때까지 무엇을

((c = in.read()) != -1) 

수단을의

읽고 -1.

+0

왜 여기서 변수는 int입니까? 바이트 일 수도 있습니까? –

+0

read 메소드가 지정된 방식으로 인해 int를 반환하는 경우 public int read() throws IOException – pedromss

+0

아니요, 처음에 int를 선택하는 이유는 무엇입니까? 궁금 할 뿐이에요.. –

2

read() 메서드를 사용하면 실제로 읽는 위치가 파일 끝까지 이동합니다. 그것이 작동하는 이유입니다.

0

FileInputStream 개체의 read 함수는 파일의 끝에 도달하면 -1 데이터의 다음 바이트를 반환합니다.

소스 (그것이 실제로 int 반환) : 루프에서 http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read%28%29

, 당신은 일을 : c = in.read()까지 c-1 같습니다. 따라서 각 반복마다 c에는 다음 바이트가 포함됩니다. read에서 증가 자체를 수행합니다.

관련 문제