명품 JAVA Essential.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
어서와 Java는 처음이지! 제17장 파일입출력.
명품 JAVA Programming 제 8 장 입출력 스트림.
명품 JAVA Programming.
입출력 14.1 java.io 패키지의 개요 14.2 파일과 디렉토리
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
제9장 입출력과 JNI.
7장 배열 ②.
Java Seminar 6.
명품 JAVA Essential.
12장. JSP에서 자바빈 활용 제12장.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
명품 JAVA Programming.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
5 익셉션 처리.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
파일 입출력에 사용되는 자바 클래스들 JDK 라이브러리의 파일을 다루는 클래스들 파일의 내용을 읽고 쓰는 클래스들
제7장 제어구조 I – 식과 문장.
명품 JAVA Essential.
Java 12장. 입출력 public class SumTest {
8장 자바 입출력.
Lesson 3. 입출력과 제어문.
Chapter 14. 입출력 스트림.
7 스택.
Power Java 제10장 배열.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
명품 JAVA Programming 제 8 장 입출력 스트림과 파일 입출력.
명품 JAVA Programming 제 16 장 네트워크.
실전 사운드 처리 프로그래밍 Lecture #11.
명품 Java Programming.
Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리.
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
Hadoop 김연왕
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
메모장 구동.
주소록 프로그램.
명품 JAVA Essential.
파일 입출력 12.
Network Programming(1)
6장 객체-지향 설계 ①.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
명품 JAVA Programming.
입출력 CHAPTER 12 Section 1 java.io 패키지 개요 Section 2 파일과 디렉터리
6장 객체-지향 설계 ①.
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
Lesson 4. 수식과 연산자.
DataScience Lab. 박사과정 김희찬 (월)
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
명품 JAVA Programming.
프로그래밍 개론 Ⅰ 제 1장 . 서론 ①.
DataScience Lab. 박사과정 김희찬 (월)
컴퓨터공학실습(I) 3주 인공지능연구실.
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
Stream의 이해 : System Bufferring
C# 10장. 참조형.
Choi Younghwan CSE HUFS
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.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로 복사하였습니다.