본문 바로가기
프로그래밍/java

자바 java.io 패키지, 바이트 스트림(Byte Stream)

by -현's- 2014. 4. 11.
반응형



●바이트 스트림(Byte Stream)

- 데이터의 종류가 파일, 그림, 동영상 등의 바이트 기반인 경우 사용하는 클래스로 바이트 단위로 입출력을 제어한다.


InputStream

OutputStream 

 입출력을 위한 바이트 스트림의 최상위 추상 클래스

FileInputStream

FileOutputStream

 파일 입출력을 위한 바이트 스트림 클래스

DataInputStream

DataOutputStream

 자바 기본형(primitive) 데이터를 입출력 하기 위한 클래스

BufferedInputStream

BufferedOutputStream

 입출력 스트림에 버퍼링 기능을 추가한 클래스

PrintStream 

 System.out을 통해 콘솔로 출력하기 위한 클래스







●OutputSTream, InputStream 클래스

- 다른 세부적인 기능을 하는 하위 클래스의 상위 추상 클래스이다. 이 클래스들은 자신들은 객체가 될수 없고, 객체가 될수 있는 하위 클래스가 있다. byte단위로 입,출력을 한다.


- OutputStream 클래스 예제

import java.io.*;


public class OutputStream

{

public static void main(String args[]) throws java.io.IOException{

for(byte i=32; i<127; i++){

System.out.write(i);

System.out.write('\t');

}

}

}








- InputStream.java

import java.io.*;

public class InputStream{

public static void main(String args[]) throws java.io.IOException{

byte[] buf = new byte[100];

int a;

while((a=System.in.read(buf)) >=0)

System.out.write(buf, 0, a);

}

}











●FileOutputStream 클래스

- 데이터를 파일에 바이트 스트림으로 저장하기 위해 사용된다. 파일멸이나 File클래스의 객체를 인수로 넘겨줘서 시스템에 파일을 직접 생성할 수 있다. 기본적으로 파일이 이미 존재하면 그 파일에 덮어 쓰게 되고 기존의 내용은 사라지게 된다.



FileOutputStreamEx.java

import java.io.*;


class FileOutputStreamEx

{

public static void main(String args[]) throws IOException{

FileOutputStream f = new FileOutputStream("a.txt");

f.write('A');

f.write('B');

f.close();

}

} 













●FileInputStream 클래스

- 시스템의 파일로부터 데이터를 바이트 스트림으로 읽어 들이기 위해 사용되고, 파일이 없으면 IOException을 발생시킨다.


- FileInputStreamEx

import java.io.*;


class FileInputStreamEx

{

public static void main(String args[]) throws IOException{

FileInputStream f = new FileInputStream("a.txt");

System.out.println(f.read());

f.close();

}

}











●DataOutputStream, DataInputSream 클래스

- 단순히 바이트만을 읽고 쓰는 기존의 스트림보다 상위 수준의 통신이  가능하도록 하는 기능을 제공한다. 기존의 스트림은 바이트 단위로 데이터를 읽는 기능밖에 없기때문에 기본 자료형의 데이터를 읽거나 쓰기위해서는 사용자가 직접 제어 해야했지만 이 클래스를 사용하면 원하느 ㄴ타입으로 데이터를 읽고 쓰는 것이 가능하다.


- DataIOStreamEx.java

import java.io.*;


class DataIOStreamEx{

public static void main(String[] args){

char input_char = 'a', output_char = (char)0;

int input_int = 10, output_int=0;

String input_str = "abc", output_str="";


DataInputStream dis = null;

DataOutputStream dos = null;


try{

FileOutputStream fo = new FileOutputStream("fileoutput.txt");

dos = new DataOutputStream(fo);

}catch(FileNotFoundException e){

System.out.println(e);

}


try{

dos.writeChar(input_char);

dos.writeInt(input_int);

dos.writeUTF(input_str);

dos.close();

}catch(IOException e){

System.out.println(e+"aaa");

}


try{

FileInputStream fi = new FileInputStream("fileoutput.txt");

dis = new DataInputStream(fi);

}catch(FileNotFoundException e){

System.out.println(e+"aa");

}


try{

output_char = dis.readChar();

output_int = dis.readInt();

output_str = dis.readUTF();

}catch(IOException e){

System.out.println(e+"a");

}

System.out.println(output_char);

System.out.println(output_int);

System.out.println(output_str);


}

} 













●BufferedInputStream, BufferedOutputStream

- 기존의 스트림위에서 입출력 버퍼링을 제공하는 필터 스트림 클래스이다. 읽기와 쓰기가 메모리 버퍼에서 직접 이루어질 수 있고, 운영체제는 가끔씩만 호출되기 때문에 오버헤드가 줄어든다.


-BufferedIOStreamEx.java

import java.io.*;


public class BufferedIOStreamEx

{

public static void main(String[] args){

int i, len = 0;

byte[] buffer = new byte[256];

BufferedInputStream in = null;

BufferedOutputStream out = null;

String sourceFile = "BufferedIOStreamEx.java";

String destFile = "output.txt";

System.out.println("소스 파일 이름:"+sourceFile);

System.out.println("목표 파일 이름:"+destFile);

try{

in = new BufferedInputStream(new FileInputStream(new File(sourceFile)));

FileOutputStream file_out = new FileOutputStream(destFile);

out = new BufferedOutputStream(file_out, 256);

}catch(FileNotFoundException e){

System.out.println(e);

}


try{

while((i=in.read(buffer))!= -1){

out.write(buffer);

len+=1;

System.out.println("현재 읽은 데이터["+i+","+len+"], 나머지 데이터["+in.available()+"]");

}

in.close();

out.close();

System.out.println(len+"바이트 데이터 복사완료");


}catch(IOException e){

System.out.println(e);

}

}

} 













반응형

댓글