티스토리 뷰

 

[BufferedInputStream / BufferedOutputStream]

 

스트림 내에 버퍼가 존재하기 때문에 byte형 배열 buffer를 만들 필요가 없다!

버퍼의 기본 크기는 512 byte이다.

 

데이터 소스와 직접 연결할 수 없기 때문에 노드 스트림(->System.in) 이 필요하다.

 

버퍼 내 데이터가 다 차면 데이터를 한번에 읽어와 출력하는데,

버퍼가 가득 차지 않았다면 flush 메소드를 이용해 출력해준다.

 

 

ex)

package StreamEx;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;

public class BufferIOStream {

	public static void main(String[] args) throws IOException {
		BufferedInputStream bin = new BufferedInputStream(System.in);
		BufferedOutputStream bout = new BufferedOutputStream(System.out);
		
		int n=0;
		while((n=bin.read())!=-1) {
			bout.write(n);
			bout.flush();
		}
		
		bin.close();
		bout.close();
		
		System.in.close();
		System.out.close();
	}
}

 

 

 


 

 

[DataInputStream / DataOutputStream]

 

 

ex1)

package StreamEx;

import java.io.*;

public class DataIOStreamEx {

	public static void main(String[] args){
		FileOutputStream fout = null;
		DataOutputStream dout = null;
		FileInputStream fin = null;
		DataInputStream din = null;
		
		try {
			fout = new FileOutputStream("test.txt");
			dout = new DataOutputStream(fout);
			
			dout.writeInt(100);
			dout.writeFloat(100.0f);
			dout.writeBoolean(true);
			
			dout.close();
			fout.close();
		} catch(IOException e) {
			e.printStackTrace();
		}
		
		
		try {
			fin = new FileInputStream("test.txt");
			din = new DataInputStream(fin);
			
			System.out.println(din.readInt());
			System.out.println(din.readFloat());
			System.out.println(din.readBoolean());
			
			din.close();
			fin.close();
		} catch(IOException e) {
			e.printStackTrace();
		}	
	}
	
}

FileOutputStream과 DataOutputStream을 이용해 test.txt 라는 파일을 만들고,

DataOutputStream 내의 writeInt, writeFloat, writeBoolean 메소드를 통해 파일에 데이터를 쓴다.

그리고 FileInputStream과 DataInputStream을 이용해 test.txt 파일을 불러오고,

DataInputStream 내의 readInt, readFloat, readBoolean 메소드를 통해 파일 내 데이터를 읽어온다.

 

 

ex2)

package StreamEx;

import java.io.*;

public class DataIOStreamEx2{

	public static void main(String[] args) throws IOException{
		String srcFile = "testData.txt";
		String targetFile = "testData.txt";
		
		FileOutputStream fout = new FileOutputStream(targetFile);
		DataOutputStream dout = new DataOutputStream(fout);
		
		byte bt = 22;	// 1byte
		byte arr[] = {1, 10, 100};	//(1*3)byte
		boolean bool = true;	//1byte
		char ch = '뀨';	//2byte
		String str = "자바입출력";	//(3*5+2)byte
		// 총 24byte
		dout.write(bt);
		dout.write(arr, 0, arr.length);
		dout.writeBoolean(bool);
		dout.writeChar(ch);
		dout.writeUTF(str);
		System.out.println("출력할 바이트 수 : "+dout.size()+"\n");
		dout.flush();
		dout.close();
		
		
		FileInputStream fin = new FileInputStream(srcFile);
		DataInputStream din = new DataInputStream(fin);
		
		System.out.println("읽을 바이트 수 : "+din.available());
		System.out.println(din.readByte());
		int n = din.read(arr, 0, arr.length);
		for(byte btarr : arr)
			System.out.println(btarr);
		System.out.println(din.readBoolean());
		System.out.println(din.readChar());
		System.out.println(din.readUTF());
		din.close();

	}
}

실행 결과>

출력할 바이트 수 : 24
읽을 바이트 수 : 24
22 

10 
100 
true

자바입출력

 

DataOutputStream/DataInputStream에서 문자열을 출력할 때/읽을 때는 writeUTF()/readUTF() 메소드를 사용한다.

DataInputStream에서 배열의 값을 읽어올 때 위와 같이 read 메소드를 사용하면 읽어들인 값이 아닌 읽어들인 바이트 수(n)가 반환되므로 for-each문을 이용해 배열의 값을 출력하였다.

여기서, for-each문만을 사용하면 din에 있는 배열 데이터는 그대로 있으므로 순서가 뒤바뀐다. 그러므로 read 메소드를 이용해 데이터를 읽고, for-each문으로 데이터를 출력한다.

 

 

반응형

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

[Java] 문자 스트림  (0) 2019.07.26
[Java] File 클래스  (0) 2019.07.24
[Java] ByteArrayStream, PipedStream  (0) 2019.06.28
[Java] read() , FileIOStream  (0) 2019.06.23
[Java] Collections Framework - Map  (0) 2019.06.18

댓글