I/O(์ ์ถ๋ ฅ)
I/O๋ Input๊ณผ Output์ ์ฝ์๋ก ์
๋ ฅ๊ณผ ์ถ๋ ฅ, ๊ฐ๋จํ ์ค์ฌ์ ์
์ถ๋ ฅ์ด๋ผ๊ณ ํ๋ค. ์
์ถ๋ ฅ์ ์ปดํจํฐ ๋ด๋ถ ๋๋ ์ธ๋ถ์ ์ฅ์น์ ํ๋ก๊ทธ๋จ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค๋ฉด ํค๋ณด๋๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ๋ฐ๋๋ค๋ ๊ฐ System.out.println()์ ์ด์ฉํด์ ํ๋ฉด์ ์ถ๋ ฅํ๋ค๋๊ฐ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์
์ถ๋ ฅ์ ์์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฐ์ดํฐ๋ ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฌ๋ ์ ์์๊น? Stream, Channel, Buffer๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ทธ๋ฆ๊ณผ ํต๋ก๋ผ๊ณ ํ ์ ์๋ค.
Stream
์คํธ๋ฆผ์ด๋? ๋ฐ์ดํฐ๋ฅผ ์ด๋ฐํ๋๋ฐ ์ฌ์ฉ๋๋ ์ฐ๊ฒฐํต๋ก์ด๋ค.
Stream์ด๋, ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ์์๋๋ก ํ๋ฌ๋ค๋๋ ๋จ๋ฐฉํฅ์ ํต๋ก์ด๋ค. ์
๊ตฌ์ ์ถ๊ตฌ๊ฐ ์กด์ฌํ๋ฉฐ ์
๊ตฌ๋ฅผ InputStream, ์ถ๊ตฌ๋ฅผ OutputStream์ด๋ผ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ Stream์ ํตํด byte ๋๋ byte[] ํํ๋ก ํ๋ฌ๋ค๋๋ค.
๋ฌผ์ด ํ์ชฝ ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅด๋ ๊ฒ๊ณผ ๊ฐ์ดย ๋จ๋ฐฉํฅํต์ ๋งย ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค. ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์
๋ ฅ์คํธ๋ฆผ๊ณผ ์ถ๋ ฅ์คํธ๋ฆผ์ ๊ฐ๊ฐ ๋ง๋ค์ด ์ด 2๊ฐ์ ์คํธ๋ฆผ์ด ํ์ํ๋ค.
Stream์ ๋๊ธฐ์ , blocking ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด ์คํธ๋ฆผ์ ์์ฒญํ๋ฉด ์คํธ๋ฆผ์ ์์ ์ ์ญํ ์ ๋ง์ถฐ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ์ ์์ ๋๊น์ง ๋ค๋ฅธ ์์
์ ํ์ง ๋ชปํ๊ณ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฐ๋ค.
NIO(new IO, Buffer, Channel)
์๋ฐ์ ๊ธฐ๋ณธ ์
์ถ๋ ฅ ๋ฐฉ์์ด์๋ Stream์ blocking ๋ฐฉ์๊ณผ Non-Buffer์ ํน์ง์ผ๋ก ์ธํด ์
์ถ๋ ฅ ์๋๊ฐ ๋๋ฆด ์ ๋ฐ์ ์์๋ค. ์๋ฐ 4๋ถํฐ ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ ์ NIO(new Input Output)์ด java.nio ํจํค์ง์ ํฌํจ๋์ด ๋ฑ์ฅํ์๋ค.
๊ธฐ์กด IO API์์๋ byte streams, character streams๋ฅผ ์ฌ์ฉํ์ง๋ง, NIO์์๋ ์ฑ๋(Channel)๊ณผ ๋ฒํผ(Buffer)๋ฅผ ์ฌ์ฉํ๋ค.
Channel
Channel์ NIO์ ๊ธฐ๋ณธ ์
์ถ๋ ฅ ๋ฐฉ์์ด๋ค.
Channel์ด๋, ๋ฐ์ดํฐ๊ฐ ํ๋ฌ๋ค๋๋ ์๋ฐฉํฅ์ ํต๋ก์ด๋ค. Channel์ Stream๊ณผ ์ ์ฌํ์ง๋ง ๋์ ๋ฐฉ์์ด ๋ค๋ฅด๋ค.
โข
Channel์ ์๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ input/output์ ๊ตฌ๋ถํ์ง ์๋๋ค.
โข
Channel์ Stream๊ณผ ๋ค๋ฅด๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก Buffer๋ฅผ ํตํด์๋ง read์ wrtie๋ฅผ ํ ์ ์๋ buffer ๋ฐฉ์์ด๋ค.
โข
blocking ๋ฐฉ์๊ณผ non-blocking ๋ฐฉ์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (Non-blocking ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์ ๊ณผ๋ํ ์ค๋ ๋ ์์ฑ์ ํผํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅ)
Buffer
Buffer๋, ์์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด์๋ ์ ์๋ ์ผ์ข
์ ํ์ด๋ค. ๋ฐ์ดํธ ๋จ์์ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋ ๋๋ง๋ค Stream์ ์ฆ์ ์ ์กํ๊ฒ ๋๋๋ฐ, ์ด๊ฒ์ ๋์คํฌ ์ ๊ทผ์ด๋ ๋คํธ์ํฌ ์ ๊ทผ๊ณผ ๊ฐ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
Buffer๋ ์ค๊ฐ์์ ์
๋ ฅ์ ๋ชจ์์ ํ๋ฒ์ ์ถ๋ ฅํจ์ผ๋ก์จ I/O์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ์ญํ ์ ํ๋ค.
๊ธฐ์กด I/O์ NIO์ ์ฐจ์ด์
InputStream & OutputStream
InputStream์ Stream ์ค ๋ฐ์ดํฐ๋ฅผ readํ๋ ์
๊ตฌ์ด๊ณ , OutputStreawm์ ๋ฐ์ดํฐ๋ฅผ writeํ๋ ์ถ๊ตฌํ์. ์๋ก ๋ค๋ฅธ ๋ ํด๋ผ์ด์ธํธ๊ฐ Stream์ ์ฌ์ฉํ๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์งํ๋๋ค.
InputStream๊ณผ OutputStream์ Stream์ ์ดํดํ๋ ๊ฐ๋
์ ์ธ ์๋ฏธ์ด๊ธฐ๋ ํ์ง๋ง Java์์๋ ๋ฐ์ดํธ ์ํ์ค๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ์ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ์ํด๋์ ์ถ์ ํด๋์ค์ด๊ธฐ๋ ํ๋ค. ์ฆ, Java์ ๋ชจ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์ InputStream ๋๋ OutputStream ์์ ๋น๋๋๋ค.
Java์์ ์ ๊ณต๋๋ ์คํธ๋ฆผ ํด๋์ค๋ค์ ๋คํ์ฑ์ ์ด์ฉํด ์คํธ๋ฆผ์ ๊ณ์ธตํ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ๋ ํฐ ๋ฐ์ดํฐ ์ ํ์ฒ๋ฆฌ์ ๊ฐ์ ๋ ๋์ ์์ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์๋ ์๋ค.
์ถ์ฒ : https://javanitto.tistory.com/11
InputStream
๋ฐ์ดํธ ๊ธฐ๋ฐ ์
๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก ์ถ์ ํด๋์ค์ด๋ค.
๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์
๋ ฅ ์คํธ๋ฆผ์ ์ด ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ๋ง๋ค์ด์ง๋ค.
InputStream ํด๋์ค์๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์
๋ ฅ ์คํธ๋ฆผ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ผ ํ ๋ฉ์๋๋ค์ด ์ ์๋์ด์๋ค.
OutputStream
๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก ์ถ์ํด๋์ค์ด๋ค.
๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ด ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ๋ง๋ค์ด์ง๋๋ค.
OutputStream ํด๋์ค์๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ผํ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋ค.
Byte & Character ์คํธ๋ฆผ
๋ฐ์ดํฐ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ฌํ๋๋์ ๋ฐ๋ผ ์คํธ๋ฆผ์ ๋๊ฐ์ง๋ก ๋๋๋ค.
๋ฐ์ดํธ ๊ธฐ๋ฐ ์คํธ๋ฆผ - (InputStream, OutputStream)
binary ๋ฐ์ดํฐ๋ฅผ ์
์ถ๋ ฅํ๋ ์คํธ๋ฆผ
์ด๋ฏธ์ง, ๋์์ ๋ฑ์ ์ก์์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ ์
์ถ๋ ฅ๋ค์ ๋ชจ๋ InputStream, OutputStream ํด๋์ค์ ํ์ํด๋์ค์ด๋ฉฐ, ๊ฐ๊ฐ ์ฝ๊ณ ์ฐ๋๋ฐ ํ์ํ ์ถ์ ๋ฉ์๋๋ฅผ ๋ชฉ์ ์ ๋ง๊ฒ ๊ตฌํํด๋์ ๊ตฌํ์ฒด ํด๋์ค์ด๋ค.
๋ฌธ์ ๊ธฐ๋ฐ ์คํธ๋ฆผ - Writer, Reader
Stream์ ๋ฐ์ดํธ ๋จ์๋ ๋ฐ์ดํธ ๋จ์๋ก ์ฐ๊ฒฐํ๊ณ ์บ๋ฆญํฐ ๋จ์๋ ์บ๋ฆญํฐ ๋จ์๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์์น์ด๋ค. ๋ฐ์ดํธ๊ธฐ๋ฐ์ ์
์ถ๋ ฅ ์คํธ๋ฆผ์ ๋จ์ ์ด ์๋ค. ๋ฐ๋ก ์๋ฐ์์ ํ ๋ฌธ์๋ฅผ ๋ํ๋ด๋ ์๋ฃํ์ธ char์ 1byte๊ฐ ์๋ 2byte์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํธ๊ธฐ๋ฐ์ ์คํธ๋ฆผ์ผ๋ก 2byte์ธ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ด๋ ค์์ด ์๋ค.
์ด๋ฌํ ๋ฐ์ดํธ๊ธฐ๋ฐ์ ์
์ถ๋ ฅ ์คํธ๋ฆผ์ ๋จ์ (1byte -> 2byte)์ ๋ณด์ํ๊ธฐ ์ํด ๋ฌธ์๊ธฐ๋ฐ์ ์คํธ๋ฆผ์ ์ ๊ณตํ๋ค. ๋ฌธ์๋ฐ์ดํฐ๋ฅผ ์
์ถ๋ ฅํ ๋๋ ๋ฐ์ดํธ๊ธฐ๋ฐ ์คํธ๋ฆผ ๋์ ๋ฌธ์ ๊ธฐ๋ฐ์คํธ๋ฆผ์ ํ์ฉํ๋ ๊ฒ์ด ์ข์ ํธ์ด๋ค.
InputStream -> Reader
OutputStream -> Writer
ํ์ค ์คํธ๋ฆผ(System.in, System.out, System.err)
์๋ฐ์์๋ ํ์ค ์
์ถ๋ ฅ(standard I/O)์ ์ํด 3๊ฐ์ง ์
์ถ๋ ฅ ์คํธ๋ฆผ, System.in, System.out, System.err์ ์ ๊ณตํ๋๋ฐ, ์ด ๋ค์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ๊ณผ ๋์์ ์ฌ์ฉํ ์ ์๊ฒ ์๋์ ์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ๋ณ๋๋ก ์คํธ๋ฆผ์ ์์ฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ค.
โข
System.in : ํ์ค ์
๋ ฅ์ฉ ์คํธ๋ฆผ
โข
System.out : ํ์ค ์ถ๋ ฅ์ฉ ์คํธ๋ฆผ
โข
System.err : ํ์ค ์ค๋ฅ ์ถ๋ ฅ ์คํธ๋ฆผ
ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ(FileInputStream, FileOutputStream)
FileInputStream๊ณผ FileOutputStream์ ํ์ผ์ ์
์ถ๋ ฅ์ ํ๊ธฐ ์ํ ์คํธ๋ฆผ์ด๋ค.
// ์ฝ๊ธฐ
public class FileIOStreamTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("./src/test.txt");
int data = 0;
while((data=fis.read())!=-1) {
char c = (char)data;
System.out.print(c);
}
}
}
// ์ฐ๊ธฐ
public class FileIOStreamTest2 {
public static void main(String[] args) {
int data = 0;
try {
// FileOutputStream ์ ๋ฌด์กฐ๊ฑด ํด๋น ํ์ผ์ ์์ฑํ๋ค. append ๊ฐ์ true๋ก ํ๊ธฐ ๋๋ฌธ์ ์ด์ด์ ์์ฑํ ์ ์๋ค.
FileOutputStream fos = new FileOutputStream("./src/test2.txt", true);
while((data = System.in.read()) != -1) {
fos.write(data);
}
fos.close(); // ํ์ผ์ ๋ซ๋๋ค.
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java
๋ณต์ฌ
BufferedInputStream๊ณผ BufferedOutputStream
BufferedInputStream๊ณผ BufferedOutputStream์ ์คํธ๋ฆผ์ ์
์ถ๋ ฅ ํจ์จ์ ๋์ด๊ธฐ ์ํด ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ ๋ณด์กฐ์คํธ๋ฆผ์ด๋ค. ํ ๋ฐ์ดํธ์ฉ ์
์ถ๋ ฅ๋๋ ๊ฒ ๋ณด๋ค๋ ๋ฒํผ(๋ฐ์ดํธ๋ฐฐ์ด)๋ฅผ ์ด์ฉํด์ ํ ๋ฒ์ ์ฌ๋ฌ ๋ฐ์ดํธ๋ฅผ ์
์ถ๋ ฅํ๋ ๊ฒ์ด ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.