ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Reader/Writer
    Language/Java 2019. 12. 7. 21:38

     

     

    지난 포스팅에서 바이트 단위로 입출력이 이루어지는 InputStream/OutputStream에 대해 정리했습니다.

    오늘은 문자 단위로 입출력이 이루어지는 Reader/Writer에 대해 정리해보겠습니다.

     

    Reader와 Writer는 문자(Character) 단위 입출력의 최상의 클래스입니다. 추상 클래스인 이 Reader와 Writer클래스를 상속받은 후손들을 이용해 사용할 수 있습니다. 문자를 단위로 즉, 2byte 문자나 문자열을 읽고 쓰기 위해 입출력이 이루어진다는 사실을 제외하고는 앞선 포스팅의 InputStream/OutputStream과 크게 다른 것이 없습니다.

     

     

     

    InputStreamReader/OutputStreamWriter

     

    앞서 InputStream/OutputStream은 byte단위로 입출력이 이루어진다고 했습니다.

    Reader/Writer는 character를 단위로 입출력이 일어난다고 했죠.

     

    InputStreamReader/OutputStreamWriter는 byte와 character 둘 사이를 연결하는 역할을 합니다.

     

    즉, 바이트 코드를 읽어와서 문자로 변환하고, 문자를 바이트 코드로 변환해서 써주는 것입니다.

    바이트 코드를 문자로 변환하는 경우 특정 인코딩 방식을 지정하는 것도 가능합니다.

     

    public static void main(String[] args) {
           
            InputStreamReader isr = null;
            OutputStreamWriter osw = null;
           
    
            try {
               
                isr = new InputStreamReader(System.in); // System.in/System.out은 바이트 스트림(타입이 InputStream/OutputStream)
                osw = new OutputStreamWriter(System.out);
               
                int i = 0;
               
                while((i=isr.read()) != -1){
                   
                    osw.write((char)i);
                   
                }
           
                       
            } catch (IOException e) {
               
                e.printStackTrace();
               
            }finally{
               
                if(isr != null) try{isr.close();}catch(IOException e){}
                if(osw != null) try{osw.close();}catch(IOException e){}
               
            }
        }

     

    FileReader/FileWriter

     

    FileReader/FileWriter는 InputStreamReader/OutputStreamWriter를 상속받은 하위 클래스입니다. 파일에 저장된 바이트 코드를 유니코드 문자로 변환하여 읽어오고, 유니코드 문자를 다시 바이트 코드로 변환하여 파일에 써주는 역할을 합니다.

     

    코드로 확인할 수 있는 것처럼 FileInputStream과 FileReader의 사용 방식은 동일합니다. 마찬가지로 FileOutputStream과 FileWriter의 동작도 동일합니다. 

     

    	public static void main(String args[]) {
    
    		try {
    
    			String fileName = "test.txt";
    
    			FileInputStream fis = new FileInputStream(fileName);
    
    			FileReader fr = new FileReader(fileName);
    
    
    
    			int data =0;
                
    			while((data=fis.read())!=-1) {
    
    				System.out.print((char)data);
    
    			}
    
    			System.out.println();
    
    			fis.close();
    
    			while((data=fr.read())!=-1) {
    
    				System.out.print((char)data);
    
    			}
    
    			System.out.println();
    
    			fr.close();				
    
    
    
    		} catch (IOException e) {
    
    				e.printStackTrace();		
    
    		}
    
    	}
    

     

    다만 차이가 있다면 InputStream/OutputStream을 상속받는 FileInputStream/FileOutputStream은 byte단위로 입출력을 해주기 때문에 1byte가 넘어가는 문자를 처리할 때 문제가 있습니다. 반면 InputStreamReader/OutputStreamWriter를 상속받은 FileReader/FileWriter는 문자 단위로 입출력이 가능하기 때문에 1byte가 넘는 문자도 처리가 가능합니다.

     

    보조 스트림

     

     InputStream/OutputStream의 보조 스트림으로 BufferedInputStream/BufferedOutputStream이 있었던 것처럼, Reader/Writer에도 입출력의 성능 향상을 돕는 보조 스트림인 BufferedReader/BufferedWriter가 있습니다.

    마찬가지로 BufferedReader/BufferedWriter는 데이터를 문자단위로 버퍼에 저장해 한 번에 여러 개의 문자를 입출력할 수 있습니다.

     

    BufferedReader에는 readLine()메소드가 추가되어 있는데, 이는 하나의 문장 즉 \n 또는 \r을 만날 때까지의 데이터를 한 번에 읽어오는 기능을 합니다.

    BufferedWriter에는 newLine()메소드가 추가되어 줄 바꿈 기능을 제공합니다. FileReader/FileWriter와 함께 BufferedReader/BufferedWriter를 사용하는 예제 코드를 보겠습니다.

     

    public static void main(String args[]){
    		
    		FileReader fr = null;
    		FileWriter fw = null;
    		
    		BufferedReader br = null;
    		BufferedWriter bw = null;
    		
    		
    		try{
    
    			fr = new FileReader("ReadFile.txt");
    			br = new BufferedReader(fr);
    			
    			fw = new FileWriter("CopyFile.txt", false);
    			bw = new BufferedWriter(fw);
    			
    			String s = null;	
    
    			while((s=br.readLine())!=null){
                
    				bw.write(s);
    				bw.newLine();
    			}
    			
    			
    		}catch(Exception e){
    			
    			e.printStackTrace();
    		
    		}finally{
    			
    			if(br != null) try{br.close();}catch(IOException e){}
    			if(fr != null) try{fr.close();}catch(IOException e){}
    			
    			if(bw != null) try{bw.close();}catch(IOException e){}
    			if(fw != null) try{fw.close();}catch(IOException e){}
    			
    		}
    		
    	}

     

    사용법은 BufferedInputStream/BufferedOutputStream과 동일하지만, 한 줄씩 입출력이 가능해 더욱 효율적입니다.

    'Language > Java' 카테고리의 다른 글

    [JAVA] Reflection  (0) 2020.02.01
    [JAVA] Generic Type  (0) 2020.02.01
    [JAVA] InputStream/OutputStream  (0) 2019.12.07
    [JAVA] Thread와 Multi Thread  (0) 2019.11.12
    [JAVA] 다형성(Polymorphism)  (0) 2019.11.09
Designed by Tistory.