[자바] 입출력 스트림

2025. 6. 17. 22:21·backend/Java

📌입출력(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
'backend/Java' 카테고리의 다른 글
  • [Spring] AOP(관점 지향 프로그래밍) 이해하기
  • [Spring] Annotation (어노테이션) 이해하기
  • [자바] - 상속과 다형성
  • [자바] - 깊은 복사와 얕은 복사
eun_log
eun_log
  • eun_log
    개발은
    eun_log
  • 전체
    오늘
    어제
    • 분류 전체보기 (75)
      • 코테 (17)
      • CS (6)
        • 자료구조, 알고리즘 (3)
        • 네트워크 (0)
        • 데이터베이스 (2)
        • 운영체제 (0)
      • frontend (32)
        • JavaScript (29)
        • html&css (1)
        • project_study (2)
      • backend (15)
        • Java (15)
      • project (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
eun_log
[자바] 입출력 스트림
상단으로

티스토리툴바