티스토리 뷰

 

[ByteArrayInputStream / ByteArrayOutputStream]

 

ex)

package StreamEx;

import java.io.*;

public class ByteArrayIOTest {

	public static void main(String[] args) throws IOException {
		
		FileInputStream fin = new FileInputStream("Test.txt");
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
        
		byte[] outArr = null;
		byte[] buffer = new byte[1024];
		
        
		int n;
		while((n=fin.read(buffer)) != -1) {	// fin으로부터 읽은 데이터를 buffer에 저장
			bout.write(buffer, 0, n);	// buffer의 데이터를 bout에 씀
		}
		
		outArr = bout.toByteArray();	// OutputStream의 내용을 변환하여 Array에 저장
		
		System.out.write(buffer, 0, outArr.length);	// buffer에 저장된 모든 데이터 출력
	}
}

 

File의 내용을 ByteArrayOutputStream을 이용해서 출력하는 코드이다.

fin.read(buffer)는 fin의 내용을 읽어와 buffer에 저장하라는 의미이다.

그런 다음 bout.write(buffer, 0, n)은 buffer의 내용을 방금 읽어온 바이트 수만큼 bout에 쓰라는 의미이다.

파일의 끝에 도달하면 while문을 빠져나온다.

toByteArray() 메소드를 통해 ByteArrayOutputStream인 bout에 저장된 값이 Byte형 배열 outArr에 저장된다.

파일의 크기가 buffer 배열의 크기보다 작다면 buffer 배열에는 파일의 모든 데이터가 들어 있다.

파일의 크기를 알 수 있는 length는 배열에 사용할 수 있으므로 outArr.length를 이용해 파일의 크기만큼 buffer에 저장된 데이터를 출력한다.

 

 

 


 

[PipedInputStream / PipedOutputStream]

 

Thread는 start() 메소드를 통해 시작이 되고, start() 메소드 내부에서 run() 메소드가 호출된다.

 

 

ex)

package StreamEx;

import java.io.*;

public class PipedIOEx extends Thread {

	InputStream input;
	OutputStream output;
	
	PipedIOEx(InputStream in, OutputStream out) {
		input = in;
		output = out;
	}
	
	public void run() {
		byte[] buff = new byte[1024];
		int n = 0;
		
		try {
			while(true) {
				n = input.read(buff);
					
				if(n != -1) {
					output.write(buff, 0, n);
				}
				else
					return;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) throws IOException {
		PipedInputStream pin = new PipedInputStream();
		PipedOutputStream pout = new PipedOutputStream();
		
		pin.connect(pout);
		PipedIOEx t1 = new PipedIOEx(System.in, pout);
		PipedIOEx t2 = new PipedIOEx(pin, System.out);
		
		t1.start();
		t2.start();
	}
}

입력>

Hello Everyone 

출력>

Hello Everyone

입력>

Have a good day

출력>

Have a good day

 

 

우선 Thread간의 데이터를 전달해야 하기 때문에 PipedIOEx 클래스가 Thread를 상속받도록 한다.

그리고 connect 메소드를 이용해 pin 객체와 pout 객체를 연결시킨다. 이 과정에서 IOException에 대한 예외처리가 필요하다.

키보드로 입력 받은 내용을 그대로 출력시키기 위해 PipedIOEx 객체 t1를 만들어 생성자의 InputStream에 System.in을, OutputStream에 pout 객체를 전달한다.

run() 메소드를 통해서 입력 받은 내용을 모두 저장한 pout 객체는 connect 메소드를 통해 pin 객체와 연결되어 있다.

그러므로 PipedIOEx 객체 t2를 만들어 생성자의 InputStream에 pin을 전달해주면 입력 받았던 내용이 pout을 거쳐 pin에까지 연결된다. 그리고 생성자의 OutputStream에 System.out 을 전달해주면 입력 받았던 내용을 그대로 출력할 수 있는 것이다.

Thread를 상속받은 PipedIOEx 객체 t1, t2의 start() 메소드를 실행시 start() 메소드 내부적으로 run() 메소드를 호출하여 실행된다.

 

반응형

'Java, JavaScript' 카테고리의 다른 글

[Java] File 클래스  (0) 2019.07.24
[Java] BufferedIOStream, DataIOStream  (0) 2019.07.01
[Java] read() , FileIOStream  (0) 2019.06.23
[Java] Collections Framework - Map  (0) 2019.06.18
[Java] Collections Framework - Collection(List, Set)  (0) 2019.06.18

댓글