최원종의 개발 블로그

FileOutputStream 본문

Java/JAVA 유용한 클래스

FileOutputStream

chl6698 2026. 3. 20. 16:08
FileOutputStream은 FileInputStream의 반대 방향으로 파일에 데이터를 쓰는 방법.
FileOutputStream 은 프로그램에서 파일로 데이터를 1바이트씩 내보내는 스트림
항목 내용
패키지 java.io
상위 클래스 OutputStream
쓰기 단위 1바이트
파일 없을 때 자동 생성

 


-코드

package io.ch15;

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

public class MyFileOutputSystem {
    public static void main(String[] args) {
        String data = "Hello Java, FileOutputSystem abc abc 안녕 반가워";


            //파일이 없으면 새로 생성, 있으면 덮어쓰기
            //FileInputStream fos = new FileOutputStream("output.txt");

            //FileInputStream fos = new FileOutputStream("output.txt",true); -->Append 모드
            //기존 파일에 내용이 있다면 true 뒤에 이어쓰기, false -> 덮어쓰기


        try (FileOutputStream fos = new FileOutputStream("output.txt",false)){
            //문자열은 FileOutputStream 으로 직접 쓸 수 없습니다
            //문자열을 -> byte 배열로 변환해서 넣어주어야 합니다
            byte[] dataBytes = data.getBytes();
            fos.write(dataBytes);
            //
            System.out.println("파일 출력 완료 : output.txt" );

        } catch (IOException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
        //참고: output.txt를 에디터로 열면 텍스트가 보입니다.
        //에디터가 바이트 데이터를 문자로 해석해서 보여주기 때문에
        //FileOutputSystem 으로 바이트를 썻지만, 보여주는 방식은 에티터가 결정 합니다.
    }
}

 

-getBytes()로 변환하는 이유

FileOutputStream 은 바이트 기반 스트림입니다.
write() 메서드는 byte 또는 byte[] 만 받습니다.
String 을 직접 넣으면 컴파일 오류가 납니다.

String data = "Hello";
fos.write(data);           // 컴파일 오류!
fos.write(data.getBytes()); // 정상 동작

getBytes() 는 문자열을 바이트 배열로 변환해주는 메서드입니다.
"Hello" → [72, 101, 108, 108, 111]

 

-flush()가 필요한 이유

write()를 호출한다고 해서 데이터가 바로 파일에 저장되는 게 아님

write() 호출
    |
내부 버퍼에 데이터 쌓임  ← 아직 파일에 안 씌어짐!
    |
버퍼가 가득 차거나 flush() 가 호출될 때
    |
파일에 한 번에 저장됨

 

매 번 디스크에 접근 하는 것보다 모아서 한 번에 쓰는 게 훨씬 빠름

close() 호출 → 내부적으로 flush() 먼저 실행 → 버퍼 남은 데이터 모두 파일에 저장 → 스트림 닫힘

try-with-resources 사용 시 블록 종료 → 자동 close() → 자동 flush()
→ 별도로 flush() 를 호출하지 않아도 됩니다.

 

 

-핵심 요약

FileOutputStream
  - 프로그램에서 파일로 바이트 단위로 씀
  - 기본: 덮어쓰기 / true: 이어쓰기(append)
  - 파일이 없으면 자동 생성
  - 문자열은 getBytes() 로 변환 후 write()
  - try-with-resources 사용 시 자동 flush() → 자동 close()
  - 한글 포함 시 getBytes("UTF-8") 명시 또는 FileWriter 권장 (16단원)