명품 JAVA Essential.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

자바네트워크 제2주 바이트 입출력 스트림, 필터 입출력 스트림 컴퓨터시뮬레이션학과 2014년 봄학기 담당교수 : 이형원
캡스톤 프로젝트(자바) 입출력.
명품 JAVA Programming 제 8 장 입출력 스트림.
네트워크 프로그래밍 및 실습.
명품 JAVA Programming.
자바 5.0 프로그래밍.
Java의 정석 제 14 장 입출력(I/O) Java 정석 남궁성 강의
10. 예외 처리.
명품 C++ 12장 C++ 파일 입출력.
Image & Video processing
제9장 입출력과 JNI.
최윤정 Java 프로그래밍 클래스 상속 최윤정
10장 예외 Lab 10-1.
명품 JAVA Programming.
파일 입출력에 사용되는 자바 클래스들 JDK 라이브러리의 파일을 다루는 클래스들 파일의 내용을 읽고 쓰는 클래스들
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
Java 12장. 입출력 public class SumTest {
8장 자바 입출력.
14.3 문자(character) 스트림과 바이트(byte) 스트림
Lesson 3. 입출력과 제어문.
7장 배열 ②.
Lesson 5. 레퍼런스 데이터형.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Lesson 9. 예외처리.
명품 JAVA Programming 제 8 장 입출력 스트림과 파일 입출력.
Lesson 6. 형변환.
명품 JAVA Essential.
5장. 참조 타입.
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
Root Filesystem Porting
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
DSP Lab. Week 3 My image Doug Young Suh Media Lab. Rm401
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Root Filesystem Porting
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
주소록 프로그램.
3장 자바의 기본문법(2).
11 표준 입출력과 파일 입출력 데이터를 읽고 쓰는 다양한 방법 익히기!.
Chapter 10 예외 처리와 파일 입출력 01 예외 처리 02 표준 입출력 03 파일 입출력 예제 모음 요약 연습문제.
파일 입출력 12.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
10장. 예외처리.
명품 JAVA Programming.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Lesson 4. 수식과 연산자.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
24장. 파일 입출력.
Lesson 2. 기본 데이터형.
명품 JAVA Programming.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
자바 5.0 프로그래밍.
JA A V W. 06.
CHAP 21. 전화, SMS, 주소록.
[ 단원 04 ] 반복과 배열.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
구조체(struct)와 공용체(union)
Chapter 12 파일 입출력.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
JSP Programming with a Workbook
06. 디바이스의 등록과 해제 김진홍
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
Report #2 (기한: 3/16) 데이터 구조 과목의 수강생이 50명이라고 가정한다. 이 학생(학번은 2016????으로 표현됨)들의 중간 시험(0~100), 기말 시험(0~100) 성적을 성적 파일에 작성하라(프로그램을 통해서 또는 수작업으로). 성적 파일을 읽어들여서.
7 생성자 함수.
6 객체.
BoardGame 보드게임 따라가기.
3장 자바의 기본문법(2).
Presentation transcript:

명품 JAVA Essential

학습 목표 자바의 입출력 스트림에 대한 이해 텍스트 파일 입출력 바이너리 파일 입출력 File 클래스로 파일 속성 알아내기 파일 복사 응용 사례

자바의 입출력 스트림 자바의 입출력 스트림 입출력 장치와 자바 응용 프로그램 연결 특징 입력 스트림 : 입력 장치로부터 자바 프로그램으로 데이터를 전달하는 객체 출력 스트림 : 자바 프로그램에서 출력 장치로 데이터를 보내는 객체 특징 입출력 스트림 기본 단위 : 바이트 단방향 스트림, 선입선출 구조 자바 프로그램 개발자는 직접 입력 장치에서 읽지 않고 입력 스트림을 통해 읽으며, 스크린 등 출력 장치에 직접 출력하지 않고 출력 스트림에 출력하면 된다.

자바의 입출력 스트림 종류 문자 스트림 바이트 스트림 문자만 입출력하는 스트림 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못함 문자가 아닌 데이터를 문자 스트림으로 출력하면 깨진 기호가 출력 바이너리 파일을 문자 스트림으로 읽으면 읽을 수 없는 바이트가 생 겨서 오류 발생 예) 텍스트 파일을 읽는 입력 스트림 바이트 스트림 입출력 데이터를 단순 바이트의 흐름으로 처리 문자 데이터 든 바이너리 데이터든 상관없이 처리 가능 예) 바이너리 파일을 읽는 입력 스트림

문자 스트림과 바이트 스트림의 흐름 비교

JDK의 바이트 스트림 클래스 계층 구조 클래스 이름이 공통적으로 Stream으로 끝남

JDK의 문자 스트림 클래스 계층 구조 클래스 이름이 공통적으로 Reader/Writer로 끝남

스트림 연결 여러 개의 스트림을 연결하여 사용할 수 있음 예) 키보드에서 문자를 입력받기 위해 System.in과 InputStreamReader를 연결한 코드 InputStreamReader rd = new InputStreamReader(System.in); while(true) { int c = rd.read(); // 입력 스트림으로부터 키 입력. c는 입력된 키 문자 값 if(c == -1) // 입력 스트림의 끝을 만나는 경우 break; // 입력 종료 }

문자 스트림으로 텍스트 파일 읽기 텍스트 파일을 읽기 위해 문자 스트림 FileReader 클래스 이용 1. 파일 입력 스트림 생성(파일 열기) 스트림을 생성하고 파일을 열어 스트림과 연결 2. 파일 읽기 read()로 문자 하나 씩 파일에서 읽음 3. 스트림 닫기 스트림이 더 이상 필요 없으면 닫아야 함. 닫힌 스트림에서는 읽을 수 없음 close()로 스트림 닫기 FileReader fin = new FileReader("c:\\test.txt"); int c; while((c = fin.read()) != -1) { // 문자를 c에 읽음. 파일 끝까지 반복 System.out.print((char)c); // 문자 c 화면에 출력 } fin.close();

파일 입출력과 예외 처리 파일 입출력 동안 예외 발생 가능 try-catch 블록 반드시 필요 스트림 생성 동안 : FileNotFoundException 발생 가능 파일의 경로명이 틀리거나, 디스크의 고장 등으로 파일을 열 수 없음 파일 읽기, 쓰기, 닫기를 하는 동안 : IOException 발생 가능 디스크 오동작, 파일이 중간에 깨진 경우, 디스크 공간이 모자라서 파일 입출력 불가 try-catch 블록 반드시 필요 자바 컴파일러의 강제 사항 FileReader fin = new FileReader("c:\\test.txt"); // FileNotFoundException 발생가능 int c = fin.read(); // IOException 발생 가능 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("입출력 오류"); } 생략 가능. FileNotFoundException은 IOException을 상속받기 때문에 아래의 catch 블록 하나만 있으면 됨

FileReader의 생성자와 주요 메소드

예제 13-1 : FileReader로 텍스트 파일 읽기 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("입출력 오류"); ; 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] 파일 끝을 만나면 -1 리턴

문자 스트림으로 텍스트 파일 쓰기 텍스트 파일에 쓰기 위해 문자 스트림 FileWriter 클래스 이용 1. 파일 출력 스트림 생성(파일 열기) 스트림을 생성하고 파일을 열어 스트림과 연결 2. 파일 쓰기 write()로 문자 하나 씩 파일에 기록 블록 단위로 쓰기 가능 3. 스트림 닫기 close()로 스트림 닫기 FileWriter fout = new FileWriter("c:\\test.txt"); fout.write('A'); // 문자 'A'를 파일에 기록 char [] buf = new char [1024]; fout.write(buf, 0, buf.length); // buf[0]부터 버퍼 크기만큼 쓰기 fout.close(); // 스트림 닫기. 더 이상 스트림에 기록할 수 없다.

FileWriter의 생성자와 주요 메소드

예제 13-2 : FileWriter를 이용하여 텍스트 파일 쓰기 사용자로부터 입력받은 텍스트를 c:\tmp\test.txt 파일에 저장하는 프로그램을 작성하라. 사용자는 키 입력 후 라인 첫 위치에 ctrl-z 키(EOF)를 입력하라. import java.io.*; public class FileWriterEx { public static void main(String[] args) { InputStreamReader in = new InputStreamReader(System.in); 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("입출력 오류"); <Enter> 키 ctrl-z 키 입력 실행 결과 test.txt 파일 생성

바이트 스트림으로 바이너리 파일 쓰기 바이너리 값을 파일에 저장하기 프로그램 내의 변수, 배열, 버퍼에 든 바이너리 값을 파일에 그대로 기록 FileOutputStream 클래스 이용 1. 파일 출력 스트림 생성(파일 열기) 스트림을 생성하고 파일을 열어 스트림과 연결 2. 파일 쓰기 write()로 문자 하나 씩 파일에 기록 3. 스트림 닫기 close()로 스트림 닫기 FileOutputStream fout = new FileOutputStream("c:\\test.out"); byte b[] = {7,51,3,4,-1,24}; for(int i=0; i<b.length; i++) fout.write(b[i]); // 배열 b를 바이너리 그대로 기록 test.out 파일 내부

FileOutputStream의 생성자와 주요 메소드

예제 13-3 : FileOutputStream으로 바이너리 파일 쓰기 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.close(); } catch(IOException e) { } System.out.println("c:\\test.out을 저장하였습니다."); } fout.write(b); 한 줄로 코딩 가능 c:\test.out을 저장하였습니다. test.out 파일 내부

바이트 스트림으로 바이너리 파일 읽기 바이너리 파일에서 읽기 위해 FileInputStream 클래스 이용 1. 파일 입력 스트림 생성(파일 열기) 스트림을 생성하고 파일을 열어 스트림과 연결 2. 파일 읽기 read()로 문자 하나 씩 파일에서 읽기 블록 단위로 읽기 가능 3. 스트림 닫기 close()로 스트림 닫기 FileInputStream fin = new FileInputStream("c:\\test.out"); int n=0, c; while((c = fin.read()) != -1) { b[n] = (byte)c; // 읽은 바이트를 배열에 저장 n++; } fin.read(b); // 배열 b의 바이트 크기만큼 바이너리 그대로 읽기

FileInputStream의 생성자와 주요 메소드

예제 13-4 : FileInputStream으로 바이너리 파일 읽기 FileInputStream을 이용하여 c:\test.out 파일(예제 13-3에서 저장한 파일)을 읽어 바이너리 값들을 byte [] 배열 속에 저장하고 화면에 출력하라. 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) { } test.out 파일 내부 c:\test.out에서 읽은 배열을 출력합니다. 7 51 3 4 -1 24

File 클래스 File 클래스 File 객체 생성 파일의 경로명 및 속성을 다루는 클래스 java.io.File 파일과 디렉터리 경로명의 추상적 표현 파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리 File 객체에는 파일 읽기/쓰기 기능 없음 파일 입출력은 파일 입출력 스트림 이용 File 객체 생성 생성자에 파일 경로명을 주어 File 객체 생성 디렉터리와 파일명을 나누어 생성자 호출 File f = new File("c:\\tmp\\test.txt"); File f = new File("c:\\tmp", "test.txt");

File 클래스 생성자와 주요 메소드

File 클래스 활용 파일 크기 파일 경로명 파일 타입 디렉터리 파일 리스트 얻기 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 클래스를 활용한 파일 관리 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 javasample 파일 크기: 0 수정한 시간: 4월 28 월 18:31:02

예제 13-6 : 텍스트 파일 복사 문자 스트림 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 : 바이너리 파일 복사 바이트 스트림 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 : 고속 복사를 위한 블록 단위 바이너리 파일 복사 예제 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로 복사하였습니다.