티스토리 뷰

파일 입출력은 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("파일이 없습니다.");
		}
	}
}
반응형
LIST
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함