sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 오블완
  • 레벨3
  • 안드로이드 스튜디오
  • 레벨2
  • Android Studio
  • spring boot
  • java
  • mariadb
  • JPA
  • 백준
  • 프로그래머스
  • DB
  • kotlin
  • 티스토리챌린지
  • nginx
  • 연습문제
  • docker
  • 고득점KIT
  • 고득점 Kit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

ByteArrayOutputStream 는 어떻게 사용되는 것일까?
Dev Language/Java

ByteArrayOutputStream 는 어떻게 사용되는 것일까?

2021. 5. 5. 02:08
728x90

 필자는 기본적으로 File 에 대한 접근을 할때, `OutputStream`을 상속하는 파일 관리자 클래스를 많이 사용하곤 했다. 예를 들면 아래와 같은 `FileOutputStream`이 대표적이다.

File file = new File(filePath, "파일명")
FileOutputStream fos = new FileOutputStream(file)

 기본적으로 `FileOutputStream, DataOutputStream, BufferedOutputStream` ... 을 호출시 File 관련 파라미터가 위 예제와 같이 존재한다.

 

 그래서 늘 위의 `코드`와 같이 파일과 Steram 클래스의 연결을 통해 I/O 를 처리하였는데, 최근 동료의 코드를 리뷰하면서 ByteArrayOutputStream 클래스를 접하게 되었다. 필자가 접했던 코드는 아래와 같다.

(필자는 해당 부분에서 오류가 난다고 생각했었다.)

// 읽어올 파일
File afile = new File(filepath);
ByteArrayOutputStream out = new ByteArrayOutputStream(); // 컴파일 오류 예상
BufferedInputStream in = new BufferedInputStream(new FileInputStream(afile));

int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0)
{
	out.write(buff, 0, read);
}
// ByteArrayOutputStream은 flush, close를 구현하지 않았다.
// Stream과는 크게 상관이 없기 때문이다.
// 그래서 밑의 out.flush()는 의미없다.
out.flush();
byte[] audioBytes = out.toByteArray();
 `ByteArrayOutputStream`을 보면 `new ByteArrayOutputStream( ? )` ?? 인자가 없다..

 왜 이 부분이 정상적으로 처리되는지 궁금하여 `ByteArrayOutputStream`의 구성을 살펴 보았다.

 

 우선 Java Doc (SE7) 에서는 다음과 같이 설명하고 있다.

https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html

밑줄친 내용
1. data가 적히면 버퍼는 자동으로 커진다
2. data는 toByteArray()와 toString()으로 다시 가져올 수 있다. (즉, toByteArray, toString 사용 가능하다)
3. `ByteArrayOutputStream`을 close하는것은 의미가 없다.

 

다른 내용도 있지만 해당 클래스의 특징은 3부분이라 생각한다. 그중, 1,2번의 특징으로 인해  인자가 없는 생성자의 호출로 인스턴스를 만들어내는 것이 가능한 것이다.

 

`ByteArrayOutputStream`을 선언한 시점에 그것만의 `Buffer(byte[])`를 가지게 되고, write() 하여 내용을 메모리에 적재하게 된다. 그래서 Stream 을 통해 파일을 이미 읽었음에도 toByteArray(), toString() 등으로 접근하여도 IOException 이 발생하지 않게 된다.

 

이것은 `ByteArrayOutputStream`의 생성자이다.

 

인수로 버퍼 사이즈를 설정할 수 있다. 또 밑줄친 설명에 따르면, 필요한 경우 버퍼의 크기가 늘어난다고 하고 있습니다.

728x90

'Dev Language > Java' 카테고리의 다른 글

OS 마다 서로 다른 파일 구분자(Java, File, FileSeparator)  (0) 2021.05.04
    'Dev Language/Java' 카테고리의 다른 글
    • OS 마다 서로 다른 파일 구분자(Java, File, FileSeparator)
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바