티스토리 뷰
파일 입출력은 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 |
