명품 JAVA Essential 1
2 학습목표 1. 자바의입출력스트림에대한이해 2. 텍스트파일입출력 3. 바이너리파일입출력 4. File 클래스로파일속성알아내기 5. 파일복사응용사례
자바의입출력스트림 3 자바의입출력스트림 입출력장치와자바응용프로그램연결 입력스트림 : 입력장치로부터자바프로그램으로데이터를전달하는객체 출력스트림 : 자바프로그램에서출력장치로데이터를보내는객체 특징 입출력스트림기본단위 : 바이트 단방향스트림, 선입선출구조 자바프로그램개발자는직접입력장치에서읽지않고입력스트림을통해읽으며, 스크린등출력장치에직접출력하지않고출력스트림에출력하면된다.
자바의입출력스트림종류 4 문자스트림 문자만입출력하는스트림 문자가아닌바이너리데이터는스트림에서처리하지못함 문자가아닌데이터를문자스트림으로출력하면깨진기호가출력 바이너리파일을문자스트림으로읽으면읽을수없는바이트가생겨서오류발생 예 ) 텍스트파일을읽는입력스트림 바이트스트림 입출력데이터를단순바이트의흐름으로처리 문자데이터든바이너리데이터든상관없이처리가능예 ) 바이너리파일을읽는입력스트림
5 문자스트림과바이트스트림의흐름비교
JDK 의바이트스트림클래스계층구조 6 클래스이름이공통적으로 Stream 으로끝남
JDK 의문자스트림클래스계층구조 7 클래스이름이공통적으로 Reader/Writer 로끝남
스트림연결 8 여러개의스트림을연결하여사용할수있음 예 ) 키보드에서문자를입력받기위해 System.in과 InputStreamReader를연결한코드 InputStreamReader rd = new InputStreamReader(System.in); while(true) { int c = rd.read(); // 입력스트림으로부터키입력. c 는입력된키문자값 if(c == -1) // 입력스트림의끝을만나는경우 break; // 입력종료
문자스트림으로텍스트파일읽기 9 텍스트파일을읽기위해문자스트림 FileReader 클래스이용 1. 파일입력스트림생성 ( 파일열기 ) 스트림을생성하고파일을열어스트림과연결 FileReader fin = new FileReader("c:\\test.txt"); 2. 파일읽기 read() 로문자하나씩파일에서읽음 int c; while((c = fin.read())!= -1) { // 문자를 c 에읽음. 파일끝까지반복 System.out.print((char)c); // 문자 c 화면에출력 3. 스트림닫기 스트림이더이상필요없으면닫아야함. 닫힌스트림에서는읽을수없음 close() 로스트림닫기 fin.close();
파일입출력과예외처리 10 파일입출력동안예외발생가능 스트림생성동안 : FileNotFoundException 발생가능 파일의경로명이틀리거나, 디스크의고장등으로파일을열수없음 FileReader fin = new FileReader("c:\\test.txt"); // FileNotFoundException 발생가능 파일읽기, 쓰기, 닫기를하는동안 : IOException 발생가능 디스크오동작, 파일이중간에깨진경우, 디스크공간이모자라서파일입출력불가 int c = fin.read(); // IOException 발생가능 try-catch 블록반드시필요 자바컴파일러의강제사항 생략가능. FileNotFoundException 은 IOException 을상속받기때문에아래의 catch 블록하나만있으면됨 try { FileReader fin = new FileReader("c:\\test.txt");.. int c = fin.read();... fin.close(); catch(filenotfoundexception e) { System.out.println(" 파일을열수없음 "); catch(ioexception e) { System.out.println(" 입출력오류 ");
11 FileReader 의생성자와주요메소드
예제 13-1 : FileReader 로텍스트파일읽기 12 FileReader 를이용하여 c:\windows\system.ini 파일을읽어화면에출력하는프로그램을작성하라. system.ini 는텍스트파일이다.. import java.io.*; public class FileReaderEx { public static void main(string[] args) { FileReader in = null; try { in = new FileReader("c:\\windows\\system.ini"); int c; while ((c = in.read())!= -1) { // 한문자씩파일끝까지읽는다. System.out.print((char)c); in.close(); catch (IOException e) { System.out.println(" 입출력오류 "); 파일끝을만나면 -1 리턴 ; 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]
문자스트림으로텍스트파일쓰기 13 텍스트파일에쓰기위해문자스트림 FileWriter 클래스이용 1. 파일출력스트림생성 ( 파일열기 ) 스트림을생성하고파일을열어스트림과연결 FileWriter fout = new FileWriter("c:\\test.txt"); 2. 파일쓰기 write() 로문자하나씩파일에기록 fout.write('a'); // 문자 'A' 를파일에기록 블록단위로쓰기가능 char [] buf = new char [1024]; fout.write(buf, 0, buf.length); // buf[0] 부터버퍼크기만큼쓰기 3. 스트림닫기 close() 로스트림닫기 fout.close(); // 스트림닫기. 더이상스트림에기록할수없다.
14 FileWriter 의생성자와주요메소드
예제 13-2 : FileWriter 를이용하여텍스트파일쓰기 15 사용자로부터입력받은텍스트를 c:\tmp\test.txt 파일에저장하는프로그램을작성하라. 사용자는키입력후라인첫위치에 ctrl-z 키 (EOF) 를입력하라. import java.io.*; <Enter> 키 public class FileWriterEx { public static void main(string[] args) { InputStreamReader in = new InputStreamReader(System.in); ctrl-z 키입력 실행결과 test.txt 파일생성 FileWriter fout = null; int c; try { fout = new FileWriter("c:\\tmp\\test.txt"); while ((c = in.read())!= -1) { fout.write(c); // 키보드로부터받은문자를파일에저장 in.close(); fout.close(); catch (IOException e) { System.out.println(" 입출력오류 ");
바이트스트림으로바이너리파일쓰기 16 바이너리값을파일에저장하기 프로그램내의변수, 배열, 버퍼에든바이너리값을파일에그대로기록 FileOutputStream 클래스이용 1. 파일출력스트림생성 ( 파일열기 ) 스트림을생성하고파일을열어스트림과연결 FileOutputStream fout = new FileOutputStream("c:\\test.out"); 2. 파일쓰기 write() 로문자하나씩파일에기록 byte b[] = {7,51,3,4,-1,24; for(int i=0; i<b.length; i++) fout.write(b[i]); // 배열 b 를바이너리그대로기록 3. 스트림닫기 close() 로스트림닫기 test.out 파일내부
17 FileOutputStream 의생성자와주요메소드
예제 13-3 : FileOutputStream 으로바이너리파일쓰기 18 FileOutputStream 을이용하여 byte [] 배열속에들어있는바이너리값을 c:\test.out 파일에저장하라. 이파일은바이너리파일이된다. 이파일은예제 13-4 에서읽어출력할것이다. import java.io.*; public class FileOutputStreamEx { public static void main(string[] args) { byte b[] = {7,51,3,4,-1,24; try { FileOutputStream fout = new FileOutputStream("c:\\test.out"); for(int i=0; i<b.length; i++) fout.write(b[i]); // 배열 b 의바이너리를그대로기록 fout.write(b); 한줄로코딩가능 fout.close(); catch(ioexception e) { System.out.println("c:\\test.out 을저장하였습니다."); c:\test.out 을저장하였습니다. test.out 파일내부
바이트스트림으로바이너리파일읽기 19 바이너리파일에서읽기위해 FileInputStream 클래스이용 1. 파일입력스트림생성 ( 파일열기 ) 스트림을생성하고파일을열어스트림과연결 FileInputStream fin = new FileInputStream("c:\\test.out"); 2. 파일읽기 read() 로문자하나씩파일에서읽기 int n=0, c; while((c = fin.read())!= -1) { b[n] = (byte)c; // 읽은바이트를배열에저장 n++; 블록단위로읽기가능 fin.read(b); // 배열 b 의바이트크기만큼바이너리그대로읽기 3. 스트림닫기 close() 로스트림닫기
20 FileInputStream 의생성자와주요메소드
예제 13-4 : FileInputStream 으로바이너리파일읽기 21 FileInputStream 을이용하여 c:\test.out 파일 ( 예제 13-3 에서저장한파일 ) 을읽어바이너리값들을 byte [] 배열속에저장하고화면에출력하라. test.out 파일내부 import java.io.*; public class FileInputStreamEx { public static void main(string[] args) { byte b[] = new byte [6]; // 비어있는 byte 배열 try { FileInputStream fin = new FileInputStream("c:\\test.out"); int n=0, c; while((c = fin.read())!= -1) { b[n] = (byte)c; // 읽은바이트를배열에저장 n++; System.out.println("c:\\test.out 에서읽은배열을출력합니다."); for(int i=0; i<b.length; i++) System.out.print(b[i]+" "); System.out.println(); fin.close(); catch(ioexception e) { c:\test.out 에서읽은배열을출력합니다. 7 51 3 4-1 24
File 클래스 22 File 클래스 파일의경로명및속성을다루는클래스 java.io.file 파일과디렉터리경로명의추상적표현 파일이름변경, 삭제, 디렉터리생성, 크기등파일관리 File 객체에는파일읽기 / 쓰기기능없음 파일입출력은파일입출력스트림이용 File 객체생성 생성자에파일경로명을주어 File 객체생성 File f = new File("c:\\tmp\\test.txt"); 디렉터리와파일명을나누어생성자호출 File f = new File("c:\\tmp", "test.txt");
23 File 클래스생성자와주요메소드
File 클래스활용 24 파일크기 long size = f.length(); 파일경로명 File f = new File("c:\\windows\\system.ini"); String filename = f.getname(); // "system.ini" String path = f.getpath(); // "c:\\windows\\system.ini" String parent = f.getparent(); // "c:\\windows" 파일타입 if(f.isfile()) System.out.println(f.getPath() + " 는파일입니다."); // 파일 else if(f.isdirectory()) System.out.println(f.getPath() + " 는디렉터리입니다."); // 디렉터리 c:\windows\system.ini 은파일입니다. 디렉터리파일리스트얻기 File f = new File("c:\\tmp"); File[] subfiles = f.listfiles(); // c:\tmp 의파일및서브디렉터리리스트얻기 for(int i=0; i<filenames.length; i++) { System.out.print(subfiles[i].getName()); // 서브파일명출력 System.out.println("\t 파일크기 : " + subfiles[i].length()); // 서브파일크기출력
예제 13-5 : File 클래스를활용한파일관리 25 File 클래스를이용하여, 파일타입및경로명알아내기, 디렉터리생성, 파일이름변경, 디렉터리의파일리스트출력등다양한파일관리사례를보여준다.. import java.io.file; public class FileClassExample { public static void listdirectory(file dir) { System.out.println("-----" + dir.getpath() + " 의서브리스트입니다.-----"); File[] subfiles = dir.listfiles(); for(int i=0; i<subfiles.length; i++) { File f = subfiles[i]; long t = f.lastmodified(); // 마지막으로수정된시간 System.out.print(f.getName()); System.out.print("\t 파일크기 : " + f.length()); // 파일크기 System.out.printf("\t 수정한시간 : %tb %td %ta %tt\n",t, t, t, t); public static void main(string[] args) { File f1 = new File("c:\\windows\\system.ini"); System.out.println( f1.getpath() + ", " + f1.getparent() + ", " + f1.getname()); String res=""; if(f1.isfile()) res = " 파일 "; else if(f1.isdirectory()) res = " 디렉토리 "; System.out.println(f1.getPath() + " 은 " + res + " 입니다."); File f2 = new File("c:\\tmp\\java_sample"); if(!f2.exists()) { f2.mkdir(); listdirectory(new File("c:\\tmp")); f2.renameto(new File("c:\\tmp\\javasample")); listdirectory(new File("c:\\tmp")); c:\windows\system.ini, c:\windows, system.ini c:\windows\system.ini은파일입니다. -----c:\tmp의서브리스트입니다.----- java_sample 파일크기 : 0 수정한시간 : 4월 28 월 18:31:02 song.txt 파일크기 : 20 수정한시간 : 5월 30 수 15:09:33 student.txt 파일크기 : 244 수정한시간 : 7월 08 월 21:46:47 tellephone.txt 파일크기 : 14 수정한시간 : 5월 13 월 12:38:11 wtc2-02f.mid 파일크기 : 4100 수정한시간 : 4월 01 금 05:18:54 -----c:\tmp의서브리스트입니다.----- javasample 파일크기 : 0 수정한시간 : 4월 28 월 18:31:02 song.txt 파일크기 : 20 수정한시간 : 5월 30 수 15:09:33 student.txt 파일크기 : 244 수정한시간 : 7월 08 월 21:46:47 tellephone.txt 파일크기 : 14 수정한시간 : 5월 13 월 12:38:11 wtc2-02f.mid 파일크기 : 4100 수정한시간 : 4월 01 금 05:18:54
예제 13-6 : 텍스트파일복사 26 문자스트림 FileReader와 FileWriter를이용하여 c:\windows\system.ini를 c:\tmp\system.txt 파일로복사하는프로그램을작성하라. import java.io.*; public class TextCopy { public static void main(string[] args){ File src = new File("c:\\windows\\system.ini"); // 원본파일경로명 File dest = new File("c:\\tmp\\system.txt"); // 복사파일경로명 int c; try { FileReader fr = new FileReader(src); // 파일입력문자스트림생성 FileWriter fw = new FileWriter(dest); // 파일출력문자스트림생성 while((c = fr.read())!= -1) { // 문자하나읽고 fw.write((char)c); // 문자하나쓰고 fr.close(); fw.close(); System.out.println( src.getpath()+ " 를 " + dest.getpath()+ " 로복사하였습니다."); catch (IOException e) { System.out.println(" 파일복사오류 "); c:\windows\system.ini 를 c:\tmp\system.txt 로복사하였습니다.
예제 13-7 : 바이너리파일복사 27 바이트스트림 FileInputStream 과 FileOutputStream 을이용하여이미지파일을복사하라. import java.io.*; public class BinaryCopy { public static void main(string[] args) { File src = new File( "c:\\users\\public\\pictures\\sample Pictures\\desert.jpg"); File dest = new File("c:\\tmp\\desert.jpg"); int c; try { FileInputStream fi = new FileInputStream(src); FileOutputStream fo = new FileOutputStream(dest); while((c = fi.read())!= -1) { fo.write((byte)c); fi.close(); fo.close(); System.out.println( src.getpath()+ " 를 " + dest.getpath()+ " 로복사하였습니다."); catch (IOException e) { System.out.println(" 파일복사오류 "); c:\users\public\pictures\sample Pictures\desert.jpg 를 c:\tmp\desert.jpg 로복사하였습니다.
예제 13-8 : 고속복사를위한블록단위바이너리파일복사 28 예제 13-7 을 10KB 씩읽고쓰도록수정하여고속으로파일을복사하라. import java.io.*; public class BlockBonaryCopy { public static void main(string[] args) { File src = new File( "c:\\users\\public\\pictures\\sample Pictures\\desert.jpg"); // 원본파일 File dest = new File("c:\\tmp\\desert.jpg"); // 복사파일 try { FileInputStream fi = new FileInputStream(src); // 파일입력바이트스트림생성 FileOutputStream fo = new FileOutputStream(dest); // 파일출력바이트스트림생성 byte [] buf = new byte [1024*10]; // 10KB 버퍼 while(true) { int n = fi.read(buf); // 버퍼크기만큼읽기. n 은실제읽은바이트 fo.write(buf, 0, n); // buf[0] 부터 n 바이트쓰기 if(n < buf.length) break; // 버퍼크기보다작게읽었기때문에파일끝에도달. 복사종료 fi.close(); fo.close(); System.out.println(src.getPath() + " 를 " + dest.getpath() + " 로복사하였습니다."); catch (IOException e) { System.out.println(" 파일복사오류 "); c:\users\public\pictures\sample Pictures\desert.jpg 를 c:\tmp\desert.jpg 로복사하였습니다.