[JAVA]

[JAVA]10월 1일 입출력 스트림, InputStream 과 OutputStream, BufferedInputStream 과 BufferedOutputStream

jsm9301 2015. 10. 1. 10:10

* 입출력

*스트림의 분류

-데이터 싱크 스트림 : 데이터를 소스에서 읽거나 목적지에 기록.

-데이터 처리 스트림 : 들어오는 데이터를 가공하여 내보낸다.

* 입출력 스트림

-바이트 스트림 : 입력바이트 스트림, 출력바이트 스트림

-문자 스트림  : 입력문자 스트림, 출력문자 스트림.

 * InputStream 과 OutputStream

추상클래스로서 모든 바이트 스트림의 조상 클래스.

ex)

public static void main(String[] args) {

// FIXME Auto-generated method stub

FileInputStream in = null;

FileOutputStream out = null;  // try catch 블럭과 finally 블럭에서 접근 가능하                                                    기 위해 여기서 변수 선언.

try {

out =  new FileOutputStream("data.txt")

for(int i = 0; i < 300; i++)

{

out.write(i);

}

in = new FileInputStream("data.txt"); //이것도 객체다 , (메모리를 많이 사                                                               용하기 때문에)만든 스트림은 다쓰                                                               면 닫아줘야함.

int c;

while( (c = in.read()) != -1 )

{

System.out.println(c);

}

} catch (IOException e) { 

// FIXME Auto-generated catch block

e.printStackTrace();

}

finally{

try{

if(in != null)

in.close();    //in out 둘다 IOException 을 처리하는 try구문                                                    에 있어야 한다.

if(out != null)

out.close();

}catch(IOException e){

}

}

절대경로 : 파일시스템의 최상위부터 표현하는경로

상대경로 : 내 나름의 기준점을 출발로 하는 경로.

정규경로 : 최상위로부터의 경로(심플하고 순수한 경로)

. : 현재폴더

.. : 상위폴더

/로 시작하면 절대경로.

윈도우에서는 드라이브명부터 시작하면 절대경로.


*BufferedInputStream 과 BufferedOutputStream

FileInputStream와 FileOutputStream를 사용하면 1byte 단위로 입/출력이 이루어 지면 기계적인 동작이 많아져서 비효율 적이다.

BufferedInputStream은  1 바이트씩 읽어들이는 작업은 파일로부터 읽어오는 것이 아닌 준비된 시스템 버퍼에서 읽어오게 되므로, 파일 입력으로 인한 성능 저하를 최소화 할 수 있다.

ex)위 예제 에서 버퍼로 바꾸어 보았다.

out = new BufferedOutputStream(new FileOutputStream("data.txt"));

이때 버퍼에 꽉차지 않아서 파일로 안넘어간 데이터들을 모두 출력해주는 명령어는

out.flush();  //버퍼의 내용물을 즉시 처리.


BufferedOutputStream도 역시 하드 디스크 파일에 대한 출력을 최소화 하여 효율을 향상 시킨다.

ex) 마찬가지로 위 예제해서 버퍼로 바꾸어 보았다.

in = new BufferedInputStream(new FileInputStream("data.txt"));