어서와 Java는 처음이지! 제17장 파일입출력.

Slides:



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

어서와 Java는 처음이지! 제3장선택과 반복.
I/O 프로그래밍 컴퓨터 공학실험(I) 인공지능 연구실.
어서와 Java는 처음이지! 제20장 실전프로젝트 #2.
자바네트워크 제2주 바이트 입출력 스트림, 필터 입출력 스트림 컴퓨터시뮬레이션학과 2014년 봄학기 담당교수 : 이형원
캡스톤 프로젝트(자바) 입출력.
명품 JAVA Programming 제 8 장 입출력 스트림.
네트워크 프로그래밍 및 실습.
명품 JAVA Programming.
자바 5.0 프로그래밍.
Java의 정석 제 14 장 입출력(I/O) Java 정석 남궁성 강의
입출력 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.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
10장 예외 Lab 10-1.
명품 JAVA Programming.
파일 입출력에 사용되는 자바 클래스들 JDK 라이브러리의 파일을 다루는 클래스들 파일의 내용을 읽고 쓰는 클래스들
직렬화와 역직렬화에 대하여 직렬화 가능 클래스의 선언 방법
3. 자바에서 지원하는 패키지 자바에서 기본적으로 제공하는 패키지.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
Java 12장. 입출력 public class SumTest {
8장 자바 입출력.
7장 파일과 데이터베이스.
14.3 문자(character) 스트림과 바이트(byte) 스트림
Lesson 3. 입출력과 제어문.
Chapter 14. 입출력 스트림.
7장 배열 ②.
Power Java 제10장 배열.
Lesson 5. 레퍼런스 데이터형.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
JAVA ADVANCED File IO IT 아카데미.
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
명품 JAVA Programming 제 8 장 입출력 스트림과 파일 입출력.
Lesson 6. 형변환.
명품 JAVA Essential.
명품 JAVA Programming 제 16 장 네트워크.
어서와 Java는 처음이지! 제3장선택과 반복.
명품 Java Programming.
제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다.
Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
주소록 프로그램.
명품 JAVA Essential.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
Network Programming(1)
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
CHAP 12. 리소스와 보안.
명품 JAVA Programming.
입출력 CHAPTER 12 Section 1 java.io 패키지 개요 Section 2 파일과 디렉터리
I/O&socket통신 POWERPOINT & GROUP STUDY 한재희 김상훈 최기람 황인준 이어진.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
Lesson 4. 수식과 연산자.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
Lesson 2. 기본 데이터형.
명품 JAVA Programming.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
객체기반 SW설계 팀활동지 4.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
구조체(struct)와 공용체(union)
JSP Programming with a Workbook
어서와 C언어는 처음이지 제21장.
6 객체.
Presentation transcript:

어서와 Java는 처음이지! 제17장 파일입출력

파일의 필요성

스트림(stream) 스트림(stream)은 “순서가 있는 데이터의 연속적인 흐름”이다. 스트림은 입출력을 물의 흐름처럼 간주하는 것이다.

스트림의 분류 입출력의 단위에 따라서 분류

바이트 스트림과 문자 스트림 바이트 스트림(byte stream)은 바이트 단위로 입출력하는 클래스 바이트 스트림 클래스들은 추상 클래스인 InputStream와 OutputStream에서 파생된다. 바이트 스트림 클래스 이름에는InputStream(입력)과 OutputStream(출력)이 붙는다. 문자 스트림(character stream)은 문자 단위로 입출력하는 클래스 이들은 모두 기본 추상 클래스인 Reader와 Write 클래스에서 파생된다. 문자 스트림 클래스 이름에는 Reader(입력)와 Writer(출력)가 붙는다.

바이트 스트림

문자 스트림

기본적인 메소드 InputStream 클래스 OutputStream 클래스 Reader 클래스 Writer 클래스 abstract int read() - 한 바이트를 읽어서 반환한다(0에서 255 사이의 정수). OutputStream 클래스 abstract void write(int b) - 한 바이트를 특정한 장치에 쓴다. Reader 클래스 abstract int read() - 한 문자를 읽어서 반환한다. Writer 클래스 abstract void write(int c) - 한 문자를 특정한 장치에 쓴다.

FileInputStream과 FileOutputStream 파일이 입출력 대상이 된다.

LAB: SimplePair 클래스 작성하기 public class CopyFile1 { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) in.close(); if (out != null) out.close();

LAB: SimplePair 클래스 작성하기 input.txt The language of truth is simple. Easier said than done. First think and speak. Translators, traitors. No smoke without fire. output.txt The language of truth is simple. Easier said than done. First think and speak. Translators, traitors. No smoke without fire.

예제 설명

LAB: 이미지 파일 복사하기 하나의 이미지 파일을 다른 이미지 파일로 복사하는 프로그램을 작성하여 보자.

LAB: SimplePair 클래스 작성하기 public class ByteStreamsLab { public static void main(String[] args) throws IOException { Scanner scan = new Scanner(System.in); System.out.print("원본 파일 이름을 입력하시오: "); String inputFileName = scan.next(); System.out.print("복사 파일 이름을 입력하시오: "); String outputFileName = scan.next(); try (InputStream inputStream = new FileInputStream(inputFileName); OutputStream outputStream = new FileOutputStream(outputFileName)) { int c; while ((c = inputStream.read()) != -1) { outputStream.write(c); } System.out.println(inputFileName + "을 " + outputFileName + "로 복사하였습니다. ");

파일 문자 스트림

예제 public class CopyFile2 { public static void main(String[] args) throws IOException { FileReader inputStream = null; FileWriter outputStream = null; try { inputStream = new FileReader("input.txt"); outputStream = new FileWriter("output.txt"); int c; while ((c = inputStream.read()) != -1) { outputStream.write(c); } } finally { if (inputStream != null) { inputStream.close(); if (outputStream != null) { outputStream.close();

스트림들은 연결될 수 있다.

예제 FileInputStream fileSt = new FileInputStream("sample.dat"); DataInputStream dataSt = new DataInputStream(fileSt); int i = dataSt.readInt();

버퍼 스트림

예제 inputStream = new BufferedReader(new FileReader("input.txt")); outputStream = new BufferedWriter(new FileWriter("out put.txt"));

브릿지 스트림

문자 엔코딩 자바에서는 StandardCharsets 클래스 안에 각 엔코딩 방법이 StandardCharsets.UTF_8, StandardCharsets.UTF_16과 같이 상수로 정의되어 있다. String s = new String(100, StandardCharsets.UTF_8 ); 파일에서 읽을 때는 InputStreamReader 클래스를 사용한다.

예제 public class CharEncodingTest { public static void main(String[] args) throws IOException { File fileDir = new File("input.txt"); BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(fileDir), "UTF8")); String str; while ((str = in.readLine()) != null) { System.out.println(str); }

DataInputStream 과 DataOutputStream DataInputStream 클래스는 readByte(), readInt(), readDouble()과 같은 메소드들을 제공한다. DataOutputStream 클래스는 writeByte(int v), writeInt(int v), writeDouble(double v)와 같은 메소드들을 제공한다.

예제 import java.io.*; public class DataStreamTest { public static void main(String[] args) throws IOException { DataInputStream in = null; DataOutputStream out = null; try { int c; out = new DataOutputStream(new BufferedOutputStream( new FileOutputStream("data.bin"))); out.writeDouble(3.14); out.writeInt(100); out.writeUTF("자신의 생각을 바꾸지 못하는 사람은 결코 현실을 바꿀 수 없다."); out.flush(); in = new DataInputStream(new BufferedInputStream( new FileInputStream("data.bin")));

예제 System.out.println(in.readDouble()); System.out.println(in.readInt()); System.out.println(in.readUTF()); } finally { if (in != null) { in.close(); } if (out != null) { out.close(); 3.14 100 자신의 생각을 바꾸지 못하는 사람은 결코 현실을 바꿀 수 없다.

압축 파일 풀기 자바에서는 ZipInputStream을 이용하여서 ZIP 파일을 읽을 수 있다.

예제 압축 해제: eclipse.ini publ ic class ZipTest { public static void main(String[] args) throws IOException { FileInputStream fin = new FileInputStream("test.zip"); ZipInputStream zin = new ZipInputStream(fin); ZipEntry entry = null; while ((entry = zin.getNextEntry()) != null) { System.out.println("압축 해제: " + entry.getName()); FileOutputStream fout = new FileOutputStream(entry.getName()); for (int c = zin.read(); c != -1; c = zin.read()) { fout.write(c); } zin.closeEntry(); fout.close(); zin.close(); 압축 해제: eclipse.ini

ObjectInputStream과 ObjectOutputStream 직렬화(serialization): 객체가 가진 데이터들을 순차적인 데이터로 변환하는 것

예제 import java.io.*; import java.util.Date; public class ObjectStreamTest { public static void main(String[] args) throws IOException { ObjectInputStream in = null; ObjectOutputStream out = null; try { int c; out = new ObjectOutputStream(new FileOutputStream("object.dat")); out.writeObject(new Date()); out.flush(); in = new ObjectInputStream(new FileInputStream("object.dat")); Date d = (Date) in.readObject(); System.out.println(d); 객체를 직렬화하여서 쓴다.

예제 } catch (ClassNotFoundException e) { } finally { if (in != null) { in.close(); } if (out != null) { out.close(); Mon Jul 13 13:39:47 KST 2015

파일 정보를 얻으려면 Path 클래스는 경로를 나타내는 클래스로서 “/home/work”와 같은 경로를 받아서 객체를 반환한다. (예) Path workDirectory = Paths.get("C:\home\work"); File 객체는 파일이 아닌 파일 이름을 나타낸다. (예) File file = new File("data.txt");

예제 public clas s FileTest { public static void main(String[] args) throws IOException { String name = "c:/eclipse"; File dir = new File(name); String[] fileNames = dir.list(); // 현재 디렉토리의 전체 파일 리스트 for (String s : fileNames) { File f = new File(name + "/" + s); // 절대 경로로 이름을 주어야 함 System.out.println("==============================="); System.out.println("이름: " + f.getName()); System.out.println("경로: " + f.getPath()); System.out.println("부모: " + f.getParent()); System.out.println("절대경로: " + f.getAbsolutePath()); System.out.println("정규경로: " + f.getCanonicalPath()); System.out.println("디렉토리 여부:" + f.isDirectory()); System.out.println("파일 여부:" + f.isFile()); }

예제 =============================== 이름: .eclipseproduct 경로: c:\eclipse\.eclipseproduct 부모: c:\eclipse 절대경로: c:\eclipse\.eclipseproduct 정규경로: C:\eclipse\.eclipseproduct 디렉토리 여부:false 파일 여부:true

LAB: 이미지 파일에서 RGB 값 구하기 이미지 파일에서 픽셀 값을 읽어서 그레이스케일 이미지로 변환한 후에 저장하여 보자.

예제 public class RGB2Gray { BufferedImage myImage; int width; int height; public RGB2Gray() { File ifile = new File("test.jpg"); try { myImage = ImageIO.read(ifile); } catch (IOException e) { e.printStackTrace(); } width = myImage.getWidth(); height = myImage.getHeight(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) {

예제 Color c = new Color(myImage.getRGB(x, y)); int red = (int) (c.getRed() * 0.299); int green = (int) (c.getGreen() * 0.587); int blue = (int) (c.getBlue() * 0.114); Color gray = new Color(red + green + blue, red + green + blue, red + green + blue); myImage.setRGB(x, y, gray.getRGB()); } File ofile = new File("gray.jpg"); try { ImageIO.write(myImage, "jpg", ofile); } catch (IOException e) { e.printStackTrace(); static public void main(String args[]) throws Exception { RGB2Gray obj = new RGB2Gray();

임의 접근 파일 임의 접근 파일은 파일에 비순차적인 접근을 가능하게 한다. new RandomAccessFile("all.zip", "r");

LAB: 시저 암호 작성하기 로마의 유명한 정치가였던 쥴리어스 시저(Julius Caesar,100-44 B.C.)는 친지들에게 비밀리에 편지를 보내고자 할 때 다른 사람들이 알아보지 못하도록 문자들을 다른 문자들로 치환하였다

예제 public class CaesarCipher { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("input.txt"); BufferedReader br = new BufferedReader(fr); String plaintext = br.readLine(); System.out.println(CaesarCipher.encode(plaintext, 3)); System.out.println(CaesarCipher.decode( CaesarCipher.encode(plaintext, 3), 3)); fr.close(); } // 아래 코드는 http://rosettacode.org/wiki/Caesar_cipher에서 가져왔습니다. public static String decode(String enc, int offset) { return encode(enc, 26 - offset);

예제 public static String encode(String enc, int offset) { offset = offset % 26 + 26; StringBuilder encoded = new StringBuilder(); for (char i : enc.toCharArray()) { if (Character.isLetter(i)) { if (Character.isUpperCase(i)) { encoded.append((char) ('A' + (i - 'A' + offset) % 26)); } else { encoded.append((char) ('a' + (i - 'a' + offset) % 26)); } encoded.append(i); return encoded.toString();

Wkh odqjxdjh ri wuxwk lv vlpsoh. The language of truth is simple.

LAB: 행맨 게임 작성하기 빈칸으로 구성된 문자열이 주어지고 사용자는 문자열에 들어갈 글자들을 하나씩 추측해서 맞추는 게임이다. 현재의 상태: ____ 글자를 추측하시오: b 글자를 추측하시오: m 현재의 상태: __m_ 글자를 추측하시오: t 글자를 추측하시오: n 현재의 상태: n_m_ 글자를 추측하시오: a 현재의 상태: nam_ 글자를 추측하시오: e 현재의 상태: name

예제 public class Test { static String solution; static boolean check(String s, StringBuffer a, char ch) { int i; for (i = 0; i < s.length(); i++) { if (s.charAt(i) == ch) a.setCharAt(i, ch); } for (i = 0; i < s.length(); i++) if (s.charAt(i) != a.charAt(i)) return false; return true;

예제 public static void main(String[] args) throws IOException { char ch; Scanner sc = new Scanner(System.in); BufferedReader in = null; String[] words = new String[100]; int count = 0; in = new BufferedReader(new FileReader("sample.txt")); for (int i = 0; i < 100; i++) { String s = in.readLine(); if (s == null) break; words[i] = s; count++; } int index = (new Random()).nextInt(count); solution = words[index]; StringBuffer answer = new StringBuffer(solution.length()); for (int i = 0; i < solution.length(); i++) answer.append(' '); for (int i = 0; i < solution.length(); i++) { if (solution.charAt(i) != ' ') answer.setCharAt(i, '_');

예제 while (true) { // System.out.println("현재의 상태: " + solution); System.out.println("현재의 상태: " + answer); System.out.printf("글자를 추측하시오: "); String c = sc.next(); if (check(solution, answer, c.charAt(0)) == true) break; }