본문 바로가기

학원/복기

0425 - java.io 패키지, 입출력 스트림, 파일 입출력

java.io 패키지 : 입력과 출력 관련 클래스가 선언된 패키지 


스트림(Stream)

 : 값을 전달하기 위한 목적으로 생성된 입력클래스와 출력클래스의 객체 
 -> 시냇물이 흐르는 모양을 모델링하여 만들어졌으며, 값이 한쪽 방향으로 전달되며 순차적으로 처리된다.


원시데이터 기반의 스트림(Byte Stream) 

: 가공되지 않은 원시데이터를 전달하기 위한 입출력스트림 
 - 값을 1Byte 단위로 입력 또는 출력하기 위한 스트림 
 - InputStream 클래스와 OutputStream 클래스를 최상위 클래스로 관계가 설정된 클래스

 

입력스트림 또는 출력스트림 관련 메소드 IOException 발생 
   - IOException은 일반 예외이므로 반드시 예외처리 해줘야 한다.  

 

키보드로 원시데이터를 입력받아 모니터에 전달하여 출력하는 프로그램 
 => EOF(End Of File : 입력종료 - Ctrl+Z (MAC : Ctrl+D)) 신호를 입력하면 프로그램 종료
import java.io.IOException;

public class ByteStreamApp {
	public static void main(String[] args) throws IOException { //예외전달
		System.out.println("[메시지]키보드를 눌러 값을 입력해 주세요. [프로그램 종료 : Ctrl+Z]");
        
		//키보드 입력값을 저장하기 위한 변수 
		int readyByte;
		
		while(true) {
			readyByte = System.in.read();
			
			if(readyByte == -1) break;
			
			System.out.write(readyByte);
		}
		System.out.println("[메시지]프로그램을 종료합니다.");
	}
}

 

System.in : Java 프로그램 개발을 위해 기본적으로 제공되는 키보드 입력스트림이 저장된 필드 
- InputStream 클래스를 기반으로 제공되는 입력스트림(객체) 

- 키보드를 누르면 키보드의 문자값이 입력스트림으로 전달된다.


InputStream.read() : 입력스트림에 존재하는 값을 원시데이터(1Byte)로 읽어 정수값(int)을 반환하는 메소드 
- 입력스트림에 값이 없는 경우 스레드는 일시 중지 상태로 전환된다. 
- 입력스트림에 엔터(Enter)가 입력될 경우 스레드가 재실행된다. 

System.out : Java 프로그램 개발을 위해 기본적으로 제공되는 모니터 출력스트림이 저장된 필드 
- OutputStream 클래스를 기반으로 제공되는 입력스트림(객체) - PrintStream 클래스 (자식 클래스  부모보다 기능이 더 많다) 
- 출력스트림에 값을 전달하여 모니터 출력 처리 

 

OutputStream.write(int b) : 매개변수로 제공받은 값을 원시데이터(1Byte)로 출력스트림에 전달하는 메소드 

 

출력예시


문자데이터 기반의 스트림(Character Stream)

 : 원시데이터를 가공처리한 문자데이터를 전달하기 위한 입출력스트림
 - 원시데이터를 가공하여 문자 데이터(2Byte)로 변환시키는데 이를 인코딩이라 한다. 인코딩 처리를 통해 문자형태(캐릭터셋 - CharSet)로 만들어 준다. 
 - 값을 2Byte 단위로 입력 또는 출력하기 위한 스트림이다. 
 - Reader 클래스와 Writer 클래스를 최상위 클래스로 관계가 설정된 클래스이다. 

 

키보드로 문자데이터(2Byte)를 입력받아 모니터에 전달하여 출력하는 프로그램 작성  
=> EOF(End Of File : 입력종료 - Ctrl+Z (MAC : Ctrl+D)) 신호를 입력하면 프로그램 종료
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class CharacterStreamApp {
	public static void main(String[] args) throws IOException {
		System.out.println("[메시지]키보드를 눌러 값을 입력해 주세요. [프로그램 종료 : Ctrl+Z]");

		InputStreamReader in = new InputStreamReader(System.in);
		
		//OutputStreamWriter out = new OutputStreamWriter(System.out);
		PrintWriter out = new PrintWriter(System.out);
		
		int readByte;
		
		while(true) {
			//Reader.read() 
			readByte= in.read();
			
			if(readByte == -1) break;
			//Writer.write(int b)
			out.write(readByte);
			//Writer.flush()
			out.flush();
		}
		System.out.println("[메시지]프로그램을 종료합니다.");
	}
}

 

InputStreamReader 클래스 : InputStream 객체를 전달받아 문자데이터를 입력받기 위한 입력스트림(Reader 객체)를 생성하기 위한 클래스 - 스트림 확장 (1Byte >> 2Byte)

 

OutputStreamWriter 클래스 : OutputStream  객체를 전달받아 문자데이터를 출력받기 위한 출력스트림(Writer 객체)를 생성하기 위한 클래스 - 스트림 확장 (1Byte >> 2Byte) 

PrintWriter 클래스 : OutputStream 객체를 전달받아 문자데이터를 출력하기 위한 출력스트림(Writer 객체)를 생성하기 위한 클래스
 OutputStreamWriter 클래스보다 많은 출력 메소드 제공 (더 효율적)

Reader.read() : 입력스트림에 존재하는 값을 문자데이터(2Byte)로 읽어 정수값(int)으로 반환하는 메소드 

Writer.write(int b) : 매개변수로 제공받은 값을 문자데이터(2Byte)로 출력스트림에 전달하는 메소드
 문자데이터는 출력스트림에 존재하는 버퍼(Buffer : 임시 메모리) 에 일정한 크기만큼 저장하고 한번에 출력스트림으로 전달하여 출력 처리


Writer.flush() : 출력스트림의 버퍼에 존재하는 모든 값을 출력스트림으로 전달하는 메소드 

 

출력예시

 


키보드로 이름과 태어난 년도를 입력받아 이름과 나이를 계산하여 출력하는 프로그램 작성 

Java 프로그램 개발을 위해 기본적으로 제공되는 키보드 입력스트림(System.in)을 전달받아 InputStreamReader 클래스의 입력스트림으로 확장하고, 확장된 Reader 객체를 전달받아 BufferedReader 클래스의 입력스트림으로 확장하여 대량의 문자데이터를 입력받을 수 있는 입력스트림 생성할 수 있다. 

확장의 장점은, 메소드가 많아지기 때문에 더 많은 기능을 제공받을 수 있다는 것이다. 

입출력 관련 클래스는 스트림의 다단계 연결을 사용하여 스트림 확장이 가능하다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;

public class ConsoleIOApp {
	public static void main(String[] args) throws IOException { //예외 전달
		//키보드로 문자열을 입력받기 위한 입력스트림 생성
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		
		//Java 프로그램 개발을 위해 기본적으로 제공되는 모니터 출력스트림(System.out)은
		//PrintStream 클래스로 생성되어 print 또는 println() 메소드를 호출하여 매개변수로
		//전달받은 값을 문자열로 변환하여 출력스트림에 전달해 출력 가능 
		System.out.print("이름 입력 >> ");
		//BufferedReader.readLine() : 대량의 문자데이터를 읽어 문자열로 반환하는 메소드 
		String name = in.readLine();
	
		System.out.print("태어난 년도 입력 >> ");
		//키보드로 입력받은 문자열을 정수값으로 변환하여 저장 - NumberFormatException 발생 
		int birthYear = Integer.parseInt(in.readLine());
		
		int age = Calendar.getInstance().get(Calendar.YEAR)-birthYear+1;
		
		System.out.println("[결과]" + name + "님의 나이는 " + age + "살입니다.");
	}
}

BufferedReader.readLine() : 대량의 문자데이터를 읽어 문자열로 반환하는 메소드 

 

출력결과


파일 입출력

File 클래스 : 파일(디렉토리 - 폴더) 관련 정보를 저장하기 위한 클래스 

값을 저장하기 위한 것이 파일, 파일을 저장하기 위한 것이 디렉토리(=폴더) 이다.

File 클래스의 File(String pathname) 생성자를 이용하여 매개변수로 시스템 (OS - 운영체제)의 파일경로를 전달받아 File 객체 생성 
→  파일경로 : 시스템에 존재하는 파일 위치를 표현하는 방법 - 절대경로 표현방법, 상대경로 표현방법
    - 절대경로 표현방법 : 파일경로를 최상위 디렉토리를 기준으로 파일 위치를 표현하는 방법 (주로 사용) 
    - 상대경로 표현방법 : 현재 실행 프로그램의 작업 디렉토리를 기준으로 파일 위치를 표현하는 방법 

 이클립스에서는 프로젝트 폴더를 작업 디렉토리로 처리 

 

Windows 운영체제에서는 폴더(드라이브)와 파일을 구분하기 위해 \ 기호 사용 
 Java에서는 [ \ ]기호가 회피문자(Escape Character)를 표현하는 용도로 사용되기 때문에, [ \ ] 기호를 문자로 사용하기 위해  [ \\ ] 형태의 회피문자로 표현 

 

import java.io.File;

public class FileApp {
	public static void main(String[] args) {
		File fileOne = new File("c:\\data");
		
		if(fileOne.exists()) {
			System.out.println("c:\\data 폴더가 이미 존재합니다.");
		} else {
			fileOne.mkdir();
			System.out.println("c:\\data 폴더를 생성 하였습니다.");
		}
	}
}

File.exists() : File 객체에 저장된 파일경로의 파일(디렉토리)이 시스템에 존재하지 않을 경우 [false]를 반환하고 존재할 경우 [true]를 반환하는 메소드 
File.mkdir() : File 객체에 저장된 파일경로의 디렉토리(폴더)를 생성하는 메소드

 

Windows 운영체제를 제외한 나머지 운영체제에서는 폴더(드라이브)와 파일을 구분하기 위해 [ / ] 문자를 사용한다.
- Java에서는 파일경로를 표현하기 위한 [ \ ] 문자 대신 [ / ] 문자 사용 가능
import java.io.File;
import java.io.IOException;

public class FileApp {
	public static void main(String[] args) throws IOException {
    	//File fileTwo = new File("c:\\data\\itwill.txt"); 
	File fileTwo = new File("c:/data/itwill.txt");
				
	if(fileTwo.exists()) {
		System.out.println("c:\\data\\itwill.txt 파일이 이미 존재합니다.");
	} else {
		fileTwo.createNewFile();
		System.out.println("c:\\data\\itwill.txt 파일을 생성 하였습니다.");
		}
    }
 }

File.createNewFile() : File 객체에 저장된 파일경로의 파일을 생성하는 메소드 

File 클래스의 File(String parent, String child) 생성자를 이용하여 매개변수로 부모(디렉토리)와 자식(파일)을 구분해서 따로 전달받아 파일 경로가 저장된 File 객체를 생성할 수 있다. 
File fileThree = new File("c:/data","itwill.txt");
		
if(fileThree.exists()) {
	//File.delete() : 파일 객체에 저장된 파일경로의 파일을 삭제하는 메소드 
	fileThree.delete();
	System.out.println("c:\\data\\itwill.txt 파일이 삭제 되었습니다.");
} else {
	System.out.println("c:\\data\\itwill.txt 파일이 존재하지 않습니다.");
}

File.delete() : 파일 객체에 저장된 파일경로의 파일을 삭제하는 메소드 

파일경로를 상대경로 표현방법으로 전달하여 File 객체 생성
=> 현재 프로그램의 작업 디렉토리(프로젝트 폴더)를 기준으로 파일 경로 설정
=> 상대경로 표현방법 : [..]기호를 사용하여 상위 디렉토리를 표현하며 [파일] 형식으로 작업 디렉토리에 존재하는 파일이나 하위 디렉토리를 표현
File fileFour = new File("src");
				
if(fileFour.exists()) {
	//System.out.println("파일경로 = " + fileFour.toString());
	System.out.println("파일경로 = " + fileFour); //참조변수를 출력하면 toString() 메소드는 자동 호출된다.	
	System.out.println("파일경로 = " + fileFour.getAbsolutePath()); 
} else {
	System.out.println("작업폴더에 [src] 폴더가 없습니다.");
}

File.toString() : File 객체에 저장된 파일경로를 문자열로 반환하는 메소드 

File.getAbsolutePath() : File 객체에 저장된 파일경로를 절대경로 표현방법의 문자열로 반환하는 메소드 

File fileFive = new File("c:/");

if(fileFive.isDirectory()) {	
	//File.listFiles() 
	File[] subFiles = fileFive.listFiles();
			
	System.out.println(fileFive + "폴더의 자식 목록 >> ");
	for(File file : subFiles) {
		if(file.isFile()) {
			System.out.println("파일 = " + file);
		} else {
			System.out.println("폴더 = " + file);
		}
	}
}

File.isDirectory() : File 객체에 저장된 파일경로의 파일이 디렉토리가 아닌 경우 [false]를 반환하고 디렉토리인 경우 [true]를 반환하는 메소드 

File.listFiles() : File 객체에 저장된 파일경로의 디렉토리의 파일이나 하위 디렉토리 목록을 File 객체 배열로 반환하는 메소드 

File.isFile() : File 객체에 저장된 파일경로의 파일이 일반파일이 아닌 경우 [false]를 반환하고 일반파일인 경우 [true]를 반환하는 메소드 


FileOutputStream 클래스 : 파일에 원시데이터를 전달하기 위한 출력스트림을 생성하기 위한 클래스

→ FileOutputStream 클래스의 FileOutputStream(String name) 생성자를 이용하여 매개변수로 파일경로를 전달받아 파일 출력스트림 생성
 매개변수로 전달받은 파일경로의 파일이 없는 경우 FileNotFoundException 발생
 예외처리를 하지 않고 예외를 전달할 경우 매개변수로 전달받은 파일경로의 파일을 자동으로 생성하여 출력스트림 제공
 매개변수로 전달받은 파일경로의 파일이 있는 경우 기존 파일의 내용 대신 새로운 내용이 파일에 저장 - 덮어씌우기(OverWrite)

키보드로 입력된 값을 원시데이터로 제공받아 파일로 전달하여 저장하는 프로그램 작성
=> EOF(End Of File : 입력종료 - Ctrl+Z (MAC : Ctrl+D)) 신호를 입력하면 프로그램 종료
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamApp {
	public static void main(String[] args) throws IOException {
		System.out.println("[메세지]키보드를 눌러 값을 입력해 주세요.[프로그램 종료 : Ctrl+Z]");
		
		//FileOutputStream out=new FileOutputStream("c:/data/byte.txt");

		//FileOutputStream 클래스의 FileOutputStream 생성자를 이용하여 매개변수로 파일경로와 내용 추가에 
        //대한 상태값을 전달받아 파일 출력스트림 생성
		// => false : 파일 내용 덮어씌우기(기본), true : 파일 내용 이어쓰기 
		FileOutputStream out=new FileOutputStream("c:/data/byte.txt",true);
		
		//키보드 입력값을 저장하기 위한 변수 
		int readByte;
		
		while(true) {
			//키보드 입력스트림에 존재하는 입력값을 원시데이터로 반환받아 저장
			readByte=System.in.read();
			
			//입력종료신호(Ctrl+Z : EOF)가 전달된 경우 반복문 종료 
			if(readByte==-1) break;
			
			//파일 출력스트림으로 원시데이터를 전달하여 저장 - SAVE
			out.write(readByte);
		}
		
		//FileOutputStream.close() : 파일 출력스트림을 제거하는 메소드
		// => 파일에는 입력스트림과 출력스트림을 하나씩만 생성 가능하기 때문 
		out.close();
		
		System.out.println("c:\\data\\byte.txt 파일을 확인해 보세요.");
	}
}

 

FileOutputStream 클래스의 FileOutputStream(String name, boolean append) 생성자를 이용하여 매개변수로 파일경로와 내용 추가에 대한 상태값을 전달받아 파일 출력스트림 생성할 수 있다.  false : 파일 내용 덮어씌우기(기본), true : 파일 내용 이어쓰기 

FileOutputStream.close() : 파일 출력스트림을 제거하는 메소드
 파일에는 입력스트림과 출력스트림을 하나씩만 생성 가능하기 때문에 제거해준다.

 

FileInputStream 클래스 : 파일에 저장된 값을 원시데이터로 제공받기 위한 입력스트림을 생성하기 위한 클래스 

파일에 저장된 값을 원시데이터로 읽어 모니터에 전달하여 출력하는 프로그램 작성
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamApp {
	public static void main(String[] args) throws IOException {
		FileInputStream in = null;
		try {
			//FileInputStream 클래스의 FileInputStream(String name) 생성자를 이용하여 매개변수로 
			//파일경로를 제공받아 파일 입력스트림을 생성
			// => 매개변수로 전달받은 파일경로의 파일이 없는 경우 FileNotFoundException 발생 
			// => 파일이 없으면 파일 입력스트림을 생성할 수 없으므로 반드시 예외처리 
			in = new FileInputStream("c:/data/byte.txt");
		} catch (FileNotFoundException e) {
			System.out.println("[에러]c:\\data\\byte.txt 파일을 찾을 수 없습니다.");
			System.exit(0);
		}
		
		System.out.println("[메시지] c:\\data\\byte.txt 파일에 저장된 내용입니다.");
		
		int readByte;
		
		while(true) {
			//파일 입력스트림을 이용하여 파일에 저장된 값을 원시데이터로 반환받아 저장 
			readByte = in.read();
			
			//파일 입력스트림으로 제공받을 파일 내용이 없는 경우 반복문 종료 
			if(readByte == -1) break;
			
			//원시데이터를 모니터 출력스트림으로 전달하여 출력 
			System.out.write(readByte);
		}
		
		//FileInputStream.close() : 파일 입력스트림을 제거하는 메소드 
		in.close();
	}
}

FileWriter 클래스 : 파일에 문자데이터를 전달하기 위한 출력스트림을 생성하기 위한 클래스

 FileWriter 클래스의 FileWriter(String name) 생성자를 이용하여  매개변수로 파일경로를 전달받아 파일 출력스트림 생성
 매개변수로 전달받은 파일경로의 파일이 없는 경우 FileNotFoundException 발생
 예외처리를 하지 않고 예외를 전달할 경우 매개변수로 전달받은 파일경로의 파일을 자동으로 생성하여 출력스트림 제공
→ 매개변수로 전달받은 파일경로의 파일이 있는 경우 기존 파일의 내용 대신 새로운 내용이 파일에 저장 - 덮어씌우기(OverWrite)

키보드로 입력된 값을 문자데이터로 제공받아 파일로 전달하여 저장하는 프로그램 작성
=> EOF(End Of File : 입력종료 - Ctrl+Z) 신호를 입력하면 프로그램 종료
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class FileWriterApp {
	public static void main(String[] args) throws IOException {
		System.out.println("[메세지]키보드를 눌러 값을 입력해 주세요.[프로그램 종료 : Ctrl+Z]");

		//키보드 입력스트림을 InputStreamReader 클래스의 입력스트림으로 확장
		// => 원시데이타가 아닌 문자데이타를 입력받기 위한 입력스트림
		InputStreamReader in=new InputStreamReader(System.in);
		
		//FileWriter out=new FileWriter("c:/data/char.txt");
		FileWriter out=new FileWriter("c:/data/char.txt",true);
		
		int readByte;
		
		while(true) {
			readByte=in.read();
			
			if(readByte==-1) break;
			
			out.write(readByte);
		}
		
		//FileWriter.close() : 파일 출력스트림을 제거하는 메소드
		out.close();
	
		System.out.println("c:\\data\\char.txt 파일을 확인해 보세요.");
	}
}

 

 

FileReader 클래스 : 파일에 저장된 값을 문자데이터를 제공받기 위한 입력스트림을 생성하기 위한 클래스

파일에 저장된 값을 문자데이터로 제공받아 모니터에 전달하여 출력하는 프로그램 작성
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class FileReaderApp {
	public static void main(String[] args) throws IOException {
		FileReader in=null;
		try {
			//FileReader 클래스의 FileReader(String name) 생성자를 이용하여 매개변수로
			//파일경로를 제공받아 파일 입력스트림을 생성
			// => 매개변수로 전달받은 파일경로의 파일이 없는 경우 FileNotFoundException 발생
			// => 파일이 없으면 파일 입력스트림을 생성할 수 없으므로 반드시 예외처리
			in=new FileReader("c:/data/char.txt");
		} catch (FileNotFoundException e) {
			System.out.println("[에러]c:\\data\\char.txt 파일을 찾을 수 없습니다.");
			System.exit(0);
		}
		
		//OutputStreamWriter out=new OutputStreamWriter(System.out);
        //>> PrintWriter가 더 기능이 많음 
		PrintWriter out=new PrintWriter(System.out);
		
		System.out.println("[메세지]c:\\data\\char.txt 파일에 저장된 내용입니다.");
		
		int readByte;
		
		while(true) {
			readByte=in.read();
			
			if(readByte==-1) break;
			
			out.write(readByte);
			out.flush();
		}
		
		//FileReader.close() : 파일 입력스트림을 제거하는 메소드
		in.close();
	}
}

보조 스트림 클래스 : 기존 스트림을 전달받아 기능을 확장하기 위한 스트림 클래스 

BufferedInputStream, BufferedOutStream, DataInputStream, DataOutputStream 등이 존재   

BufferedInputStream 클래스 : InputStream 객체를 전달받아 대량의 원시데이터를 읽기 위한 입력스트림을 생성하기 위한 클래스
BufferedOutputStream 클래스 : OutputStream 객체를 전달받아 대량의 원시데이터를 전달하기위한 출력스트림을 생성하기 위한 클래스

원본파일에 저장된 값을 원시데이터로 읽어 타겟파일에 전달하여 저장하는 프로그램 작성 - 파일 복사 프로그램
→ 모든 형식의 원본파일을 복사하여 타겟파일로 전달하여 저장 가능
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyByteApp {
	public static void main(String[] args) throws IOException {
		BufferedInputStream in = null;
        
		BufferedOutputStream out = null;
		
		try {
			//원본파일의 값을 원시데이터로 읽기 위한 입력스트림을 생성하여 전달 
			in = new BufferedInputStream(new FileInputStream("c:/data/bandizip.exe"));
			
			//타겟파일에 원시데이터를 전달하여 저장하기 위한 출력스트림을 생성하여 저장 
			out = new BufferedOutputStream(new FileOutputStream("c:/data/bandizip_byte.exe"));
			
			int readByte;
			
			//원본파일의 값을 원시데이터로 읽어 타겟파일로 전달하는 반복문 - 파일내용 복사 
			while(true) {
				readByte = in.read();
				if(readByte == -1) break;
				out.write(readByte);
			}
			System.out.println("[메시지]파일을 성공적으로 복사 하였습니다.");
		} catch (FileNotFoundException e) {
			System.out.println("[에러]원본파일을 찾을 수 없습니다.");
		} finally {
			in.close();
			out.close();
		}
		
	}
}

 

BufferedReader 클래스 : Reader 객체를 전달받아 대량의 문자데이터를 읽기 위한 입력스트림을 생성하기 위한 클래스 
BufferedWriter 클래스 : Reader 객체를 전달받아 대량의 문자데이터를 전달하기 위한 입력스트림을 생성하기 위한 클래스

원본파일에 저장된 값을 문자데이터로 읽어 타겟파일에 전달하여 저장하는 프로그램 작성 - 파일 복사 프로그램
→ 텍스트 형식의 원본 파일(문서파일)을 복사하여 타겟파일로 전달하여 저장 가능
→ 텍스트 형식의 파일을 제외한 원본파일(이진파일 - Binary File)은 값에 대한 인코딩 처리에 의해 타겟파일에 변경된 값이 전달되어 저장
package xyz.itwill.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopyCharApp {
	public static void main(String[] args) throws IOException {
		
		//BufferedReader 클래스 : Reader 객체를 전달받아 대량의 문자데이터를 읽기 
		//위한 입력스트림을 생성하기 위한 클래스
		BufferedReader in = null;
		
		//BufferedWriter 클래스 : Reader 객체를 전달받아 대량의 문자데이터를 전달하기
		//위한 입력스트림을 생성하기 위한 클래스
		BufferedWriter out = null;
		
		try {
			in = new BufferedReader(new FileReader("c:/data/bandizip.exe"));
			
			out = new BufferedWriter(new FileWriter("c:/data/bandizip_char.exe"));
			
			int readByte;
			while(true) {
				//순수한 원시데이터가 없어지고 인코딩 처리된 문자데이터로 변형 
				// >> 복사한 후, 가공된 데이터로 저장되기 때문에 두 파일은 전혀 다른 파일이 된다. 
				readByte = in.read();
				if(readByte == -1) break;
				out.write(readByte);
			}
			System.out.println("[메시지]파일을 성공적으로 복사 하였습니다.");
		
		} catch (FileNotFoundException e) {
			System.out.println("[에러]원본파일을 찾을 수 없습니다.");
		} finally {
			in.close();
			out.close();
		}	
					
	}
}

DataOutputStream 클래스 

: OutputStream 객체를 전달받아 원하는 자료형의 값을 원시데이터 형태로 전달하기 위한 기능의  출력스트림을 생성하기 위한 클래스 

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputStreamApp {
	public static void main(String[] args) throws IOException {
		DataOutputStream out = new DataOutputStream(new FileOutputStream("c:/data/data.txt"));
		
		//DataOutputStream.writeInt(int v) : 매개변수로 정수값을 전달받아 원시데이터로 변환
		//하여 출력스트림으로 전달하는 메소드 
		out.writeInt(100);
		
		//DataOutputStream.writeBoolean(boolean v) : 매개변수로 논리값을 전달받아 원시데이터로 변환
		//하여 출력스트림으로 전달하는 메소드 
		out.writeBoolean(true);
		
		//DataOutputStream.writeUTF(String v) : 매개변수로 문자열을 전달받아 원시데이터로 변환
		//하여 출력스트림으로 전달하는 메소드 
		out.writeUTF("홍길동");
		
		out.close();
		
		System.out.println("c:\\data\\data.txt 파일을 확인해 보세요.");
		
		//메모장은 문자데이터를 읽기 때문에 문자값이 아닌 다른 값들은 다 깨져보인다..
	}
}

 

DataInputStream 클래스 : InputStream 객체를 전달받아 원시데이터를 원하는 자료형의 값으로 변환하여 제공하기 위한 기능의 입력스트림을 생성하기 위한 클래스 

→ 반드시 파일에 저장된 자료형의 순서대로 값을 읽어서 사용해야 한다 

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataInputStreamApp {
	public static void main(String[] args) throws IOException {
		DataInputStream in = new DataInputStream(new FileInputStream("c:/data/data.txt"));

		//DataInputStream.readInt() : 입력스트림으로 원시데이터를 읽어 정수값으로 반환하는 메소드 
		int value1 = in.readInt();
		
		//DataInputStream.readBoolean() : 입력스트림으로 원시데이터를 읽어 논리값으로 반환하는 메소드 
		boolean value2 = in.readBoolean();
		
		//DataInputStream.readUTF() : 입력스트림으로 원시데이터를 읽어 문자열으로 반환하는 메소드 
		String value3 = in.readUTF();
		
		System.out.println("value1 = " + value1);
		System.out.println("value2 = " + value2);
		System.out.println("value3 = " + value3);
		
		in.close();
	}
}

ObjectOutputStream 클래스 : OutputStream 객체를 전달받아 Java 객체를 원시데이터로 전달하는 출력스트림을 생성하기 위한 클래스 

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Date;

public class ObjectOutputStreamApp {
	public static void main(String[] args) throws FileNotFoundException, IOException {
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:/data/object.txt"));
		
		//ObjectOutputStream.writeObject(Object o) : 매개변수로 전달받은 객체를 원시데이터로
		//변환하여 출력스트림으로 전달하는 메소드 
		out.writeObject("홍길동");//String 객체
		out.writeObject(new Date()); //Date 객체
		out.writeObject(Arrays.asList("임꺽정","전우치","일지매","장길산")); //List 객체 
		
		out.close();
		
		System.out.println("c:\\data\\object.txt 파일을 확인해 보세요.");
	}
}
}

ObjectInputStream 클래스 : InputStream 객체를 전달받아 원시데이터를 Java 객체로 제공받기 위한 입력스트림을 생성하기 위한 클래스 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Date;
import java.util.List;

public class ObjectInputStreamApp {
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("c:/data/object.txt"));
		
		//ObjectInputStream.readObject() : 입력스트림으로 원시데이터를 제공받아 Java 객체로
		//변환하여 반환하는 메소드
		// => Object 타입의 객체로 반환되므로 반드시 명시적 객체 형변환 사용 
		// => 반환되는 객체에 대한 클래스가 없는 경우 ClassNotFoundException 발생 
		String string = (String)in.readObject();
		Date date = (Date)in.readObject();
		@SuppressWarnings("unchecked")
		List<String> list = (List<String>)in.readObject();
		
		System.out.println("string = " + string);
		System.out.println("date = " + date);
		System.out.println("list = " + list);
		
		in.close();
	}
}

 

객체 단위로 주고 받을 수 있기 때문에, ObjectOutputStream,ObjectInputStream 을 가장 많이 사용한다