profile image

L o a d i n g . . .

article thumbnail image
Published 2022. 8. 20. 22:37

보조스트림?

다른 스트림과 연결이 되어 여러가지 편리한 기능을 제공해주는 스트림

자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 스트림에 연결해서 입출력을 수행하며, 문자변환, 입출력 성능 향상, 기본타입 입출력등의 기능을 제공

 

 

보조스트림 변수 = new 보조스트림(연결스트림);

 

 

Input Stream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);

보조 스트림 생성자 매개값은 또 다른 보조스트림이 될 수 있다 => 보조 스트림 연속 연결이 가능

 

 

 

 

 

 


문자 변환 보조스트림

package a220816;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class CharConvertStreamEx {
	public static void main(String[] args) throws IOException {
		write("문자 변환 스트림을 사용합니다");
		String data = read();
		System.out.println(data);
	}

	private static void write(String str) throws IOException {
		FileOutputStream fos = new FileOutputStream("C:/Temp/test1.txt");
		Writer writer = new OutputStreamWriter(fos);
		writer.write(str);
		writer.flush();
		writer.close();
	}
	
	private static String read() throws IOException {
		FileInputStream fis = new FileInputStream("C:/Temp/test1.txt");
		Reader reader = new InputStreamReader(fis);
		char[] buffer = new char[100];
		int readCharNum = reader.read(buffer);
		reader.close();
		String data = new String(buffer, 0, readCharNum);
		return data;
	}
}

파일로 문자를 저장 후 저장된 문자를 다시 읽는다.

이 때 FileI/OputStream대신 Writer와 Reader로 변환하여 입출력을 시행한다.

 

 

 

 

 

 

 

 

 

 

 

 


성능 향상 보조 스트림

프로그램 실행 성능은 입출력이 가장 늦은 장치를 따라간다. 이 문제에 대한 완전한 해결책은 아니지만 프로그램이 입출력 소스와 직접 작업하지않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있다.

예를들어 CPU와 메모리가 아무리 뛰어나도 하드디스크의 입출력이 늦어질 때 프로그램은 직접 하드디스크에 데이터를 보내지않고 메모리버퍼에 데이터를 보낸다. 버퍼는 데이터가 쌓이길 기다렸다 꽉 차게되면 데이터를 한꺼번에 하드디스크로 보냄으로써 출력 횟수를 줄여준다

 

기본적으로 출력 스트림은 내부에 작은 버퍼를 갖고있으나 불충분하다. 보조스트림 중 메모리 버퍼를 추가로 제공하여 실행성능을 향상시키는 것들을 사용해준다

 

 

 


BufferedOutputStream | BufferedWriter

BufferedOutputStream은 바이트 기반 출력 스트림 | BufferedWriter은 문자 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림

 

 

 

package a220816;

import java.io.*;

public class ReadLineEx {
	public static void main(String[] args) throws Exception {
		Reader reader = new FileReader("C:/Temp/language.txt");
		
		BufferedReader br = new BufferedReader(reader);
		
		while (true) {
			String data = br.readLine();
			if (data == null) {break;};
			System.out.println(data);
		}
		br.close();
	}
}

 

 

 

 

 

 

 


객체 입출력 보조 스트림

 

package a220816;

import java.io.Serializable;
import java.util.Date;

public class Board implements Serializable{
	private int bno;
	private String title;
	private String content;
	private String writer;
	private Date date;
	
	public Board(int bno, String title, String content, String writer, Date date) {
		super();
		this.bno = bno;
		this.title = title;
		this.content = content;
		this.writer = writer;
		this.date = date;
	}

	public int getBno() {
		return bno;
	}

	public void setBno(int bno) {
		this.bno = bno;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
	
}

JVM 직렬화 사용을 위해 vo에 serializable 구현

 

 

package a220816;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ObjectStreamEx {
	public static void main(String[] args) throws Exception {
		writeList();
		List<Board> list = readList();
		
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		for(Board board : list ) {
			System.out.println(
				board.getBno() + "\t" + board.getTitle() + "\t" + board.getContent() 
				+ "\t" + board.getWriter() + "\t" + dateFormat.format(board.getDate())  
			);
		}
	}
	
	public static void writeList() throws Exception {
		List<Board> list = new ArrayList<Board>();
		
		list.add(new Board(1, "제목1", "내용입니다", "홍길동", new Date()));
		list.add(new Board(2, "제목2", "내용입니다", "윤봉길", new Date()));
		list.add(new Board(3, "제목3", "내용입니다", "장산복", new Date()));
		
		FileOutputStream fos = new FileOutputStream("C:/Temp/board.db");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(list);
		oos.flush();
		oos.close();
	}
	
	public static List<Board> readList() throws Exception {
		FileInputStream fis = new FileInputStream("C:/Temp/board.db");
		ObjectInputStream ois = new ObjectInputStream(fis);
		List<Board> list = (List<Board>)ois.readObject();
		return list;
	}
}

List컬렉션을 저장 후 객체 출력스트림 OjbectOutputStream을 이용해 list를 출력하고 ObjectInputStream을 통해 list를 읽어왔다.

 

 

 

 

 

참고 :

- 혼자 공부하는 자바(신용권), 한빛미디어

반응형
복사했습니다!