☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND]JAVA_ECLIPSE 31 보조스트림

조반짝 2023. 9. 4. 18:09
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
반응형