«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

Java: IOStream : InputStream, OutputStream / 문자 Stream: Reader, Writer 본문

개발일기/Java

Java: IOStream : InputStream, OutputStream / 문자 Stream: Reader, Writer

민장미 2023. 5. 1. 23:21

Java에서는 문자를 외부에 출력하거나, 내부로 가져올 때, 크게 두 가지의 방식이 있다.

 

1. IOStream : InputStream & OutputStream  => Byte Stream이라고도 한다. 

input은 입력받아 가져오는거, output은 밖으로 내보내기

-중요한 것은 IO Stream은 단방향이다. 

 쉽게 설명하자면, 자바 밖으로 나가는 빨대, 안으로 들어오는 빨대가 각각 따로 있다는 뜻이다.

-문자,이미지 ,영상 등을 1byte씩 읽어오거나, 출력한다. 그래서 바이트스트림이라고도 부른다.

 

-1차 스트림(노드 스트림) : FileInputStream, OutputStream 

-2차 스트림(필터) : BufferedInputStream, BufferedOutputStream, 

DataInputStream, DataOutputStream, ObjectInputStream, ObjectOutputStream

자세히 보면 알겠지만, 종류는 총 3가지다.  버퍼는 프로그램의 속도를 빠르게 해주고, 

Data는 데이터의 자료형까지 출력해주지만 자료형의 순서가 매우 중요하다(바이트 코드로 출력되기 때문에

순서가 안맞으면 알아볼 수 없다)  Object는 아직 진도가 안나가서 추후 포스팅 예정 

 

 

2. 문자 Stream : Writer, Reader

Reader는 문자를 읽는 기능을 가짐, Wirter는 밖으로 내보내는 기능을 가짐 

IO Stream과는 다르게 2byte씩 받거나 송출한다. (자바에서 문자가 2byte이기때문)

그리고 오직 문자만 입출력이 가능한 통로다.

-1차 스트림(노드 스트림) : FileReder, FileWriter

-2차 스트림(필터) : BufferedReader, BufferedWriter

IO Stream과 다르게 필터 종류가 버퍼 딱 1가지다. 역시 프로그램의 속도를 빠르게 해주는 기능을 가진다. 

 

IO Stream, Reader & Wirter 모두 추상클래스인데, 2차 스트림이 그 추상클래스를 직접적으로 상속 받은 것은 아니다.

관계도 및 포인트 정리한건 노트에 그려서 업로드 예정 

 

아래 예시는 FileOutputStream에 대한 코드다.  

위에 적어 놓은 입,출력 관련 클래스의 객체를 만들면 예외처리 하라고 빨간줄이 뜬다.

try catch 외에도 finally 블록을 넣어 반드시 자원해체를 해주어야만 한다. ** 

package repeat;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Ex3_FileOutputStream {
public static void main(String[] args) {
	
	
	String path = "C:\\KOSMO132\\java\\학원필기\\0501\\myFiles\\file1.txt";
	FileOutputStream fos = null;
	
	
	try {
		fos = new FileOutputStream(path,true);
		fos.write(97);
		fos.write(99);
		
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}catch (IOException e) {
		e.printStackTrace();
	}finally {
		try {
			if(fos != null ) {
				fos.close();
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
	
}	
}

실행 후에 파일을 열어보면, 실제로 path 경로의 파일에 97,99의 유니코드(문자)가 적혀져 있다.

FileOutputStream 객체를 생성할 때, 파일 경로 옆에 true옵션을 추가하면 append 기능이 실행된다.

내가 `d을 적고 지운 뒤,  `dac 를 적어 실행 시켰는데,   `d가 삭제되지 않고 다음 글자인 `dac 앞에 누적되어 있었다.

=>    `d `dac