
보조스트림?
다른 스트림과 연결이 되어 여러가지 편리한 기능을 제공해주는 스트림
자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 스트림에 연결해서 입출력을 수행하며, 문자변환, 입출력 성능 향상, 기본타입 입출력등의 기능을 제공
보조스트림 변수 = 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를 읽어왔다.
참고 :
- 혼자 공부하는 자바(신용권), 한빛미디어
'개발 > JAVA' 카테고리의 다른 글
[Spring] @Autowired 의존성주입(DI) 세 가지 방법 - (0) | 2022.11.07 |
---|---|
[Spring] 스프링이란? 왜 레거시에서 spring boot를 쓰게된걸까? (2) | 2022.11.03 |
[Java] 입출력 스트림 (0) | 2022.08.16 |
[Java] 컬렉션 프레임워크 - Map (0) | 2022.08.14 |
[Java] 컬렉션 프레임워크 - List, Set (0) | 2022.08.14 |