[Java][I/O] 바이트기반 스트림, InputStream & OutputStream

2022. 6. 22. 13:07JAVA/Language

1. InputStream과 OutputStream

InputStream과 OutputStream은 모든 바이트기반의 스트림의 조상입니다.

  • 바이트기반 스트림 입력 클래스(InputStream) : ByteArrayInputStream, FileInputStream, FilterInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
  • 바이트기반 스트림 출력 클래스(OutputStream) : ByteArrayOutputStream, FileOutputStream, FilterOutputStream, PipedOuptutStream

 

2. ByteArrayInputStream과 ByteArrayOutputStream

ByteArrayInputStream / ByteArrayOutputStream은 메모리, 즉 바이트 배열에 데이터를 입력/출력하는데 사용되는 스트림입니다. 주로 다른 곳에 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업을 하는데 사용됩니다.

 

다음 예제는 ByteArrayInputStream / ByteArrayOutputStream을 이용해서 바이트 배열 inSrc의 데이터를 outSrc로 복사하는 예제입니다.

	/**
	 * title : InputStream, OutputStream의 read(), write() 사용
	 * ByteArrayInputStream 인스턴스 메서드
	 * int read() : 1byte(0~255 사이의 값)를 읽어옴. 더이상 읽어올 데이터가 없으면 -1을 반환함
	 * 
	 * ByteArrayOutputStream 인스턴스 메서드
	 * void write(int b)    : 주어진 값을 출력소스에 씀
	 * byte[] toByteArray() : 스트림의 내용을 byte 배열로 반환  
	 */
	@Order(1)
	@Test
	void readWriteMethodTest() {
		printMethodName("readWriteMethodTest");
		
		byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		byte[] outSrc = null;
		
		ByteArrayInputStream  input  = new ByteArrayInputStream(inSrc);
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		
		int data = 0;
		
		while((data = input.read()) != -1) {
			output.write(data);
		}
		
		outSrc = output.toByteArray(); // 스트림의 내용을 byte배열로 반환한다.
		
		System.out.println("Input Source  : " + Arrays.toString(inSrc));
		System.out.println("Output Source : " + Arrays.toString(outSrc));
	}

 

3. FileInputStream과 FileOutputStream

FileInputStream / FileOutputStream은 파일에 입출력을 하기 위한 스트림입니다. 바이트 기반 스트림이기 때문에 파일을 읽어오거나 출력할때 1byte씩 읽기/쓰기를 수행합니다.

 

다음 예제는 FileInputStream / FileOutputStream을 사용해서 note.txt의 내용을 그대로 복사해서 note_copy.txt로 저장하는 예제입니다.

note.txt 내용

hello world
hello java
	/**
	 * title : FileInputStream/FileOutputStream을 이용해서 파일을 복사하기
	 * FileOutputStream 인스턴스 메서드
	 * void write(int b) : b값을 파일에 작성함
	 */
	@Order(2)
	@Test
	void fileCopyTest(){
		
		try(FileInputStream fis = new FileInputStream("./src/ch15/ex_02_FileInputStream_FileOutputStream/note.txt");
				FileOutputStream fos = new FileOutputStream("./src/ch15/ex_02_FileInputStream_FileOutputStream/note_copy.txt")) {
			int data = 0;
			while((data = fis.read()) != -1) {
				fos.write(data);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

note_copy.txt

hello world
hello java

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch15
[도서] Java의 정석, 남궁 성 지음