2013-10-07 1 views
0

바이트 지향 스트림 (FileInputStream)과 문자 지향 스트림 (FileReader)의 동작의 차이점을 이해하려고합니다.InputStream 대 CharacterStream의 동작

내가 겪었 다음 http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

첫 번째 프로그램 :

`수입 java.io.FileInputStream의; import java.io.FileOutputStream; 가져 오기 java.io.IOException;

import java.io.FileReader; 

수입 java.io 패키지 :

공용 클래스 CopyBytes { 공공 정적 무효 메인 (문자열 []에 args)는 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(); 
     } 
    } 
} 

} ` 두 번째 프로그램을 던졌습니다 FileWriter; 가져 오기 java.io.IOException;

공용 클래스 CopyCharacters { 공공 정적 무효 메인 (문자열 []에 args) 공개 IOException {

FileReader inputStream = null; 
    FileWriter outputStream = null; 

    try { 
     inputStream = new FileReader("xanadu.txt"); 
     outputStream = new FileWriter("characteroutput.txt"); 

     int c; 
     while ((c = inputStream.read()) != -1) { 
      outputStream.write(c); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (outputStream != null) { 
      outputStream.close(); 
     } 
    } 
} 

가}

그것은 말한다 : CopyCharacters에서 의 INT 변수에 문자 값을 보유하고 그 마지막 16 비트; CopyBytes에서 int 변수는 마지막 8 비트에 바이트 값을 보유합니다.

제 질문은 : 위의 문장을 c (프로그램에 정의 된 정수) 값이 인쇄되는 동안 확인했습니다. 바이트 스트림에서 바이트 단위로 읽으므로 바이트 값을 가지므로 문자 스트림에서 문자 단위로 읽으 므로 문자 ASCII 값을 갖기 때문에 c 값은 연속 읽기에서 달라야합니다. 그러나 그것은 c의 동일한 값을 부여합니다. 왜?

답변

0

다른 방법으로 생각해 보려합니다. 내 소스 파일에 'a'라고만 적힌 문자가 있다면.

이제 CopyBytes는 루프 atleast 동안 2 번 실행해야합니다. 문자는 2 바이트를 차지하기 때문입니다. 그러나 단 한 번만 실행됩니다.

import java.io.FileReader; 

import java.io.FileWriter; 가져 오기 java.io.IOException; // CopyCharacters에서 int 변수는 마지막 16 비트의 문자 값을 보유합니다. // CopyBytes에서 int 변수는 마지막 8 비트에 바이트 값을 보유합니다.

공용 클래스 CopyCharacters { 공공 정적 무효 메인 (문자열 []에 args) 공개 IOException {여기서

FileReader inputStream = null; 
    FileWriter outputStream = null; 

    try { 
     inputStream = new FileReader("source.txt"); 
     outputStream = new FileWriter("characteroutput.txt"); 

     int c; 
     while ((c = inputStream.read()) != -1) { 
      System.out.println("one"); 
      outputStream.write(c); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (outputStream != null) { 
      outputStream.close(); 
     } 
    } 

} 

}

한 인쇄 번만