오답노트
[Java] IOStream 본문
입력 스트림과 출력 스트림
- 입력 스트림 : 대상으로부터 자료를 읽어 들이는 스트림 (ex. FileInputStream, FileReader, BufferedInputStream, BufferedReader)
- 출력 스트림 : 대상으로 자료를 출력하는 스트림 (ex. FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter)
import java.io.IOException;
import java.io.InputStreamReader;
public class SystemInTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요");
int i = 0;
try {
InputStreamReader irs = new InputStreamReader(System.in);
while((i = irs.read()) != '\n') {
System.out.print((char)i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
바이트 단위 스트림과 문자 단위 스트림
- 바이트 단위 스트림 : 동영상, 음악 파일, 실행 파일등의 자료를 읽고 쓸 때 사용
- 문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐, 인토딩에 맞게 2바이트 이상으로 처리하도록 구현된 스트림
바이트 단위 스트림
읽기
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest3 {
public static void main(String[] args) {
int i;
try(FileInputStream fis = new FileInputStream("input2.txt")){
byte[] bs = new byte[10];
while((i = fis.read(bs)) != -1) {
for(int j = 0; j < i; j++) {
System.out.print((char)bs[j]);
}
System.out.println(" : " + i + "바이트 읽음");
}
} catch(IOException e) {
System.out.println(e);
}
}
}
쓰기
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest1 {
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
FileOutputStream fos = new FileOutputStream("output.txt",true);
try(fos){
byte[] bs = new byte[26];
byte data = 65;
for(int i = 0 ; i <bs.length; i++) {
bs[i]= data++;
}
fos.write(bs);
}catch(IOException e) {
System.out.println(e);
}
System.out.println("end");
}
}
// java 9 이상
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try(FileOutputStream fos = new FileOutputStream("output.txt")){
fos.write(65);
fos.write(65);
fos.write(65);
}catch(IOException e) {
System.out.println(e);
}
System.out.println("end");
}
}
//java 7 이상
문자 단위 스트림
읽기
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) {
try(FileReader fr = new FileReader("reader.txt")){
int i;
while((i = fr.read()) != -1) {
System.out.print((char)i);
}
}catch(IOException e) {
System.out.println(e);
}
}
}
쓰기
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) {
try(FileWriter fw = new FileWriter("writer.txt")){
fw.write('A'); // 문자 하나 출력
char buf[] = {'B','C','D','E','F','G'};
fw.write(buf); //문자 배열 출력
fw.write("안녕하세요. 잘 써지네요"); //String 출력
fw.write(buf, 1, 2); //문자 배열의 일부 출력
fw.write("65"); //숫자를 그대로 출력
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("출력이 완료되었습니다.");
}
}
기반 스트림과 보조 스트림
- 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
- 보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개 변수로 포함한다.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyTest {
public static void main(String[] args) {
long milliesecond = 0;
try( BufferedInputStream bis = new BufferedInputStream( new FileInputStream("a.zip"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.zip"))){
milliesecond = System.currentTimeMillis();
int i;
while((i=bis.read()) != -1) {
bos.write(i);
}
milliesecond = System.currentTimeMillis() - milliesecond;
} catch(IOException e) {
e.printStackTrace();
}
System.out.println(milliesecond);
}
}
번외로 BufferedInputStream 같은 경우 속도가 훨씬 빠른데, 그 이유는 운영체제의 시스템 콜 횟수를 줄일 수 있기 때문이다. 여러 번 읽어서 가져가는 것이 아닌 Buffer에 쌓아 놓고 한번에 가져가기 때문에 속도가 빠르다.
'Java' 카테고리의 다른 글
[Java] Thread (0) | 2023.07.11 |
---|---|
[Java] 직렬화 (0) | 2023.07.11 |
[Java] 사용자 정의 예외 처리 (0) | 2023.07.10 |
[Java] 예외 처리 (0) | 2023.07.10 |
[Java] 스트림 (0) | 2023.07.10 |