고래씌

[JAVA] 13-3. 입출력(IO) (보조스트림) 본문

JAVA/JAVA 기초

[JAVA] 13-3. 입출력(IO) (보조스트림)

고래씌 2023. 10. 23. 16:42

1. 보조스트림

: 기반스트림(외부매체와 직접 연결할 수 있는 기능)의 부족한 기능들을 확장시킬 수 있도록 도와주는 스트림

 
보조스트림은 단독으로는 사용할 수가 없음 == 단독으로 객체생성이 불가




[표현법]
보조스트림 변수명 = new 보조스트림( 기반스트림객체(필수) );

BufferedXXX : ★속도 성능 향상 목적의 보조 스트림
=> Buffer라는 저장공간을 제공해서 입출력때 필요한 데이터를 한번에 모아뒀다가 한꺼번에 입출력 진행
 
 

1) 보조스트림을 활용한 파일 저장 메소드(속도 성능 향상 목적)

■ FileWriter (기반스트림) / BufferedWriter(보조스트림)
① 기반스트림 객체 생성
- 기반스트림이 Reader / Writer 계열이면 보조스트림도 Reader / Writer 계열
- 기반스트림이 Input / Ouput 계열이면 보조스트림도 Input / Output 계열

package com.kh.chap04_assist.model.dao;

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 BufferedDao {
	
	// 프로그램 --> 파일(외부매체)
	public void fileSave() {
		
		// 1) 기반스트림 객체 생성
		
		FileWriter fw = new FileWriter("c_buffer.txt");
    }
}

 
② 보조스트림 객체 생성
참조변수.newLine();  => 개행을 넣어주는 메소드

package com.kh.chap04_assist.model.dao;

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 BufferedDao {
	
	// 프로그램 --> 파일(외부매체)
	public void fileSave() {
		
		// 2) 보조스트림 객체 생성
		BufferedWriter bw = null;
		
		try {
			bw = new BufferedWriter(new FileWriter("c_buffer.txt"));   // 굳이 변수 저장해서 안해도 됨
			
			bw.write("안녕하세요");
			bw.newLine(); // 개행을 넣어주는 메소드
			bw.write("반갑습니다 \n");
			bw.write("저리가세요");
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bw.close();    // 기반스트림이 보조스트림과 함께 닫히기 때문에 문제없음
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 
③ try ~ with ~ resource 구문.(자원의 자동 반납)
try(스트림객체 생성; 스트림객체 생성;) {
     예외가 발생할 수 있는 구문
} catch(예외클래스명 e) {
     예외 발생시 실행할 구문
}

스트림자원을 try의 매개변수로 넣어버리면 스트림객체 생성후 직접 자원을 반납하지 않아도, try블록의 구문실행 완료 후 자동으로 자원이 반납된다.
 

package com.kh.chap04_assist.model.dao;

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 BufferedDao {
	
	// 프로그램 --> 파일(외부매체)
	public void fileSave() {
		
		try(BufferedWriter bw = new BufferedWriter(new FileWriter("c_buffer.txt"))) {
			
			bw.write("안녕하세요");
			bw.newLine(); // 개행을 넣어주는 메소드
			bw.write("반갑습니다 \n");
			bw.write("저리가세요");
			
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
}

 
 
■ FileReader(기반스트림) / BufferedReader(보조스트림)
- 참조변수.read()   => 한글자씩 출력
- 참조변수.readLine()  => 한 줄씩 출력

	public void fileRead() {
		
		//FileReader
		//BufferedReader
		
		try(BufferedReader br = new BufferedReader(new FileReader("c_buffer.txt"))) {
			String value = null;
			while((value = br.readLine()) != null) {
				System.out.println(value);
			}
			  // read() => 한글자씩 출력 / readLine() => 한 줄씩 출력
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

2) 객체단위로 입출력 할수 있는 기능을 제공하는 보조스트림

- 객체를 파일에 출력하고자할 때 필요한 스트림
■ ObjectOutputStream : 객체단위로 출력할 수 있는 "보조"스트림
■ FileOutputStream   : 파일에 데이터를 출력하는 기반스트림
 
☞ 객체를 직렬화 할 수 있는 Serializable
  객체 입출력스트림에서 사용되어질 객체는 반드시 Serializable을 구현해야한다!!

package com.kh.chap05_assist2.model.vo;

import java.io.Serializable;

/*
 * 객체를 직렬화 할 수 있는 Serializable
 * 
 * 객체 입출력스트림에서 사용되어질 객체는 반드시 Serializable을 구현해야한다!!
 */

public class Phone implements Serializable{

	// 클래스별 식별번호(고유번호)
	private static final long serialVersionUID = 1L;
	
	//transient : 객체 입출력시 해당값은 전송하지 않게 하는 예약어
	
	private String number;
	private String name;
	private transient int price;      // phone.txt 파일에는 price 내용을 안넣음
	
	public Phone() {
		
	}

	public Phone(String number, String name, int price) {
		super();
		this.number = number;
		this.name = name;
		this.price = price;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Phone [number=" + number + ", name=" + name + ", price=" + price + "]";
	}
	
}
package com.kh.chap05_assist2.model.dao;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.kh.chap05_assist2.model.vo.Phone;

public class ObjectDao {

	public void fileSave(String fileName) {
		
		Phone ph = new Phone("010-1234-1234", "갤럭시 S20", 200);
		
		// 객체를 파일에 출력하고자할 때 필요한 스트림
		// ObjectOutputStream : 객체단위로 출력할 수 있는 "보조"스트림
		// FileOutputStream   : 파일에 데이터를 출력하는 기반스트림
		
		try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
			oos.writeObject(ph);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

 
 
- 객체를 파일로부터 읽어들이고자할 때 필요한 스트림
■ FileInputStream : 파일로부터 데이터를 1byte로 읽어들이는 기반스트림
ObjectInputStream : 스트림으로부터 객체단위로 입력 받기 위해 사용되는 보조스트림

	public void fileRead() {
		
		// FileInputStream : 파일로부터 데이터를 1byte로 읽어들이는 기반스트림
		// ObjectInputStream : 스트림으로부터 객체단위로 입력 받기 위해 사용되는 보조스트림
		
		try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("phone.txt"))) {
			Phone ph = (Phone)ois.readObject();   // 강제형변환
			System.out.println(ph);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

 
 

3) 기본자료형 + 문자열값을 출력하는 기능을 제공하는 보조스트림

■ DataOutputStream  보조스트림  : 기본자료형 + 문자열값을 출력할 수 있도록 도와주는 보조스트림
FileOutputStream  기반스트림 

package com.kh.chap06_Data.run;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataRun {

	public static void main(String[] args) {
		DataRun dr = new DataRun();
//		dr.test1();
		test2();
		
	}
	
	public void test1() {
		
		// DataOutputStream  보조스트림  : 기본자료형 + 문자열값을 출력할 수 있도록 도와주는 보조스트림
		// FileOutputStream  기반스트림  : 
		
//		File f = new File("sample.dat");
//		try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(f))) {
		
		try(DataOutputStream dos = new DataOutputStream(new FileOutputStream("sample.dat"))) {
			
			// 자바의 기본자료형별로 작성기능 지원
			dos.writeBoolean(true);
			dos.writeInt(3000);
			dos.writeDouble(3.14);
			dos.writeChar('안');
			dos.writeChar('녕');
			dos.writeUTF("자바자바자바");
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("작업종료");
	}


}

 
 
 
■ DataInputStream  보조스트림 
 FileInputStream  기반스트림 
 
☞ 씌어진 자료형 순서대로 정확하게 읽어와야함!!
☞ 내가 저장한 자료형과 일치하게 읽어들어야함

	public static void test2() {
		File f = new File("sample.dat");
		
		try(DataInputStream dis = new DataInputStream(new FileInputStream(f))) {
			
			// 씌어진 자료형 순서대로 정확하게 읽어올 것. 
			System.out.println(dis.readBoolean());   // 내가 저장한 자료형과 일치하게 읽어들여야함
			System.out.println(dis.readInt());
			System.out.println(dis.readDouble());
			System.out.println(dis.readChar());
			System.out.println(dis.readChar());
			System.out.println(dis.readUTF());
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}