2017-10-22 12 views
1

Java에서 I/O 클래스 작업 중입니다. 바이트 스트림과 문자 스트림이라는 두 가지 중요한 유형이 있다는 것을 알고 있습니다. 하지만 ... 바이트 스트림을 사용하여 텍스트 파일을 읽고 쓰려고 시도했으며 효과가있었습니다. 여기에 코드입니다 :바이트 스트림과 Java의 문자 스트림

File klasor = new File("C:\\Java"); 
    if(!klasor.exists()) klasor.mkdirs(); 

    File kaynakDosya = new File("C:\\Java\\kaynak.txt"); 
    if(!kaynakDosya.exists()) kaynakDosya.createNewFile(); 

    File hedefDosya = new File("C:\\Java\\hedef.txt"); 
    if(!hedefDosya.exists()) hedefDosya.createNewFile(); 

    FileInputStream kaynak = new FileInputStream(kaynakDosya); 
    FileOutputStream hedef = new FileOutputStream(hedefDosya); 

    int c; 
    while((c = kaynak.read()) != -1) { 
     hedef.write(c); 
    } 

    if(kaynak != null) { 
     kaynak.close(); 
    } 

    if(hedef != null) { 
     hedef.close(); 
    } 

그리고 나는 문자 스트림과 같은 한 :

이 두
File klasor = new File("C:\\Java"); 
    if(!klasor.exists()) klasor.mkdirs(); 

    File kaynakDosya = new File("C:\\Java\\kaynak.txt"); 
    if(!kaynakDosya.exists()) kaynakDosya.createNewFile(); 

    File hedefDosya = new File("C:\\Java\\hedef.txt"); 
    if(!hedefDosya.exists()) hedefDosya.createNewFile(); 

    FileReader kaynak = new FileReader(kaynakDosya); 
    FileWriter hedef = new FileWriter(hedefDosya); 

    int c; 
    while((c = kaynak.read()) != -1) { 
     hedef.write(c); 
    } 

    if(kaynak != null) { 
     kaynak.close(); 
    } 

    if(hedef != null) { 
     hedef.close(); 
    } 

이 같은 결과를 생산했다. 그래서, 알고 싶습니다, 왜 내가 여기에 바이트 스트림을 사용해야하지만 문자 스트림? (내가 stackoverflow에 관한 몇 가지 기사뿐만 아니라 관련 질문을 읽고 그들은 그렇게 말합니다) 문자 스트림은 문자로 문자를 읽을 것입니다,하지만이게 나에게주는 이점은 무엇입니까? 또는 바이트 스트림을 사용하여 문자를 읽으면 어떤 문제가 발생할 수 있습니까? 나는 나의 질문이 분명하기를 바랍니다. 나는 실제 사례를 고맙게 생각한다.

답변

1

java.io.FileInputStream의 javadoc 상태 :

FileInputStream에이 생의 바이트와 같은 이미지 데이터의 스트림을 읽기위한 것입니다. 문자 스트림을 읽으려면 FileReader를 사용하는 것이 좋습니다. 충분히 유사한

java.io.FileOutputStream javadoc의 상태 뭔가 :

의 FileOutputStream는 생의 바이트와 같은 이미지 데이터의 스트림을 기입위한 것입니다. 문자 스트림을 작성하려면 FileWriter를 사용해보십시오. FileInputStream/FileOutputStreamFileReader/FileWriter 간의 주요 차이점

하나는 먼저 후자의 캐릭터를 조작하는 방법을 제공한다 바이트를 조작하는 방법을 제공하는 것이다.

예를 들어 파일 내용을 다른 파일로 복사 할 때 char 또는 byte을 조작해도 큰 차이는 없습니다.
귀하의 경우 FileInputStream 또는 BufferedInputStream이 훨씬 적합합니다.

하지만 당신은 /에서 가 FileReader/FileWriter 정말 일을 용이하게하고 일을 명확하게 사용 String 인스턴스로/쓰기 문자를 읽고 스트림을 사용하는 경우.
게다가 BufferedReader/BufferedWriterFileReader/FileWriter을 넣을 수 있으며 문자, 배열 및 선을 효율적으로 읽고 쓸 수 있습니다. (바이트 지향 입력 스트림 또는 읽고 자) 바이트 지향 출력 스트림에 문자를 쓰는

BufferedWriter writer = new BufferedWriter(new FileWriter("myfile")); 
writer.append(oneString); 
writer.append(oneStringBuffer); 
writer.newLine(); 

BufferedReader reader = new BufferedReader(new FileReader("myfile")); 
String currentLine = reader.readLine(); 
0

스트림의 모든 문자가 될 수있는 경우에만 문자 위주의 스트림을 사용하는 것과 동일한 결과를 얻을 플랫폼 (일반적으로 UTF-8)의 기본 인코딩에서 단일 바이트로 표시되지만 다른 것일 수 있습니다. 이를 테스트하려면 그리스, 키릴 자모 또는 아랍어 문자와 같이 하나 이상의 바이트로 표현해야하는 내용이 포함 된 파일을 사용해보십시오. 바이트 지향 스트림에서는 이러한 기능이 작동하지 않습니다. 문자 지향 스트림에서는 두 스트림이 해당 문자를 지원하는 인코딩 (예 : UTF-8)을 사용하고 입력 파일이 입력 스트림에 사용 된 인코딩에 저장되어있는 한 문자가 보존됩니다.

바이트 지향 코드는 바이트 단위로 파일을 복사하기 때문에 실제로 테스트하지 않습니다. 실제로 작동하는 것처럼 보이지만 실제 문자를 읽으려고하면 (예 : 코드에서 실제 텍스트와 비교하기 위해 실패 할 수 있습니다.)이를 테스트하려면 다음을 포함하는 파일을 만듭니다 (UTF-8 인코딩). 모든되지 않습니다. 실제로 당신은 내가 혼란 스러워요

System.out.println("Success: " + "Привет!".equals(input)); 
+0

를 이용하여 기대가 포함되어있는 경우 키릴 문자 "! Привет는"다음 코드에서는 String 및 테스트에 바이트 지향 입력 스트림을 사용하여 해당 텍스트를 읽어보세요 "파일의 모든 문자가 단일 바이트로 표현 될 수 있다면"당신은 무엇을 의미합니까? 나는 키릴 문자 "Привет!"로 시도해 보았습니다! 소스 파일 "UTF-8"의 인코딩을 유지하고 대상 파일의 인코딩을 "ANSI"로 변경 했으므로 어쨌든 작동했습니다. –

+0

@AdemTepe - In UTF-8, 최대 0x7F의 코드 포인트는 단일 바이트로 표시됩니다. ([this thread] (예 : https://stackoverflow.com/questions/7136421/why-does-utf-8-use-more-than-one-byte-to-represent-some-characters)를 참조하십시오. 바이트 지향 코드는 바이트 단위로 파일을 복사하는 데는 잘 작동하지만 바이트 단위로 문자를 해석 (입력시)하거나 바이트에 문자를 쓰려고하면 지향성 스트림. 나는이 점을 명확히하기 위해 나의 대답을 업데이트 할 것이다. –