스트림 Stream, Buffer, File I/O 514760-1 2017 년가을학기 11/13/2017 박경신 자바의스트림 자바스트림은입출력장치와자바응용프로그램연결 입출력장치와프로그램사이의데이터흐름을처리하는소프트웨어모듈 입력스트림 입력장치로부터자바프로그램으로데이터를전달하는소프트웨어모듈 출력스트림 자바프로그램에서출력장치로데이터를보내는소프트웨어모듈 입출력스트림기본단위 : 바이트자바입출력스트림특징 단방향스트림, 선입선출구조 자바의입출력스트림종류 JDK 의바이트스트림클래스계층구조 바이트입출력스트림과문자입출력스트림 바이트입출력스트림 입출력되는데이터를단순바이트의스트림으로처리 예 ) 바이너리파일을읽는입력스트림 문자입출력스트림 문자만입출력하는스트림 문자가아닌바이너리데이터는스트림에서처리하지못함 예 ) 텍스트파일을읽는입력스트림 JDK 는입출력스트림을구현한다양한클래스제공 클래스이름이공통적으로 Stream 으로끝남
JDK 의문자스트림클래스계층구조 스트림은연결될수있다 * 별모양의쿠키를굽는스트림 * 표준입력스트림 System.in 에 InputStreamReader 스트림을연결하는사례 클래스이름이공통적으로 InputStreamReader rd = new InputStreamReader(System.in); Reader/Writer로끝남 6 int c = rd.read(); // 키보드에서문자읽음 바이트스트림클래스 바이트스트림 바이트단위의바이너리값을읽고쓰는스트림 바이트스트림클래스 java.io 패키지에포함 InputStream/OutputStream 추상클래스 바이트스트림을다루는모든클래스의슈퍼클래스 FileInputStream/FileOutputStream 파일로부터바이트단위로읽거나저장하는클래스 바이너리파일의입출력용도 DataInputStream/DataOutputStream 자바의기본데이터타입의값 ( 변수 ) 을바이너리값그대로입출력 문자열도바이너리형태로입출력 FileInputStream 을이용한파일읽기 파일전체를읽어화면에출력하는코드샘플 FileInputStream fin = new FileInputStream("c:\\test.txt"); while((c = fin.read())!= -1) { f C:\test.txt 파일을열고파일과입력바이트스트림객체 fin 연결 파일끝까지바이트씩 c 에읽어들임. 파일의끝을만나면 read() 는 -1 리턴 바이트 c 를문자로변환하여화면에출력 스트림을닫음. 파일도닫힘. 스트림과파일의연결을끊음. 더이상스트림으로부터읽을수없음
예제 : 윈도우에있는 system.ini 파일을읽어화면에출력하기 FileInputStream 을이용하여사용자컴퓨터의 windows 디렉터리에있는 system.ini 파일을읽고화면에출력하라. system.ini 파일은텍스트파일이다. public class FileInputStreamEx { FileInputStream in = null; in = new FileInputStream("c:\\windows\\system.ini"); 파일끝을만나면 -1 리턴 catch (IOException e) { System.out.println(" 입출력오류 "); ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON [drivers] wave=mmdrv.dll timer=timer.drv [mci] FileOutputStream 을이용한파일쓰기 바이너리값을파일에저장하는바이트스트림코드 FileOutputStream fout = new FileOutputStream("c:\\test.out"); int num[]={1,4,-1,88,50; byte b[]={7,51,3,4,1,24; for(int i=0; i<num.length; i++) fout.write(num[i]); fout.write(b); fout.close(); c:\test.out 파일을열고, 출력바이트스트림인객체와연결 파일에배열 num[i] 의정수값 ( 바이너리 ) 을그대로기록 파일에바이트배열 ( 바이너리 ) 값을그대로기록 스트림을닫음. 파일도닫힘. 더이상스트림으로부터읽을수없음 FileOutputStream 을이용한파일쓰기 예제 : FileOutputStream 을이용한파일쓰기 test.out 파일의내부 파일에있는각바이너리값들은문자정보가아님. 바이너리값에대응하는그래픽심볼들 정수타입의결과값을 FileOutputStream을이용하여파일에저장한다. 다시이파일에서정수형변수로읽고이전에계산된결과값과같은지확인하라. import java.io.ioexception; public class FileOutputStreamEx { FileOutputStream fout = new FileOutputStream( c:\\test.out"); FileInputStream fin = null; for (int i=0; i<10; i++) { int n = 10-i; // 계산의결과를저장 fout.write(n); // 파일에결과값을바이너리로저장 fout.close(); // 스트림을닫는다.
예제 : FileOutputStream 을이용한파일쓰기 fin = new FileInputStream( c:\\test.out"); int c=0; while ((c = fin.read())!= -1) { System.out.print(c + " "); f catch (IOException e) { System.out.println(" 입출력오류 "); 10 9 8 7 6 5 4 3 2 1 문자스트림 문자스트림 유니코드로된문자를입출력하는스트림 문자로표현되지않는데이터는다루지않음 문자스트림은이미지, 동영상과같은바이너리데이터는입출력할수없음 - 문자스트림은문자데이터만입출력가능 문자스트림을다루는클래스 Reader/Writer java.io 패키지에포함 추상클래스. 문자스트림을다루는모든클래스의슈퍼클래스 InputStreamReader/OutputStreamWriter 바이트스트림과문자스트림을연결시켜주는다리역할 지정된문자집합이용 InputStreamReader : 바이트를읽어문자로인코딩 OutputStreamWriter : 문자를바이트로디코딩하여출력 FileReader/FileWriter 텍스트파일에서문자데이터입출력 예제 : FileReader 를이용한텍스트파일읽기 - system.ini 파일읽기 FileReader 를이용하여사용자컴퓨터의 windows 디렉터리에있는 system.ini 파일을읽고화면에출력하라. system.ini 파일은텍스트파일이다. public class FileReaderEx { FileReader in = null; // 파일로부터문자입력스트림생성 in = new FileReader("c:\\windows\\system.ini"); // 한문자씩읽는다. catch (IOException e) { System.out.println(" 입출력오류 "); 파일의끝을만나면 read() 는 -1 리턴 문자집합과 InputStreamReader 로텍스트파일읽기 FileInputStream fin = new FileInputStream("c:\\tmp\\hangul.txt"); InputStreamReader in = new InputStreamReader(fin, "MS949"); 10101101 fin FileInputStream 10101101 문자집합사용 ( 윈도우에서 MS949) in InputStreamReader 한글확장완성형문자집합 가, 나 in.read()
예제 : 한글텍스트파일읽기 InputStreamReader 를이용하여 MS949 문자집합으로한글텍스트파일을 읽고출력하라. public class FileReadHangulSuccess { InputStreamReader in = null; FileInputStream fin = null; fin = new FileInputStream("c:\\tmp\\hangul.txt"); in = new InputStreamReader(fin, "MS949"); hangul.txt MS 에서만든한글확장 완성형문자집합 System.out.println(" 인코딩문자집합은 " + in.getencoding()); 인코딩문자집합은 MS949 가나다라마바사아자차카타파하 f catch (IOException e) { System.out.println(" 입출력오류 "); 예제 : 문자집합지정이잘못된한글텍스트파일읽기 InputStreamReader 의문자집합을 US-ASCII 로지정하여한글파일을 읽고출력하라. public class FileReadHangulFail { InputStreamReader in = null; 문자집합지정이잘못된 FileInputStream fin = null; 경우의예를보이기위해일부러틀린문자집합지정 fin = new FileInputStream("c:\\tmp\\hangul.txt"); hangul.txt in = new InputStreamReader(fin, "US-ASCII"); System.out.println(" 인코딩문자집합은 " + in.getencoding()); 인코딩문자집합은 ASCII???????????????????????????? f catch (IOException e) { System.out.println(" 입출력오류 "); 문자집합지정이잘못되어읽은문자가제대로인식되지못함. 출력결과가깨짐 FileWriter 사용예 c:\test.txt 파일에문자출력스트림을생성하는코드 FileWriter fout = new FileWriter("c:\\tmp\\test.txt"); 파일에문자출력 FileWriter fout = new FileWriter("c:\\tmp\\test.txt"); fout.write( A ); // 문자 A 출력 fout.close(); 예제 : 키보드입력을파일로저장하기 키보드입력데이터를 c:\tmp\test.txt 파일에저장하는코드를작성하라. public class FileWriterEx { InputStreamReader in = new InputStreamReader(System.in); FileWriter fout = null; fout = new FileWriter("c:\\tmp\\test.txt"); fout.write(c); fout.close(); catch (IOException e) { System.out.println(" 입출력오류 ");
예제 : 키보드입력을파일로저장하기 abcdef 입력후 <Enter> 키와 ctrl-z 키입력 버퍼입출력스트림과버퍼입출력의특징 버퍼스트림 버퍼를가진스트림 입출력데이터를일시적으로저장하는버퍼를이용하여입출력효율개선 버퍼입출력의목적 입출력시운영체제의 API 호출횟수를줄여입출력성능개선 출력시여러번출력되는데이터를버퍼에모아두고한번에장치로출력 입력시입력데이터를버퍼에모아두고한번에프로그램에게전달 실행결과 test.txt 파일생성 버퍼스트림의종류 바이트버퍼스트림 바이트단위의바이너리데이터를처리하는버퍼스트림 BufferedInputStream와 BufferedOutputStream 문자버퍼스트림 유니코드의문자데이터만처리하는버퍼스트림 BufferedReader와 BufferedWriter 20 바이트버퍼를가진 BufferedOutputStream BufferedOutputStream bout = new BufferedOutputStream(System.out, 20); FileReader fin = new FileReader("c:\\windows\\system.ini"); while ((c = fin.read())!= -1) { bout.write((char)c); f bout.close(); 스트림닫음 파일전체를읽어화면에출력 20 바이트크기의버퍼설정. System.out 표준스트림에출력
예제 : 버퍼스트림을이용하는출력예제 10101101 20 바이트버퍼 fin in.read() ; f o r ; f o r FileReader int c... bout System.out 10101101 BufferedOutputStram OutputStream ; f o r ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON 버퍼크기를 5로하고, 표준출력스트림과연결된버퍼출력스트림을생성하라. 키보드에서입력받은문자를출력스트림에출력하고, 입력의끝을알리면 (ctrl-z) 버퍼에남아있는모든문자를출력하는프로그램을작성하라. public class BufferedIOEx { InputStreamReader in = new InputStreamReader(System.in); BufferedOutputStream out = new BufferedOutputStream(System.out, 5); ctrl-z가입력될때까지반복 while ((c = in.read())!= -1) out.write(c); 버퍼가다찰때문자가화면에출력 out.flush(); // 버퍼에남아있던문자출력 if (in!= null) { out.close(); catch (IOException e) { System.out.println(" 입출력오류 "); 예제 : 버퍼스트림을이용하는출력예제 <Enter> 키를입력했을때버퍼에저장된 12345 까지만출력. 버퍼가비게되고다시 678 이버퍼에저장됨 File 클래스 File 클래스 파일의경로명을다루는클래스 java.io.file 파일과디렉터리경로명의추상적표현 파일이름변경, 삭제, 디렉터리생성, 크기등파일관리 File 객체는파일읽고쓰기기능없음 파일입출력은파일입출력스트림이용 ctrl-z 키를입력했을때버퍼에남아있던 678 모두출력
File 클래스생성자와주요메소드 File 클래스사용예 29 파일객체생성 파일인지디렉터리인지구분 서브디렉터리리스트얻기 File f = new File("c:\\test.txt"); File f = new File("c:\\windows\\system.ini"); String res; if(f.isfile()) // 파일타입이면 res = " 파일 "; else // 디렉터리타입이면 res = " 디렉터리 "; System.out.println(f.getPath() + " 은 " + res + " 입니다."); c:\windows\system.ini 은파일입니다. File f = new File("c:\\tmp\\java_sample"); String[] filenames = f.list(); // 파일명리스트얻기 for (int i=0; i<filenames.length; i++) { File sf = new File(f, filenames[i]); System.out.print(filenames[i]); System.out.print("\t 파일크기 : " + sf.length()); 예제 : File 클래스활용한파일관리 File 클래스를이용하여파일의타입을알아내고, 디렉터리에있는파일들을나열하며, 디렉터리이름을변경하는프로그램을작성해보자. import java.io.file; public class FileClassExample { // 디렉터리에포함된파일과디렉터리의이름, // 크기, 수정시간을출력하는메소드 public static void dir(file fd) { // 디렉터리에포함된파일리스트얻기 String[] filenames = fd.list(); for (String s : filenames) { File f = new File(fd, s); long t = f.lastmodified(); // 마지막으로수정된시간 System.out.print(s); System.out.print("\t 파일크기 : " + f.length()); // 파일크기 System.out.printf("\t 수정한시간 : %tb %td %ta %tt\n",t, t, t, t); 예제 : File 클래스활용한파일관리 File f1 = new File("c:\\windows\\system.ini"); File f2 = new File("c:\\tmp\\java_sample"); File f3 = new File("c:\\tmp"); String res; if(f1.isfile()) // 파일타입이면 res = " 파일 "; else // 디렉터리타입이면 res = " 디렉터리 "; System.out.println(f1.getPath() + " 은 " + res + " 입니다."); if (!f2.exists()) { //f2 가나타내는파일이존재하는지검사 if (!f2.mkdir()) // 존재하지않으면디렉터리생성 System.out.println(" 디렉터리생성실패 ");
예제 : File 클래스활용한파일관리 if(f2.isfile()) // 파일타입이면 res = " 파일 "; else // 디렉터리타입이면 res = " 디렉터리 "; System.out.println(f2.getPath() + " 은 " + res + " 입니다."); dir(f3); // c:\tmp 에있는파일과디렉터리화면에출력 // 파일이름변경 f2.renameto(new File("c:\\tmp\\javasample")); dir(f3); C:\tmp 의파일과디렉터리리스트 c:\windows\system.ini 은파일입니다. c:\tmp\java_sample 은디렉터리입니다. hangul.txt 파일크기 : 28 수정한시간 : 11 월 29 일 21:04:46 Hello.java 파일크기 : 469 수정한시간 : 10 월 06 수 13:23:59 Hello2010.java 파일크기 : 126 수정한시간 : 10 월 06 수 10:01:56 HelloDoc.java 파일크기 : 669 수정한시간 : 10 월 06 수 14:23:32 java_sample 파일크기 : 0 수정한시간 : 11 월 14 일 16:46:27 hangul.txt 파일크기 : 28 수정한시간 : 11 월 29 일 21:04:46 Hello.java 파일크기 : 469 수정한시간 : 10 월 06 수 13:23:59 Hello2010.java 파일크기 : 126 수정한시간 : 10 월 06 수 10:01:56 HelloDoc.java 파일크기 : 669 수정한시간 : 10 월 06 수 14:23:32 javasample 파일크기 : 0 수정한시간 : 11 월 14 일 16:46:27 예제 : 텍스트파일복사 문자스트림을이용하여텍스트파일을복사하는프로그램을작성하라 public class TextCopy { public static void main(string[] args){ File src = new File("c:\\windows\\system.ini"); // 소스파일 File dst = new File("c:\\tmp\\system.txt"); // 목적파일 FileReader fr = null; FileWriter fw = null; BufferedReader in = null; BufferedWriter out = null; 예제 : 텍스트파일복사 fr = new FileReader(src); fw = new FileWriter(dst); in = new BufferedReader(fr); out = new BufferedWriter(fw); out.write((char)c); out.close(); fr.close(); fw.close(); catch (IOException e) { System.out.println(" 파일복사오류 "); 예제 : 텍스트파일복사 예제실행
예제 : 바이너리파일복사 바이트스트림을이용하여바이너리파일을복사하는프로그램을작성하라 public class BinaryCopy { File src = new File("c:\\windows\\explorer.exe"); // 소스파일 File dst = new File("c:\\tmp\\explorer.bin"); // 목적파일 FileInputStream fi = null; FileOutputStream fo = null; BufferedInputStream in = null; BufferedOutputStream out = null; 예제 : 바이너리파일복사 fi = new FileInputStream(src); fo = new FileOutputStream(dst); in = new BufferedInputStream(fi); out = new BufferedOutputStream(fo); out.write((char)c); out.close(); fi.close(); fo.close(); catch (IOException e) { System.out.println(" 파일복사오류 "); 예제 : 바이너리파일복사 예제실행 explorer.exe 와파일크기동일