티스토리 뷰
파일 입출력은 1과 2로 나누어서 공부하도록 하겠습니다.
파일 입출력은 1에서 배운내용을 토대로
이미지 파일 전송 및 불러오기를 실습하도록 하겠습니다.
이미지 파일 전송에 대한 실습입니다.
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class ExampleImageSend{ public static void main(String[] args) throws IOException { // byte [] 스트림은 InputStream, OutputStream // 1) 바이트형태의 파일 불러오기 // => InputStream File file = new File("tiger.jpg"); InputStream in = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(in); // 직접 버퍼를 만들어야 한다. byte[] buffer = new byte[1024*1024]; // 1kb 짜리 바가지를 만들어낸 것과 같다. // BufferedInputStream을 이용하여 버퍼에 담긴 데이터의 수 // ex) 바가지에 쌀을 몇개나 담겼는지 ? int readCount = -1; while ((readCount = bis.read(buffer)) != -1) { System.out.println("읽은 수: " + readCount); } bis.close(); } }
이미지 파일 불러오는 실습입니다.
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ExampleImageRead{ public static void main(String[] args) throws IOException { // 읽어올 파일(원본 파일) 준비 File originalFile = new File("tiger.jpg"); if (originalFile.exists()) { // 1) 원본파일 읽어 오기 FileInputStream in = new FileInputStream(originalFile); // 2) 보조 스트림 준비 BufferedInputStream bis = new BufferedInputStream(in); // 3) 버퍼준비 byte[] buffer = new byte[1024 * 1024]; // 4) 복사 대상 파일 준비 File copyFile = new File("copy_tiger.jpg"); // BufferedInputStream 으로 입력 받은 버퍼에 들어있는 데이터를 copyFile에 출력 // 출력을 위한 OutputStream이 필요하다 FileOutputStream out = new FileOutputStream(copyFile); BufferedOutputStream bos = new BufferedOutputStream(out); int readCount = -1; int total_readCount = 0; while ((readCount = bis.read(buffer)) != -1) { total_readCount += readCount; // BufferedInputStream을 이용하여 읽어들인 버퍼를 // 그대로 BufferedOutputStream을 이용하여 출력한다. bos.write(buffer); // File.length(): 파일의 전체 길이 System.out.println("파일 복사 진행 >> " + total_readCount + "/" + originalFile.length()); } bos.close(); bis.close(); } else { System.out.println("원본파일이 없습니다."); } System.out.println("프로그램 종료"); } }
이제 파일 입출력2에서 공부할 내용은
데이터 스트림(DataStream)과 객체 스트림(Object Stream)입니다.
먼저 데이터 스트림에 대해 알아보겠습니다.
데이터 스트림도 Input/Output으로 나뉘고 있습니다.
먼저
* DataOutputStream
생성자 및 메소드 |
설명 |
DataOutputStream(OutputStream out) |
OutputStream을 인자로 DataIOutStream을 생성한다. |
void writeBoolean(boolean b) |
Stream으로부터 일은 자료형을 출력한다. |
void writeByte(int v) | |
void writeChar(int v) | |
void writeDouble(double v) | |
void writeFloat(float v) | |
void writeInt(int v) | |
void writeLong(long v) | |
void writeShort(int v) | |
void writeUTF(String str) |
UTF-8 형식으로 코딩된 문자열을 출력한다. |
DataOutputStream에 대한 실습입니다.
import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class ExampleDataOutput{ public static void main(String[] args) throws IOException { // DataInput/OutputStream // 자바의 기본자료형의 입출력을 손쉽게 해준다. File dataFile = new File("dataFile.txt"); if(!dataFile.exists()){ dataFile.createNewFile(); } FileOutputStream out = new FileOutputStream(dataFile); //자바의 기본자료형을 출력하기 위해 DataOutputStream 생성 DataOutputStream dos = new DataOutputStream(out); dos.writeInt(100); dos.writeLong(100L); dos.writeDouble(10.123); dos.writeUTF("문자열~"); dos.close(); System.out.println("프로그램 종료"); } }
* DataInputStream
- 기초 자료형 단위로 데이터를 읽는다.,
- 각 자료형의 크기가 다르기 때문에 쓸 때와 동일한 순서로 읽어야 한다.
생성자 및 메소드 |
설명 |
DataInputStream(InputStream in ) |
InputStream을 인자로 DataInputStream을 생성한다. |
boolean readBoolean(boolean b) |
Stream으로부터 일은 자료형을 반환한다. |
byte readByte() | |
char readChar() | |
double readDouble() | |
float readFloat() | |
int readInt() | |
long readLong() | |
short readShort() | |
String readUTF() |
UTF-8 형식으로 코딩된 문자열을 읽는다. |
DataInputStream에 대한 실습입니다.
import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ExampleDataInput { public static void main(String[] args) throws IOException { File dataFile = new File("dataFile.txt"); if (dataFile.exists()) { FileInputStream in = new FileInputStream(dataFile); // 기본 자료형 형태의 데이터를 읽어오기 위해 DataInputStream 필요 DataInputStream dis = new DataInputStream(in); // DataInputStream을 이용하여 데이터를 읽어 올 때는 write한 순서 그대로 읽어 와야 한다. // 순서를 안 지킬 경우 데이터값이 깨진다. int int_data = dis.readInt(); long long_data = dis.readLong(); double double_data = dis.readDouble(); String string_data = dis.readUTF(); System.out.println(int_data); System.out.println(long_data); System.out.println(double_data); System.out.println(string_data); dis.close(); }else{ System.out.println("파일이 없습니다."); } } }
DataInput/Ouput Stream에 대한 실습을 마치고
객체 스트림에 대해 공부하겠습니다.
* 객체스트림
- 객체의 입출력을 지원하고 객체를 파일에 저장 또는 저장된 객체를 읽어온다.
- 직렬화 (serialization) : 객체가 가진 데이터들을 순차적인 데이터로 변환시킨다.
- 직렬화를 지원하려면 Serializable 인터페이스를 구현한다.
- 우리가 사용하는 대부분의 클래스는 이미 직렬화를 지원하고있다.
- 역직렬화 (deserialization) : 직렬화된 데이터를 읽어서 자신의 상태를 복구한다.
- 저장했던 객체를 읽어서 출력할 때 만약 readObject()가 기대했던 객체 타입을 반환하지 않는다면
ClassNotFoundException이 발생한다.
ObjectOutputStream에 대한 실습입니다.
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; public class ExampleObjectOutput{ public static void main(String[] args) throws IOException { // 객체 자체를 입출력 하는 ObjectInput/ OutputStream // 입출력 대상 객체에 직렬화가 필요하다. (Serializable 인터페이스 implements) File file = new File("objectData.txt"); if (!file.exists()) { file.createNewFile(); } FileOutputStream out = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(out); // writeObject 메소드를 활용하여 직렬화 대상이 된 객체를 출력한다. // * 직렬화: 멤버변수, 메소드 등 구조화된 객체를 byte[] 형태로 바꾸는 것 // 반드시 Serializable 인터페이스를 구현해야(implements)직렬화의 대상이 된다. oos.writeObject(new Person("AAA", 10)); oos.writeObject(new Person("BBB", 20)); oos.writeObject(new Person("CCC", 30)); // 객체의 출력이 끝나면 맨 마지막에 null을 넣어주자. oos.writeObject(null); oos.close(); System.out.println("프로그램 종료"); } } // 직렬화 인터페이스 구성 // 실제 구현해야 할 (오버라이딩 할) 메소드는 없지만 ObjectInput/OutputStream 에서 // Serializable 인터페이스를 구현 했는지 여부를 판단한다. // ObjectInput / OutputStream을 활용하기 위해서는 객체를 입력 하는쪽, 출력 하는쪽 모두 똑같은 클래스를 사용해야한다. // 보통 웹 통신에는 사용하지 않는다.(로컬 파일에 객체를 저장해 놓고 다시 불러오는 형태로 많이 사용.) class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
ObjectInputStream에 대한 실습입니다.
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class ExampleObjectInput{ public static void main(String[] args) throws IOException, ClassNotFoundException { File file = new File("objectData.txt"); if (file.exists()) { FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); // 역 직렬화: byte[] 형태로 되어있는 객체를 원래의 객체 형태로 바꾸는것 // DeSerializable // Person p1 = (Person) ois.readObject(); // Person p2 = (Person) ois.readObject(); // Person p3 = (Person) ois.readObject(); // System.out.println(p1); // System.out.println(p2); // System.out.println(p3); Person temp = null; while ((temp = (Person) ois.readObject()) != null) { System.out.println(temp); } ois.close(); } else { System.out.println("파일이 없습니다."); } } }
'프로그래밍 > Java' 카테고리의 다른 글
JAVA 요약 목록 (3) | 2017.11.02 |
---|---|
자바 ! 소켓프로그래밍 (Server, Client, Socket, TCP, UDP.Thread, BroadCasting) (0) | 2017.05.21 |
자바 ! 파일 입출력1 (Stream, Buffered) (0) | 2017.05.17 |
자바 ! 동기화 (Synchronization , synchronized) (1) | 2017.05.16 |
자바 ! 쓰레드 ( Thread, Start , Run, Priority ) (0) | 2017.05.15 |