2017-05-01 9 views
0
public class JavaCopyFileProgram { 



     public static void main(String[] args) 
     {  
      File sourceFile = new File("F:/Study/Java/Java Programs/Factory Methods.txt"); 

      File destFile = new File("D:/DestFile.txt"); 

      FileInputStream inStream = null; 

      FileOutputStream outStream = null; 

      try 
      { 
       inStream = new FileInputStream(sourceFile); 

       outStream = new FileOutputStream(destFile); 

       byte[] buffer = new byte[1024]; 

       int length; 

       while ((length = inStream.read(buffer)) != -1) 
       { 
        outStream.write(buffer, 0, length); 
       } 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      finally 
      { 
       try 
       { 
        inStream.close(); 

        outStream.close(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 

      System.out.println("Success"); 
     } 
    } 

어떻게 thw write() 메서드가 작동 하는지를 이해할 수 없습니까? 처음 호출 될 때 0 인덱스에서 바이트 배열의 길이로 코드를 작성하지만 두 번째 호출 할 때 이전 텍스트의 끝에 새 텍스트를 추가하는 방법은 무엇입니까? 다시 쓰기가 0으로 시작 색인으로 호출되므로 이전 내용을 대체해야합니다. 내가 뭔가 잘못 이해하면 도와 주시겠습니까?write (byte [], int, int) 메서드는 어떻게 작동합니까?

답변

2

쓰기 메서드의 시작 오프셋은 FileOutputStream의 오프셋을 나타내지 만 사용자가 쓰는 배열의 오프셋은 참조하지 않습니다.

write 방법을 사용하는 방법은 in the documentation of OutputStream (FileOutputStream이 아닌)을 읽을 수 있습니다. 특정 write 메서드 호출

outStream.write(buffer, 0, length); 

를 들어

는 의미 "buffer[0]에서 다음 length 바이트를 시작 outStream를 스트리밍 buffer의 내용을 쓰기".

두 번째 및 세 번째 매개 변수는 배열의 경계를 나타냅니다. 이 메서드는 buffer[0]buffer[length - 1]에 작성합니다. 그리고 inStream에서 반복적으로 읽으므로 (while 루프의 헤드 참조) buffer의 내용은이 입력 스트림의 연속 바이트로 채워집니다. 결과 작업은 여기에 파일 복사본입니다.

1

가장 간단한 형태의 write()write(byte[] buffer)입니다. 버퍼 전체를 출력 스트림에 씁니다.

그러나 전체 버퍼를 작성하는 것이 아니라 일부만 작성하는 경우가 종종 있습니다. 그래서 write(byte[] buffer, int offset, int length)이 존재합니다.

당신은 버퍼가 항상 완전하지 않기 때문에 read() 호출이 항상 전체 버퍼를 읽지 않습니다 때문에, write() 방법의 변형을 사용하여 제공하는 코드, 그것은 바이트의 length 수를 읽습니다.

게시 한 코드에서 오프셋 0으로 매번 read() 메서드가 호출됩니다. 즉, 입력 스트림에서 바이트를 읽고 오프셋 0에서 시작하여 버퍼에 저장합니다. 따라서 write() 메서드가 필요합니다 버퍼의 오프셋 (offset) 제로로부터 개시하는 출력 스트림에 기입하기 위해서 (때문에) 바이트를 꺼내기 시작할 수도 있습니다. 이것이 오프셋 쓰기가 0 인 이유입니다.

그러나 100 바이트를 포함하는 버퍼가 있고 가운데 80 개만 쓰고 싶다면 write(buffer, 10, 80)이라고 말합니다.