728x90
반응형
보조스트림
문자 변환 보조 스트림
package chapter14.sec02.exam01;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
// 다음 예제는 파일ㄹ로 문자를 저장하고, 저장된 문자를 다시 읽어주는 자바 프로그램입니다.
// 사용하는 소스 스트림은 바이트 기반 FileOutStream과 FileInputStream 입니다.
// 하지만, 이들 스트림을 직접 사용하지 않고, 각각 Writer 와 Reader로 변환해서
// 입출력 처리를 합니다. 즉, 문자 변환 보조 스트림을 사용해 봅니다.
public class CharacterConvertStreamExample {
public static void main(String[] args) throws Exception {
write("문자 변환 스트림을 사용합니다.");
// String data = read();
// System.out.println(data);
}
public static void write(String str) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/Temp/Test11.txt");
// 위에 FileOutStream에 OutputStreamWriter 보조 스트림을 연결합니다.
Writer writer = new OutputStreamWriter(fos);
// OutputStreamWriter 보조 스트림을 이용해서 문자 출력처리를 합니다.
writer.write(str);
writer.flush();
writer.close();
}
}
read 출력하기
package chapter14.sec02.exam01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
// 다음 예제는 파일ㄹ로 문자를 저장하고, 저장된 문자를 다시 읽어주는 자바 프로그램입니다.
// 사용하는 소스 스트림은 바이트 기반 FileOutStream과 FileInputStream 입니다.
// 하지만, 이들 스트림을 직접 사용하지 않고, 각각 Writer 와 Reader로 변환해서
// 입출력 처리를 합니다. 즉, 문자 변환 보조 스트림을 사용해 봅니다.
public class CharacterConvertStreamExample {
public static void main(String[] args) throws Exception {
write("문자 변환 스트림을 사용합니다.");
String data = read();
System.out.println(data);
}
private static String read() throws Exception {
// FileInputStream에 InputStreamReader 보조 스트림을 연결처리합니다.
FileInputStream fis = new FileInputStream("C:/Temp/Test11.txt");
Reader reader = new InputStreamReader(fis);
char[] buffer = new char[100];
// InputStreamReader 보조스트림을 이용해서 문자를 입력처리합니다.
int readCharNum = reader.read(buffer);
reader.close();
// char 배열에서 읽은 수만큼 문자열로 변환 처리를 합니다.
String data = new String(buffer, 0, readCharNum);
return data;
}
public static void write(String str) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/Temp/Test11.txt");
// 위에 FileOutStream에 OutputStreamWriter 보조 스트림을 연결합니다.
Writer writer = new OutputStreamWriter(fos);
// OutputStreamWriter 보조 스트림을 이용해서 문자 출력처리를 합니다.
writer.write(str);
writer.flush();
writer.close();
}
}
파일에도 기록이 되고 console에도 출력이된다.
파일 복사 성능 테스트
nonBuffer
package chapter14.sec02.exam02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.OutputStream;
// 다음 예제는 성능 향상 보조 스트림(BufferedInputStream, BufferOutputStream)을
// 사용했을 때와 사용하지 않았을 때의 파일 복사 실행 성능 차이를 보여줍니다.
// 실행 결과를 보면 보조스트림을 사용했을 때, 훨씬 성능이 좋아지는 것을 알 수 있습니다.
// 파일 복사 성능 테스트를 구현하는 NonBufferVSBufferExample 실행 클래스를 코딩합니다.
public class NonBufferVSBufferExample {
public static void main(String[] args) throws Exception {
// 기본 스트림을 생성하고, 활용하여 파일 복사 성능 테스트를 구현해 봅니다.
String originalFilePath1 = NonBufferVSBufferExample.class.getResource("originalFile1.jpg").getPath();
String targetFilePath1 = "C:/Temp/targetFile1.jpg";
FileInputStream fis = new FileInputStream(originalFilePath1);
FileOutputStream fos = new FileOutputStream(targetFilePath1);
// FileInputStream, FileOutputStream을 이용한 파일 복사 시간을 측정합니다.
long nonBufferTime = copy(fis,fos);
System.out.println(" 버퍼를 사용하지 않았을 때 : " + nonBufferTime+ "ns");
}
// 초기화
static int data = -1;
private static long copy(java.io.InputStream is, java.io.OutputStream os) throws Exception {
long start = System.nanoTime(); // 시작 시간을 start 변수에 저장합니다.
// 파일 복사: 원본 파일에서 읽은 1byte를 타깃 파일로 바로 출력 처리합니다.
while (true) {
data = is.read();
if(data == -1) {
break;
}
os.write(data); // 대상 파일을 Temp 폴더안에 타깃 파일로 기록합니다.
}
os.flush();
long end = System.nanoTime(); // 종료시간을 end 변수에 저장합니다.
return (end-start); // (end-start) : 파일 복사에 걸린 시간을 리턴
}
}
Buffer
Buffer를 사용하면 출력시간이 빨라진것을 볼 수있다.
package chapter14.sec02.exam02;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.OutputStream;
// 다음 예제는 성능 향상 보조 스트림(BufferedInputStream, BufferOutputStream)을
// 사용했을 때와 사용하지 않았을 때의 파일 복사 실행 성능 차이를 보여줍니다.
// 실행 결과를 보면 보조스트림을 사용했을 때, 훨씬 성능이 좋아지는 것을 알 수 있습니다.
// 파일 복사 성능 테스트를 구현하는 NonBufferVSBufferExample 실행 클래스를 코딩합니다.
public class NonBufferVSBufferExample {
public static void main(String[] args) throws Exception {
// 기본 스트림을 생성하고, 활용하여 파일 복사 성능 테스트를 구현해 봅니다.
String originalFilePath1 = NonBufferVSBufferExample.class.getResource("originalFile1.jpg").getPath();
String targetFilePath1 = "C:/Temp/targetFile1.jpg";
FileInputStream fis = new FileInputStream(originalFilePath1);
FileOutputStream fos = new FileOutputStream(targetFilePath1);
// FileInputStream, FileOutputStream을 이용한 파일 복사 시간을 측정합니다.
long nonBufferTime = copy(fis,fos);
System.out.println(" 버퍼를 사용하지 않았을 때 : " + nonBufferTime+ "ns");
// 앞서, 기본 스트림 생성과 같은 방법으로 기본 스트링 생성 후에
// 버퍼 보조 스트림을 연결하여 파일 복사를 처리하는 예시입니다.
String originalFilePath2 = NonBufferVSBufferExample.class.getResource("originalFile2.jpg").getPath();
String targetFilePath2 = "C:/Temp/targetFile2.jpg";
FileInputStream fis2 = new FileInputStream(originalFilePath2);
FileOutputStream fos2 = new FileOutputStream(targetFilePath2);
// Buffer 추가
BufferedInputStream bis = new BufferedInputStream(fis2);
BufferedOutputStream bos = new BufferedOutputStream(fos2);
// BufferInputStream, BufferOutputStream을 이용한 파일 복사 시간을 측정합니다.
long bufferTime = copy(bis,bos);
System.out.println(" 버퍼를 사용하지 않았을 때 : " + bufferTime+ "ns");
fis.close();
fos.close();
}
// 초기화
static int data = -1;
private static long copy(java.io.InputStream is, java.io.OutputStream os) throws Exception {
long start = System.nanoTime(); // 시작 시간을 start 변수에 저장합니다.
// 파일 복사: 원본 파일에서 읽은 1byte를 타깃 파일로 바로 출력 처리합니다.
while (true) {
data = is.read();
if(data == -1) {
break;
}
os.write(data); // 대상 파일을 Temp 폴더안에 타깃 파일로 기록합니다.
}
os.flush();
long end = System.nanoTime(); // 종료시간을 end 변수에 저장합니다.
return (end-start); // (end-start) : 파일 복사에 걸린 시간을 리턴
}
}
라인 단위 문자열 읽기
줄바꿈하는 것
package chapter14.sec02.exam03;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
// BufferReader의 라인 단위로 문자열로 읽는 readLine() 메서드를 활용하여,
// readLine() 메서드의 Enter키(캐리지리턴 + 라인피드) 이전의 모든 문자열을 읽고
// 리턴합니다. readLine() 메서드를 이용하면 키보드에서 입력한 내용과 파일 내용을]
// 라인 단위로 읽을 수 있습니다.
// 우선, 라인 단위로 구분된 문자열이 있는 language.txt 파일을 작성합니다.
// 그리고 BufferReader 보조 스트림을 생성하여, 라인 단위로 문자열을 읽어오고,
// 총 3개의 라인을 readLine() 메서드를 활용하여 읽어옵니다.
// 더이상 읽을 라인이 없다면 readLine() 메서드는 null을 리턴 처리합니다.
// 이때, 반복문을 빠져나오게합니다.
// 다음은 language.txt 파일의 데이터를 라인 단위로 문자열 읽어오는 자바 프로그램입니다.
public class ReadLineExample {
public static void main(String[] args) throws Exception {
// 문자 기반 입력 스트림을 처리합니다.
Reader reader = new FileReader(ReadLineExample.class.getResource("language.txt").getPath());
// 앞서, 문자 기반 입력 스트림 처리된 정보를
// BufferedReader 보조 스트림의 readLine() 메서드로 처리해 줍니다.
BufferedReader br = new BufferedReader(reader);
while (true) {
// 라인 단위 문자열을 읽고, 결과값을 리턴 처리합니다.
// 즉, data 변수에 리턴 처리결과를 대입 처리합니다.
String data = br.readLine();
// 만약에(if문) data 변수에 readLine() 메서드의 null값을 받는다면
if (data == null) {
// break문으로 종료처리를 합니다.
break;
}
System.out.println(data);
// readLine메서드는 null값으로 데이터 없음을 표시한다.
}
br.close(); //입력 스트림 자원을 닫아줍니다. 불필요한 낭비를 막는다.
}
}
기본 타입 입출력
package chapter14.sec02.exam04;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
// 다음은 기본타입(primitive type) 입출력 처리 이해를 위해
//이름, 성적, 순위 순으로 파일에 출력하고, 다시 이름, 성적, 순위 순으로
// 파일로 부터 입력 받는 자바 프로그램 예제입니다.
public class DataInputOutputStreamExample {
public static void main(String[] args) throws Exception {
// 바이트 기반 출력 스트림을 생성하고,
FileOutputStream fos = new FileOutputStream("C:/Temp/primitive.db");
// DataOutputStream 보조 프로그램을 연결 처리해줍니다.
DataOutputStream dos = new DataOutputStream(fos);
// 기본타입(primitive type) 값을 (primitive.db 파일로 출력합니다.
dos.writeUTF("장나라");
dos.writeDouble(95.5);
dos.writeInt(1);
dos.writeUTF("김연아");
dos.writeDouble(90.3);
dos.writeInt(2);
dos.flush();
dos.close(); // 출력 스트림 자원을 닫아줍니다
// 바이트 기반 입력 스트림을 생성하고,
FileInputStream fis = new FileInputStream("C:/Temp/primitive.db");
// DataInputStream 보조 스트림을 연결 처리해줍니다/
DataInputStream dis = new DataInputStream(fis);
for (int i = 0; i < 2; i++) {
// 기본 타입(primitive type) 값을 읽어옵니다
String name = dis.readUTF();
Double score = dis.readDouble();
int order = dis.readInt();
// 위에서 읽어온 기본 타입 데이터를 Console 화면에 출력처리합니다.
System.out.println(name + " : " + score + " : " + order);
}
dis.close(); // 입력 스트림 자원을 닫아줍니다.
}
}
프린트 보조스트림
PrintStream : 화면에 출력해주는 역할, 여기서 프린트 보조스트림이 나온다. print(), println() 메소드를 가지고 있다.
라인 단위로 출력하기
package chapter14.sec02.exam05;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
// 다음 예제는 FileOutputStream에 보조 스트림으로 PrintStream을 연결해서
// Print()메서드와 println() 메서드로 문자열을 라인 단위로 출력하는 자바 프로그램 입니다.
public class PrintStreamExample {
public static void main(String[] args) throws Exception {
// FileInputStream 클래스 활용 바이트 기반 출력 스트림을 생성하고,
FileOutputStream fos = new FileOutputStream("C:/Temp/printstream.txt");
//printStream 활용 보조 스트림을 연결처리합니다.
PrintStream ps = new PrintStream(fos);
// ps 활용 라인 단위로 문자열 출력처리를 합니다.
ps.println("[프린트 보조 스트림]");
ps.print("마치");
ps.println("프린터가 출력하는 것처럼");
ps.println("데이터를 출력합니다");
System.out.println("파일의 기록처리가 정상적으로 이루어졌습니다.");
ps.flush(); //버퍼에 잔류하는 문자열을 모두 보내고,
ps.close(); //출력 스트림 자원을 닫아주어, 불필요한 자원 낭비를 막아줍니다.
}
}
객체 입출력 보조 스트림 _ Board.java
package chapter14.sec02.exam06;
import java.io.Serializable;
import java.util.Date;
// 객체 입출력 보조 스트림에 활용하는 객체 Board 클래스 소스 코딩입니다.
// 객체 Board를 직렬화/역직렬화 처리를 하기 위해 Serializable 인터페이스를 구현처리합니다.
public class Board implements Serializable{
private int bno; // 게시글 번호 bno 필드 선언
private String title; // 게시글 제목 title 필드 선언
private String content; // 게스글 내용 content 필드선언
private String writer; // 게시글 작성자 writer 필드선언
private Date date; // 게시글 작성 일자 date 필드선언
// 필드 선언 : Source - Generate Constructor using Field ... 클릭생성
public Board(int bno, String title, String content, String writer, Date date) {
this.bno = bno;
this.title = title;
this.content = content;
this.writer = writer;
this.date = date;
}
// 메서드 선언 : Source - Generate Getters and Setters ... 클릭생성
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;
}
}
객체 입출력 보조 스트림_ObjectStreamExample.jajva
package chapter14.sec02.exam06;
import java.util.Date;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
// 다음 예제는 List 컬렉션을 파일로 저장하고 읽습니다. List 컬렉션의 구현 클래스로 ArrayList를
// 사용하는데, ArrayList는 Serializable 인터페이스를 구현하고 있습니다.
// 따라서 파일에 저장이 가능합니다. 주의해야할 점음 ArrayList에 저장되는 객체 역시 Serializable
// 인터페이스를 구현하고 있어야한다는 점입니다. 그래소 Board 역시 Serializable 인터페이스를 구현하고 있습니다.
// 객체 입출력 보조 스트림 활용 ObjectStreamExample 실행 클래스를 소스코딩합니다.
public class ObjectStreamExample {
public static void main(String[] args) throws Exception {
// ArrayList 안에 Serializable 이 있다.
// List 형 자료구조 데이터를 파일에 저장 처리하는 writeList() 메서드 선언
writeList();
}
private static void writeList() throws Exception {
//Board 객체 타입의 List 자료구조의 list 객체 참조 변수 생성
// List의 객체 배열을 넣음
List<Board> list = new ArrayList<>();
// List형 자료구조의 list 객체 참조 변수에 3개의 Board 객체 생성 대입처리를 합니다.
list.add(new Board(1, "제목1", "내용1", "장나라", new Date()));
list.add(new Board(2, "제목2", "내용2", "김희선", new Date()));
list.add(new Board(3, "제목3", "내용3", "이영자", new Date()));
//★★★★★ 객체를 넣으려고 사용
// FileOutputStream 출력 스트림을 활용해서 파일을 생성하고
// 객체를 파일로 기록
FileOutputStream fos = new FileOutputStream("C:/Temp/board.db");
// 위에서 생성한 fos 객체 참조 변수에 객체 출력 스트림인 ObjectOutputStream을 적용하여
ObjectOutputStream oos = new ObjectOutputStream(fos);
// list 객체 참조 변수에 담겨있는 데이터들을 oos에 writeObject() 메서드 활용 기록합니다.
oos.writeObject(list);
}
}
출력하기
package chapter14.sec02.exam06;
import java.util.Date;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
// 다음 예제는 List 컬렉션을 파일로 저장하고 읽습니다. List 컬렉션의 구현 클래스로 ArrayList를
// 사용하는데, ArrayList는 Serializable 인터페이스를 구현하고 있습니다.
// 따라서 파일에 저장이 가능합니다. 주의해야할 점음 ArrayList에 저장되는 객체 역시 Serializable
// 인터페이스를 구현하고 있어야한다는 점입니다. 그래소 Board 역시 Serializable 인터페이스를 구현하고 있습니다.
// 객체 입출력 보조 스트림 활용 ObjectStreamExample 실행 클래스를 소스코딩합니다.
public class ObjectStreamExample {
public static void main(String[] args) throws Exception {
// ArrayList 안에 Serializable 이 있다.
// List 형 자료구조 데이터를 파일에 저장 처리하는 writeList() 메서드 선언
writeList();
// 앞서 생성한 파일에 저장된 List형 자료구조 객체 데이터를 읽기
List<Board> list = readList();
// Date() 생성자로 생성된 데이터를 yyyy-MM-dd 형식으로 변경처리하기 위한
// SimpleDateFormat 타입의 sdf 객체 참조 변수를 생성해줍니다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// for문(반복문)으로, 앞서 list에 담겨있던 객체 데이터를 board 변수에 넣어서
// 반복적으로 객체 데이터 정보를 Console 화면에 출력 처리를 합니다.
for (Board board : list) {
System.out.println(
board.getBno() + "\t "+ board.getTitle() + "\t" + board.getContent() + "\t" + board.getWriter() +
"\t"+ sdf.format(board.getDate())
);
}
}
private static List<Board> readList() throws Exception {
// FileInputStream 기본 입력 스트림으로 fis 객체 참조 변수를 생성하고,
FileInputStream fis = new FileInputStream("C:/Temp/board.db");
// ObjectInputStream 객체 입력 스트림으로 ois 객체참조 변수를 생성하고,
ObjectInputStream ois = new ObjectInputStream(fis);
// List형 Board 타입의 list 객체 참조 변수의 데이터를 읽어서 담아줍니다.
List<Board> list = (List<Board>) ois.readObject();
return list;
}
private static void writeList() throws Exception {
//Board 객체 타입의 List 자료구조의 list 객체 참조 변수 생성
// List의 객체 배열을 넣음
List<Board> list = new ArrayList<>();
// List형 자료구조의 list 객체 참조 변수에 3개의 Board 객체 생성 대입처리를 합니다.
list.add(new Board(1, "제목1", "내용1", "장나라", new Date()));
list.add(new Board(2, "제목2", "내용2", "김희선", new Date()));
list.add(new Board(3, "제목3", "내용3", "이영자", new Date()));
//★★★★★ 객체를 넣으려고 사용
// FileOutputStream 출력 스트림을 활용해서 파일을 생성하고
// 객체를 파일로 기록
FileOutputStream fos = new FileOutputStream("C:/Temp/board.db");
// 위에서 생성한 fos 객체 참조 변수에 객체 출력 스트림인 ObjectOutputStream을 적용하여
ObjectOutputStream oos = new ObjectOutputStream(fos);
// list 객체 참조 변수에 담겨있는 데이터들을 oos에 writeObject() 메서드 활용 기록합니다.
oos.writeObject(list);
oos.flush(); // 버퍼에 남아있는 데이터를 출력 처리합니다.
oos.close(); // 추러력 스트림 자원을 닫아주어, 불필요한 자원 낭비를 방지합니다.
}
}
728x90
반응형
'☭DEVELOPER > #2 웹개발(자바기반 풀스택)' 카테고리의 다른 글
[BACKEND]JAVA_ECLIPSE 32 입출력 관련 API (0) | 2023.09.05 |
---|---|
[BACKEND]코딩테스트9 (0) | 2023.09.05 |
[BACKEND]JAVA_ECLIPSE 30 입출력 스트림 (0) | 2023.09.04 |
[BACKEND]JAVA_ECLIPSE29 LIFO와 FIFO 컬렉션 (0) | 2023.09.04 |
[BACKEND]JAVA_ECLIPSE28 Properties (0) | 2023.09.04 |