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는 개행처리가 되지 않고 띄어쓰기만 된다.