반응형
File IO 2
보조 스트림 (Filter stream)
다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림이다.
상속 관계
InputStream
└ FileInputStream
InputStream
└ FilterInputStream
└ BufferedInputStream
OutputStream
└ FileOutputStream
OutputStream
└ FilterOutputStream
└ BufferedOutputStream
💻 예제 1
BufferedInputStream과 BufferedOutputStream을 사용한 예제이다.
📝 소스 코드
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Main {
public static void main(String[] args) {
InputStream in = null;
BufferedInputStream bin = null;
OutputStream out = null;
BufferedOutputStream bout = null;
try {
in = new FileInputStream("temp/big_text.txt");
bin = new BufferedInputStream(in);
out = new FileOutputStream("temp/copy_big_text.txt");
bout = new BufferedOutputStream(out);
int dataRead;
int bytes = 0;
long startTime = System.currentTimeMillis(); // 현재 시간 저장
while (true) {
dataRead = bin.read();
if (dataRead == -1)
break;
bout.write(dataRead);
bytes++;
}
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
System.out.println("읽고 쓴 바이트 : " + bytes);
System.out.println("경과 시간(ms) : " + elapsedTime);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally { // 자원 해제
try {
if (bin != null)
bin.close();
if (bout != null)
bout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
📄 실행 결과
[파일 입출력 1 - Java 예제 1]의 코드와 로직은 같지만 BufferedInputStream과 BufferedOutputStream을 사용함으로 인해 경과 시간이 현저하게 줄어든 걸 볼 수 있다.
💻 예제 2
[파일 입출력 1 - Java 예제 2]에서 BufferedInputStream, BufferedOutputStream을 추가한 예제이다.
📝 소스 코드
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Main {
public static void main(String[] args) {
System.out.println("Buffered Stream + Buffer\n");
// try with resource 구문으로 작성
try (
InputStream in = new FileInputStream("temp/big_text.txt");
BufferedInputStream bin = new BufferedInputStream(in);
OutputStream out = new FileOutputStream("temp/copy_big_text.txt");
BufferedOutputStream bout = new BufferedOutputStream(out);
) {
byte[] buf = new byte[1024]; // 버퍼
long startTime = System.currentTimeMillis();
int lengthRead = 0;
int bytes = 0;
while (true) {
lengthRead = bin.read(buf);
if (lengthRead == -1)
break;
bout.write(buf, 0, lengthRead);
bytes += lengthRead;
}
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
System.out.println("전체 복사한 바이트: " + bytes);
System.out.println("경과 시간: " + elapsedTime);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
📄 실행 결과
그동안 실행했던 예제들 중 경과 시간이 가장 줄어든 것을 볼 수 있다.
반응형