필자는 기본적으로 File 에 대한 접근을 할때, `OutputStream`을 상속하는 파일 관리자 class를 많이 사용하곤 했다. 예를 들면 아래와 같은 `FileOutputStream`이 대표적이다.
File file = new File(filePath, "파일명")
FileOutputStream fos = new FileOutputStream(file)
기본적으로 `FileOutputStream`, `DataOutputStream`, `BufferedOutputStream` ... 등은 그들을 부를때 파라미터가 존재하는법이다. 이들을 연결시켜줄 객체가 필요하기 때문이다.
그래서 늘 위의 `코드`와 같이 사용하곤 했었는데, 최근에 친구의 코드를 리뷰하면서 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부분이다. 그중, 첫번째와 두번째로 인해서 위의 코드가 가능할것이다.
`ByteArrayOutputStream`을 선언한 시점에 그것만의 `Buffer(byte[])`를 가지게 되고, 그것의 저장소에 .write()하여 내용을 적게 되는것이다. 또 toByteArray()를 이용하여 Array화 할 수 있는것도 특징이라고 볼 수 있다.
이것은 `ByteArrayOutputStream`의 생성자 코드이다.
값이 아무것도 없으면 초기값을 가지게되고, 만약 값을 넣게되면 그것만큼의 사이즈를 가지게 된다. 밑줄친 설명을 보면 필요하면 size를 증가시킨다고 나와있다.
'Java' 카테고리의 다른 글
OS 마다 서로 다른 파일 구분자(Java, File, FileSeparator) (0) | 2021.05.04 |
---|