📌입출력(IO)
- 자바에서 데이터는 스트림을 통해 입출력된다. 스트림은 단방향으로 연속적으로 흘러가는 것을 말한다.
- 현재 프로그램이 출발지인지 도착지인지에 따라 스트림을 다르게 사용한다.
- 프로그램이 도착지인경우, 흘러들어온 데이터를 받기 위해 입력 스트림을 사용하고,
- 프로그램이 출발지인경우, 데이터를 출력해야 하므로 출력 스트림을 사용한다.
📌스트림
스트림 : 통로의 크기
- 바이트 기반 스트림
- 통로가 바이트 단위의 크기, 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
- InputStream
- 문자 기반 스트림
- 통로가 바이트 단위보다 큰 크기, 문자 데이터를 읽고 출력할 때 사용
- Reader
- 다양한 기반 스트림 중 File이라고 붙어있는 건 기억할 것
- 기반 스트림 : 실제 통로를 만드는것, 연결하는 것
- 보조 스트림 : 연결된 통로에 부가적인 기능들을 덧붙이는 것

📌스트림 종류

📌InputStream
- 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.
- 모든 바이트 기반 입력 스트림은 InputStream 클래스를 상속받아서 만들어진다.

📌OutputStream
- 바이트 기반 출력 스트림의 최상위 클래스로 추상클래스이다.
- 모든 바이트 기반 출력 스트림은 OutputStream 클래스를 상속받아서 만들어진다.

📌Reader
- 문자 기반 입력 스트림의 최상위 클래스로 추상클래스이다.

📌Writer
- 문자 기반 출력 스트림의 최상위 클래스로 추상클래스이다.

📌File 클래스
- 파일 시스템의 파일을 표현하는 클래스
- 파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공
✔️File 객체 생성
File file = new File("파일 경로");
File file = new File("C://data/test.txt");
✔️파일/디렉토리 생성 및 삭제 메소드

File file = new File("fileTest.txt");
System.out.println("파일명 : "+file.getName());
System.out.println("경로 : "+file.getAbsolutePath()); //전체 경루
System.out.println("파일크기 : "+file.length());
필요 디렉터리 생성시
파일 생성할 경우 아래 순서대로 해야 꼬이지 않는다.
File dir1 = new File("test");
dir1.mkdir();
File dir2 = new File("test1/test2/test3");
dir2.mkdirs(); //여러개를 생성할 경우 s 붙여줘야한다.
📌FileInputStream
- InputStream이기 때문에 바이트 단위이다.
- 파일로부터 바이트 단위로 읽을 때 사용
- 그림, 오디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능
- InputStream과 사용 방법 동일
✔️객체 생성
FileInputStream 객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 FileNotFoundException 발생하므로 예외처리 필수
FileInputStream fis = new FileInputStream("C:/data/test.txt");
📌FileOutputStream
- 파일로부터 바이트 단위로 저장할 때 사용
- 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 데이터를 파일로 저장
- OutputStream의 하위 클래스로 OutputStream과 사용 방법 동일
✔️객체 생성
FileOutputStream 객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 자동으로 생성하지만
이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
만일 기존 파일에 이어서 계속 작성하고 싶으면 아래처럼 객체 생성시 가능
FileOutpuStream fos = new FileOutputStream("C:/data/test.txt",true);
📌FileReader
- 텍스트 파일로부터 문자단위로 읽을 때 사용
- 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기 불가능
- Reader의 하위 클래스로 Reader와 사용 방법 동일
✔️객체 생성
FileReader 객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 FileNotFoundException 발생하므로 예외처리 필수
FileReader fr = new FileReader("C:/data/test.txt");
FileReader fr = new FileReader(new File("C:/data/test.txt");
📌FileWriter
- 텍스트 파일로부터 문자단위로 저장할 때 사용
- 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 저장 불가능
- Writer의 하위 클래스로 Writer와 사용 방법 동일
✔️객체 생성
FileWriter 객체가 생성될 때 파일과 직접 연결 됨
만약 파일이 존재하지 않으면 자동으로 생성되지만
이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
FileWriter fw = new FileWriter("C:/data/test.txt");
만일 기존 파일에 이어서 작성하고 싶으면 아래 방식으로 객체 생성
FileWriter fw = new FileWriter("C:/data/test.txt",true);
📌보조 스트림
- 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
- 보조 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리 불가능
- 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림 생성
📌보조 스트림 종류
- 문자 변환(InputStreamReader/OutputStreamWriter),
- 입출력 성능(BufferedInputStream/BufferedOutputStream),
- 기본 데이터 타입 출력(DataInputStream, DataOutputStream),
- 객체 입출력(ObjectInputStream/ObjectOutputStream)등
✔️예시
FileInputStream fis = new FileInputStream("sample.txt"); //기반 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis); //보조 스트림 생성
bis.read(); //보조스트림으로부터 데이터 읽어옴
📌성능 향상 보조 스트림
- 느린 속도로 인해 입출력 성능에 영향을 미치는 입출력 소스를 이용하는 경우 사용
- 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업을 하여 실행 성능 향상
- (입출력 횟수 줄임)
- 보통 기반이 byte이고 보조가 char인 경우에 많이 사용한다.

✔️InputStreamReader
- 보조 : BufferedReader -> char 단위(Reader)
- 기반 : System.in, 콘솔창 -> byte 단위
//new 보조 스트림(new 보조스트림(다른스트림));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.print("문자열 입력: ");
String val = br.readLine(); //문자 한 줄 전체를 읽어온다.
System.out.println("val: "+val);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
br.close();
}catch(IOException e){
e.printStackTrace();
}
}
✔️OutputStreamReader
- 보조 : BufferedWriter -> char 단위(Writer)
- 기반 : System.out, byte 단위
OutputStreamWriter osw = new OutputStreamWriter(System.out);
BufferedWriter bw = new BufferedWriter(osw);
try{
bw.write("hello hi bye");
bw.flush(); //버퍼에 있는 거 밀어냄
}catch(IOException e){
e.printStackTrace();
}finally{
try{
bw.close();//남아있던거 다 출력
}catch(IOException e){
e.printStackTrace();
}
}
보조 스트림은 단독으로 사용할 수 없다.
반드시 기반 스트림이 필요하다.
new 보조스트림(new 기반스트림("외부자원"));
BufferedWriter bw = new BufferedWriter(new FileWriter("sample.txt"));
bw.write("안녕하세요");
//FileWriter로 파일 sample.txt생성하고 그 파일에 BufferedWriter 사용하여 "안녕하세요" 작성
✔️객체 보조 스트림
public void fileSave() {
Member mar[] = {
new Member("user01","pass01","박상은","ppp@multi.com",20,'남',1200.4),
new Member("user02","pass02","김상은","kkk@multi.com",25,'남',1222.4),
new Member("user03","pass02","이상은","lll@multi.com",22,'여',1219.4)
};
//객체 출력
//ObjectOutputStream 클래스 사용 , 보조 스트림
ObjectOutputStream objOut = null;
try {
objOut = new ObjectOutputStream(new FileOutputStream("member.txt"));//File: 기반스트림
for(int i=0;i<mar.length;i++) {
objOut.writeObject(mar[i]);
}
objOut.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void fileOpen() {//불러오기
Member[] mar = new Member[3];
//스트림 객체 생성 (try with resource로 생성했기에 자동으로 close처리된다.)
try (ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("member.txt"))){
//입력
mar[0] = (Member)objIn.readObject();
mar[1] = (Member)objIn.readObject();
mar[2] = (Member)objIn.readObject();
//입력받은 객체를 콘솔에 출력
for(Member m : mar) {
System.out.println("읽어온 객체:"+m);
System.out.println(m.addr);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}'backend > Java' 카테고리의 다른 글
| [Spring] AOP(관점 지향 프로그래밍) 이해하기 (0) | 2025.07.15 |
|---|---|
| [Spring] Annotation (어노테이션) 이해하기 (1) | 2025.07.08 |
| [자바] - 상속과 다형성 (4) | 2025.06.08 |
| [자바] - 깊은 복사와 얕은 복사 (2) | 2025.06.06 |
| [자바] - 객체와 클래스 (참조 변수와 메모리 영역_힙, 스택) (4) | 2025.06.02 |