상세 컨텐츠

본문 제목

[JAVA] 파일 출력 스트림(바이트 기반)

JAVA/Java 기초

by 미로910 2024. 5. 17. 10:52

본문

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

public class MyFileOutputStream {

	public static void main(String[] args) {
		
		long start = System.nanoTime();

		// 데이터가 존재
		String data = "Hello, Java FileOutputStream \n 안녕반가워";

		// 1. 파일에다가 데이터를 저장 하고 싶다면 (바이트 기반)
		// 자바 8버전 부터 제공
		// try-catch-resource -> (자동으로 자원 닫아 준다)

		try (FileOutputStream fos = new FileOutputStream("output.txt", false)) {
			// 수행 코드
			// data(String) 가지고 있는 문자열들을 바이트 배열로 반환 처리
			
			//byte[] bytes = data.getBytes();
			
			byte[] bytes = {72, 101, 108, 108, 111};
			
			System.out.println("bytes : " + bytes);
			for (int i = 0; i < bytes.length; i++) {
				System.out.println("bytes[i] : " + bytes[i]);
			}

			// 연결된 스트림을 활용해서 바이트 배열을 파일에다가 흘려 보냄
			fos.write(bytes);

			System.out.println("파일출력스트림을 통해서 데이터를 씀");

		} catch (FileNotFoundException e) {
			System.out.println("파일이 없음");
		} catch (IOException e) {
			e.printStackTrace(); // 어디서 오류가 났는데 콘솔에다가 찍어달라는..
		}

		// 동작 이해해 보기
		// 파일에 바이트 단위로 데이터를 쓰고
		// 그 파일을 열었을 때 글자로 보이는 이유는 파일을 읽는 프로그램
		// 파일 내에 바이트 데이터를 문자로 해석해서 보여 주었다.

		long end = System.nanoTime();
		long duraiton = end - start;
		System.out.println("기반 스트림 파일 입출력 소요 시간 : " + duraiton );
		
	}// end of main

}

실행 결과_____

보조스트림의 사용
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

public class MyBufferedOutputStream {

	public static void main(String[] args) {

		// 현재 시간 (시작)
		long start = System.nanoTime(); // (더 정밀한 현재 시간을 출력)

		String data = "기반 스트림 + 보조 스트림을 활용해보자";

		// try - catch - resorce 활용
		try (FileOutputStream fos = new FileOutputStream("output2.txt");
				BufferedOutputStream bos = new BufferedOutputStream(fos);) {

			// 코드 수행 부분
			byte[] bytes = data.getBytes();
			// 보조 스트림 (버퍼)
			bos.write(bytes);
			// 간혹 버퍼에 데이터가 남아 있다면 중복된 데이터를 쓸 수 있다
			// 한 번 사용한 다음에
			bos.flush(); // flush --> 물을 내리다. (버퍼에 담긴 데이터를 비워야 새로운 데이터를 넣을 수 있으니까)

			System.out.println("보조 스트림을 활용한 파일 출력 완료");
			// 시간 측정을 해보고 싶다

		} catch (Exception e) {
			e.printStackTrace();
		}

		// 현재 시간 (종료)
		long end = System.nanoTime();
		// 종료 - 시작 = 소요 시간
		long duraiton = end - start;
		System.out.println("기반 스트림 파일 입출력 소요 시간 : " + duraiton);
		// 실행 코드 안에 다가 적어야됨

	}

}

실행 결과_____

💡중요 !
버퍼를 사용하는 것은 입출력 작업에서 매우 중요한 역할을 하며, 그 원리를 이해하는 것은 데이터 처리의 효율성을 높이는 데 큰 도움이 된다. 버퍼의 사용 원리는 기본적으로 '일괄 처리' 또는 '집단 처리' 방식에 비유할 수 있다.

 

버퍼의 기본 원리

버퍼는 임시 저장 공간을 말하며, 데이터를 최종 목적지(파일, 네트워크, 디스플레이 등)에 쓰기 전에 일시적으로 데이터를 모아 두는 역할을 한다.

  1. 효율성 증가: 작은 데이터 조각들을 바로 전송하거나 저장하는 대신 큰 덩어리로 모아서 한 번에 처리한다. 이 방식은 특히 입출력 연산이 자주 발생하는 상황에서 유용하며, 시스템의 입출력 호출 횟수를 줄여 전체적인 성능을 향상시킨다.
  2. 시스템 부하 감소: 버퍼를 사용하면 데이터를 모아 두었다가 한 번에 처리하기 때문에 자원 사용을 더욱 효율적으로 관리할 수 있다. 이는 디스크 접근 횟수를 줄이거나 네트워크 트래픽을 최적화하는 데 도움을 준다.
  3. 데이터 전송 속도 개선: 데이터를 물리적 장치에 기록할 때, 장치의 처리 속도에 따라 기록 속도가 제한될 수 있다. 버퍼를 사용하면 데이터 전송 속도가 물리적 장치의 속도보다 빠르게 유지될 수 있으므로, 전체 데이터 전송 시간을 단축시킬 수 있다.

버퍼 사용의 단점

버퍼를 사용하는 것은 많은 이점이 있지만, 일부 단점도 있다. 예를 들어, 버퍼가 완전히 채워질 때까지 기다려야 하는 경우 실시간 처리에는 적합하지 않을 수 있다. 또한, 시스템이 예기치 않게 종료될 경우 버퍼에 저장된 데이터는 손실될 수 있다.

'JAVA > Java 기초' 카테고리의 다른 글

[JAVA] 문자 기반 스트림  (0) 2024.05.17
[JAVA] 파일 Copy (바이트기반 입/출력)  (0) 2024.05.17
[JAVA] 파일 입력 스트림(바이트 기반)  (0) 2024.05.16
[JAVA] 표준 입출력  (0) 2024.05.16
[JAVA] Map 인터페이스  (0) 2024.05.16

관련글 더보기