티스토리 뷰

Java

I/O programming

Alledy 2019. 5. 13. 16:54

I/O programming

  • 입력과 출력에 관한 프로그래밍

  • 입출력

    • 표준, 파일, 네트워크
  • 입출력 대상에 관계없이 스트림이라는 논리적 구조를 사용한다. 이는 데이터 소스 추상화와 관련있는 스트림이랑은 다른 개념이다. I/O에서의 스트림은 데이터를 운반하는 데에 사용되는 연결통로이다.

  • 스트림은 크게 바이트 기반과 문자 기반으로 나뉜다. Input, Output 등의 용어가 포함된 스트림은 바이트 기반이며, Reader, Writer이라는 용어가 포함되면 문자 기반 스트림(문자 입출력시 사용)이다.

  • FileReader

    • 예시
    import java.io.*;
    class FileReaderEx1 {
        public static void main(String[] args) {
            try {
                String fileName = "text.txt"
                FileReader fr = new FileReader(fileName); 
                
                int data = 0; 
                while(data = fr.read() != -1) {
                    System.out.print((char)data);
                    System.out.println();
                } 
            } catch(FileNotFoundException fnfe) {
                    fnfe.printStackTrace();
            } catch(IOException e) {
                    e.printStackTrace();
            } finally {
              try {
                   fr.close();
              } catch (Exception e) {
            	  e.printStackTrace();
              }
            }
        }
    }
    

    fileReader는 read() 메서드만 사용하는데, 이는 한글자씩 읽어들이는 특성을 갖고 있다. 파일이 매우 클 경우 한 글자씩 읽어오는 것은 비효율적이므로 BufferedReader를 사용하는 것이 좋다. 단, BufferedReader는 파일을 여는 기능이 없으므로, fileReader로 파일을 열어주고 BufferedReader로 읽어오면 된다. 아니면 만능인 scanner로 다 처리해도 된다.

 

  • FileWriter

    • 예시1
    import java.io.*;
    public class FileWriterTest {
        public static void main(String args[]) {
            FileWriter writer = null;
            String path = "C:/iotest";
            File isDir = new File(path);
            if (!isDir.exists()) {
            	isDir.mkdirs();
            }
            try  {
            	writer = new FileWriter("c:/iotest/output.txt", true);
                char arr[] = { '객', '체', '지', '향', '언', '어', 'J', 'a', 'v', 'a' };          
                for (int cnt = 0; cnt < arr.length; cnt++)
                    writer.write(arr[cnt]);
                writer.write("\r\n");
                writer.write(arr);
                writer.write("\r\n");
                writer.write("시험 대비");
                writer.write("\r\n");
                System.out.println("출력 완료");
            } catch (IOException ioe) {
                System.out.println("파일로 출력할 수 없습니다.");
            } finally {
                try {
                	if (writer != null)
                		writer.close();
                } catch (Exception e) {
                	System.out.println("파일을 닫는동안 오류 발생");
                }
            }
        }
    }
    
    
    • 예시2: try-catch-with-resource
    import java.io.*;
    public class FileWriterTest2 {
        public static void main(String args[]) {      
            try (FileWriter  writer = new FileWriter("c:/iotest/output2.txt");){         
                char arr[] = { '객', '체', '지', '향', '언', '어', 'J', 'a', 'v', 'a' };          
                for (int cnt = 0; cnt < arr.length; cnt++)
                    writer.write(arr[cnt]);
                writer.write('\n');
                writer.write(arr);
                writer.write('\n');
                writer.write("시험 대비");
                writer.write('\n');  
            } catch (IOException ioe) {
                System.out.println("파일로 출력할 수 없습니다.");
            } 
        }
    }
    
    

 

  • FileWriter 예시 1, 2 간 주요한 차이

    • 예시1은 append모드를 사용하여, 여러번 시행하면 그만큼 write가 중복되어 write된다.
    • 예시2는 오버라이딩 되어 여러번 시행해도 문자열이 한 번만 write된다.
    • 예시1은 try-catch-finally문을 사용하였고 writer.close();를 수행하면서 예외처리를 하였다.
    • 예시2는 try-catch-with-resource문을 사용하여 writer.close();가 없다. 예시1과 달리 try 뒤에도 괄호() 가 있는데, try() 안에서 변수 선언되고 생성된 객체는 구문이 수행되고 나면 close를 자동으로 해준다. 단 변수 선언 및 객체 생성이 try괄호 안에 같이 되어야 한다.
    • 소소하게 개행이 다르다. 윈도우에서는 \r\n을 같이 써주어야 개행처리가 된다고 한다. 그러므로 윈도우에서 예시2는 개행처리가 되지 않고 띄어쓰기만 된다.

'Java' 카테고리의 다른 글

직렬화  (0) 2019.05.14
스트림  (0) 2019.05.13
컬렉션 프레임워크, ArrayList, LinkedList  (0) 2019.05.13
인터페이스(Interface)  (0) 2019.05.12
여러 타입의 객체를 배열로 다루기(+ toString())  (0) 2019.05.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함