-
java I/O대학/객체지향프로그래밍 2022. 12. 9. 21:46
java는 입출력을 stream을 통해 처리한다. (FIFO 구조)
단, 한 번에 열 수 있는 스트림 개수가 정해저 있고, 동일한 파일은 둘 이상의 스트림으로 열 수 없다.
스트림을 데이터를 읽는 형식에 따라 아래의 두 종류로 나뉜다.
1. 바이트 스트림: 입출력을 바이너리 데이터로 다룬다.
2. 문자 스트림: 입출력을 문자 단위로 다룬다.
스트림은 보통 버퍼(메모리)와 함께 쓰이는데,
중간에 버퍼를 두는 이유는 스트림과 프로그램 간에 데이터를 효율적으로 전송하기 위함이다.
(특히, 입출력 장치와 프로그램 사이 동작 속도가 크게 차이날수록 버퍼를 사용하는게 효율적이다)
import java.io.*; class BRReadLines { public static void main(String[] args) throws IOException { // create a BufferedReader using System.in // UTF-8을 명시하기 위해 System.console().charset() 사용 BufferedReader br = new BufferedReader(new InputStreamReader(System.in, System.console().charset())); String str; System.out.println("Enter 'stop' to quit."); do { str = br.readLine(); System.out.println(str); } while(!str.equals("stop")); } }
stop이 입력으로 들어올 때 까지 입력받는 문자열을 출력하는 프로그램.
readline() 대신 read() 사용시 문자 하나하나 읽어옴.
import java.io.*; public class PrintWriterDemo { public static void main(String[] args) { PrintWriter pw = new PrintWriter(System.out, true); // flushingOn = true pw.println("This is a string"); // This is a string int i = -7; pw.println(i); // -7 double d = 4.5e-7; pw.println(d); // 4.5E-7 } }
PrintWriter 클래스를 활용해 콘솔에 문자열을 출력하는 프로그램.
flushingOn = true로 하면 println()마다 문자열이 출력됨.
(잦은 호출시에 성능저하가 있을 수 있음)
false로 하면 버퍼에 출력 데이터가 충분히 쌓이기 전까지는 출력되지 않음.
(성능상의 이점은 있으나, 데이터의 동기화에 문제가 있을 수 있음)
import java.io.*; class CopyFile { public static void main(String[] args) throws IOException { int i; FileInputStream fin = null; FileOutputStream fout = null; if(args.length != 2) { System.out.println("Usage: CopyFile from to"); return; } try { fin = new FileInputStream(args[0]); fout = new FileOutputStream(args[1]); do { i = fin.read(); // 파일에서 읽고 if(i != -1) fout.write(i); // 파일에 쓴다. } while(i != -1); // 스트림의 끝에 다다를 경우 -1을 리턴함. } catch(IOException e) { System.out.println("I/O Error: " + e); } finally { try { if(fin != null) fin.close(); } catch(IOException e2) { System.out.println("Error Closing Input File"); } try { if(fout != null) fout.close(); } catch(IOException e2) { System.out.println("Error Closing Output File"); } } } }
파일을 복사하는 프로그램.
스트림을 열어줬으면 반드시 닫아줘야 하는데, 이를 예외처리 구문과 같이 쓰려니 위와 같이 코드가 길어진다.
import java.io.*; class CopyFile2 { public static void main(String[] args) throws IOException { int i; if(args.length != 2) { System.out.println("Usage: CopyFile from to"); return; } try ( FileInputStream fin = new FileInputStream(args[0]); FileOutputStream fout = new FileOutputStream(args[1])) { do { i = fin.read(); if(i != -1) fout.write(i); } while(i != -1); } catch(IOException e) { System.out.println("I/O Error: " + e); } } }
위와 같이 try-with-resources문을 사용하면 파일을 닫는 코드를 생략해도 된다.
'대학 > 객체지향프로그래밍' 카테고리의 다른 글
java generic(1) (0) 2022.12.09 java transient / volatile / instanceof / native / assert (0) 2022.12.09 java 열거형 / 박싱 / 어노테이션 (0) 2022.12.09 java 멀티스레딩 (2) 2022.10.18 java 예외 처리 (0) 2022.10.09