OutputStream
์
์ถ๋ ฅ(I/O)์ ํ๋์ ์์คํ
์์ ๋ค๋ฅธ ์์คํ
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ ์ํฌ ๋ ์ฌ์ฉํ๋ค. ์๋ฐ๋ ์คํธ๋ฆผ(Stream)์ผ๋ก๋ถํฐ I/O๋ฅผ ์ฌ์ฉํ๋ค.
InputStream์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , OutputStream์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค. FilterStream์ InputStream์ด๋ OutputStream์ ์ฐ๊ฒฐ๋ ์ ์๋ค. FilterStream์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ์ฌ์ฉํ๋ค. (e.g. ์ํธํ, ์์ถ, ํฌ๋งท ๋ณํ)
Stream์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ๋ก ์ฝ๊ณ ์ด๋ค. ๋ฐ์ดํธ๊ฐ ์๋ ํ
์คํธ(๋ฌธ์)๋ฅผ ์ฝ๊ณ ์ฐ๋ ค๋ฉด Reader์ Writer ํด๋์ค๋ฅผ ์ฐ๊ฒฐํ๋ค. Reader, Writer๋ ๋ค์ํ ๋ฌธ์ ์ธ์ฝ๋ฉ(e.g. UTF-8)์ ์ฒ๋ฆฌํ ์ ์๋ค.
์๋ฐ์ ๊ธฐ๋ณธ ์ถ๋ ฅ ํด๋์ค๋ java.io.OutputStream์ด๋ค. OutputStream์ write(int b) ๋ฉ์๋๋ ๊ธฐ๋ฐ ๋ฉ์๋์ด๋ค.
OutputStream์ ๋ค๋ฅธ ๋งค์ฒด์ ๋ฐ์ดํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ์ฌ์ฉํ๋ค. OutputStream์ ์๋ธ ํด๋์ค(subclass)๋ ํน์ ๋งค์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ธฐ ์ํด write(int b) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, FilterOutputStream์ ํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ ๋, DataOutputStream์ ์๋ฐ์ primitive type data๋ฅผ ๋ค๋ฅธ ๋งค์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ์ฌ์ฉํ๋ค.
write ๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ๋ก ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค. write(byte[] data)์ write(byte b[], int off, int len) ๋ฉ์๋๋ 1๋ฐ์ดํธ ์ด์์ ํ ๋ฒ์ ์ ์ก ํ ์ ์์ด ํจ์ฌ ํจ์จ์ ์ด๋ค.
outputStream.write(int byte); // ํน์ ๋ฐ์ดํธ๋ฅผ write
outputStream.write(byte[] b[]); // ๋ฐ์ดํธ ๋ฐฐ์ด์ write
outputStream.toString(); // write ๋ ๊ฑฐ๋ฅผ String ์ผ๋ก ๋ณํํด์ค
Java
๋ณต์ฌ
BufferedOutputStream
ํจ์จ์ ์ธ ์ ์ก์ ์ํด ์คํธ๋ฆผ์์ ๋ฒํผ๋ง์ ์ฌ์ฉ ํ ์ ์๋ค. BufferedOutputStream ํํฐ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ๋ฒํผ๋ง์ด ๊ฐ๋ฅํ๋ค.
๋ฒํผ๋ง์ ์ฌ์ฉํ๋ฉด OutputStream์ ์ฌ์ฉํ ๋ flush๋ฅผ ์ฌ์ฉํ์. flush() ๋ฉ์๋๋ ๋ฒํผ๊ฐ ์์ง ๊ฐ๋ ์ฐจ์ง ์์ ์ํฉ์์ ๊ฐ์ ๋ก ๋ฒํผ์ ๋ด์ฉ์ ์ ์กํ๋ค. Stream์ ๋๊ธฐ(synchronous)๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ฒํผ๊ฐ ์ฐฐ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ฐ๋๋ฝ(deadlock) ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ flush๋ก ํด์ ํ๋ค.
try-with-resources ๋ java9 ๋ถํฐ, ์๋์ผ๋ก close ์์ผ์ค
InputStream
์๋ฐ์ ๊ธฐ๋ณธ ์
๋ ฅ ํด๋์ค๋ java.io.InputStream์ด๋ค. InputStream์ ๋ค๋ฅธ ๋งค์ฒด๋ก๋ถํฐ ๋ฐ์ดํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉํ๋ค. InputStream์ read() ๋ฉ์๋๋ ๊ธฐ๋ฐ ๋ฉ์๋์ด๋ค. public abstract int read() throws IOException;
InputStream์ ์๋ธ ํด๋์ค(subclass)๋ ํน์ ๋งค์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด read() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
read() ๋ฉ์๋๋ ๋งค์ฒด๋ก๋ถํฐ ๋จ์ผ ๋ฐ์ดํธ๋ฅผ ์ฝ๋๋ฐ, 0๋ถํฐ 255 ์ฌ์ด์ ๊ฐ์ int ํ์
์ผ๋ก ๋ฐํํ๋ค. int ๊ฐ์ byte ํ์
์ผ๋ก ๋ณํํ๋ฉด -128๋ถํฐ 127 ์ฌ์ด์ ๊ฐ์ผ๋ก ๋ณํ๋๋ค. ๊ทธ๋ฆฌ๊ณ Stream ๋์ ๋๋ฌํ๋ฉด -1์ ๋ฐํํ๋ค.
is = new ByteArrayInputStream(byte[] b[]); // ์ฝ์ ๋ฐ์ดํธ ๋ฐฐ์ด
new String(is.readAllBytes()); // ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฌธ์๋ก ๋ฐ๊ฟ
Java
๋ณต์ฌ
new String(byte[] b[]) ์์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
BufferedInputStream
ํํฐ๋ ํํฐ ์คํธ๋ฆผ, reader, writer๋ก ๋๋๋ค. ํํฐ๋ ๋ฐ์ดํธ๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํ ํ ๋ ์ฌ์ฉํ๋ค. reader, writer๋ UTF-8, ISO 8859-1 ๊ฐ์ ํ์์ผ๋ก ์ธ์ฝ๋ฉ๋ ํ
์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
BufferedInputStream์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ์ ์ฅํ๋ค. InputStream ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํํฐ ์์ฑ์์ ์ ๋ฌํ๋ฉด ํํฐ์ ์ฐ๊ฒฐ๋๋ค. ๋ฒํผ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋ฒํผ์ ๊ธฐ๋ณธ ์ฌ์ด์ฆ๋ ์ผ๋ง์ผ๊น?
final InputStream bufferedInputStream = new BufferedInputStream(inputStream);
Java
๋ณต์ฌ
BufferedReader, InputStreamReader
์๋ฐ์ ๊ธฐ๋ณธ ๋ฌธ์์ด์ UTF-16 ์ ๋์ฝ๋ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ค. ๋ฐ์ดํธ๋ฅผ ๋ฌธ์(char)๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด ์ธ์ฝ๋ฉ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค. InputStreamReader๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ ๋ ์ธ์ฝ๋ฉ์ ๋ฐ๋ผ ์ ๋์ฝ๋ ๋ฌธ์๋ก ๋ณํํ ์ ์๋ค. reader, writer๋ฅผ ์ฌ์ฉํ๋ฉด ์
์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ฐ์ดํธ๊ฐ ์๋ ๋ฌธ์ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
InputStreamReader๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํธ๋ฅผ ๋ฌธ์(char)๋ก ์ฝ์ด์จ๋ค. ํํฐ์ธ BufferedReader๋ฅผ ์ฌ์ฉํ๋ฉด readLine ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์์ด(String)์ ํ ์ค ์ฉ ์ฝ์ด์ฌ ์ ์๋ค.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
Java
๋ณต์ฌ