[JAVA]10월 1일 입출력 스트림, InputStream 과 OutputStream, BufferedInputStream 과 BufferedOutputStream
* 입출력
*스트림의 분류
-데이터 싱크 스트림 : 데이터를 소스에서 읽거나 목적지에 기록.
-데이터 처리 스트림 : 들어오는 데이터를 가공하여 내보낸다.
* 입출력 스트림
-바이트 스트림 : 입력바이트 스트림, 출력바이트 스트림
-문자 스트림 : 입력문자 스트림, 출력문자 스트림.
* 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"));