오답노트

[Java] IOStream 본문

Java

[Java] IOStream

권멋져 2023. 7. 10. 17:47

입력 스트림과 출력 스트림

  • 입력 스트림 : 대상으로부터 자료를 읽어 들이는 스트림 (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