퉁탕퉁탕 만들어보자

OutputStream 본문

Computer/Java

OutputStream

호숀티 2022. 5. 7. 01:55
반응형

InputStream을 봤으니 OutputStream도 보자,,

public static void writeToFile(Context context, String fileName, List<String> data) {
    try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
            context.openFileOutput(fileName, Context.MODE_PRIVATE))) {
        for (String str : data) {
            writer.write(str);
            writer.write("\n");
        }
    } catch (IOException e) {
        Log.e(TAG, "IOException occurred during file write: " + e.toString());
    }
}

위의 예제는 Android에서 List<String> data를 file에 쓰는 예제이다.

public OutputStreamWriter(OutputStream out)

OutputStream을 argument로 받아서 생성한다.

 

사용법은 원하는 data형식에 맞는 write함수를 호출해주면된다.

public void write(String str) throws IOException
public void write(char cbuf[]) throws IOException

 

BufferedWriter로 OutputStreamWriter를 한겹 감싸야하는 이유는 무엇일까?

OutputStreamWriter에서 write() 메서드를 호출할 때마다 인코딩 변환기가 지정된 문자에 대해 호출되고, 그 바이트는 기본 출력 스트림에 쓰기 전에 버퍼에 누적된다.  따라서 문자 마다 인코딩변환을 하지 않도록 BufferedWriter 내에서 OutputStreamWriter를 래핑하는 것이 권장된다.

 

그리고 flush() 가 있다.

 public void flush() throws IOException

flush하기전에는 buffer에 있는 상태인데, flush() 를 하면 버퍼에서 즉시 파일로 바로 쓰여지게된다. 여러번 쓰고 마지막에 flush 해주면 버퍼에 있는게 전부 flush 된다. 하지만 이게 바로 실제 file disk장치에 기록은 아니고 버퍼메모리 -> OS 레벨의 추상화된 file에 쓰여지게 된다.

그러면 다 쓰고나서 반드시 flush를 해줘야 할까?

 

BufferedWriter의 경우, 버퍼사이즈가 꽉 차거나 close()호출 시 flush를 해주기 때문에 중간중간 일부러 flush를 하거나 마지막에 꼭 flush를 할 필요는 없다.

 

outputStream역시 inputstream처럼 모두 쓰고나면 close()를 잊지않고 해주는것이 중요하다!!

그래서 편리하게 쓰는 법은 try-with-resource안에서 생성을 해주면 좋다.

 

또 String이 아닌 byte를 stream에 써야할때 쓰는 ByteArrayOutputStream이 있다.

사용법은 toByteArray()하면 byte[]을 받을 수 있다.

이때 바로 메모리가 한꺼번에 쫙! 할당되기 때문에 주의하자.

728x90
반응형

'Computer > Java' 카테고리의 다른 글

HashMap 충돌 (java 8)  (0) 2022.05.08
InputStream  (0) 2022.05.07
Java의 primitive type, reference type, wrapper class  (0) 2022.04.17
Math class - Java  (0) 2022.04.03
String 함수들, 자료구조 - Java  (0) 2022.04.03