I/O
๐ฟ I/O
input๊ณผ output์ ์ฝ์๋ก ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ํ๋ธ๋ค. ์ฆ, ์ปดํจํฐ ๋ด๋ถ ๋๋ ์ธ๋ถ์์ ์ฅ์น์ ํ๋ก๊ทธ๋จ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ๋งํ๋ค.
๐ฟ NIO
์คํธ๋ฆผ ๊ธฐ๋ฐ I/O์์๋ ๋ฐ์ดํฐ ์์ค์ ๋ฐ์ดํฐ ์ฑํฌ, ์๋ฐ ํ๋ก๊ทธ๋จ๊ฐ์ ๋ฐ์ดํฐ ์ด๋์ ์ํด์ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํธ๋ฆผ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ด๋ค. ์ด๋ฌํ ์ ๊ทผ์ I/O ์ํ์ ๋๋ฆฌ๊ฒ ๋ง๋ ๋ค. NIO๋ ์คํธ๋ฆผ ๊ธฐ๋ฐ I/O๋ ๋๋ฆฐ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. NIO์์๋ I/O์ฒ๋ฆฌ๋ฅผ ์ํด ์ฑ๋๊ณผ ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ค. ์ฑ๋์ stream๊ณผ ๋น์ทํ๋ค. ์ฑ๋์ ๋ฐ์ดํฐ ์์ค/์ฑํฌ ๋ฐ ์๋ฐ ํ๋ก๊ทธ๋จ๊ฐ์ ์ฐ๊ฒฐ์ ๋ํํ๋ค.
Channels
์ผ๋ฐ์ ์ผ๋ก NIO์ ๋ชจ๋ IO๋ ์ฑ๋๋ก ์์ํ๋ค. ์ฑ๋๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ก ์ฝ์ ์ ์๊ณ , ๋ฒํผ์์ ์ฑ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์๋ค. ์ฑ๋์ ์คํธ๋ฆผ๊ณผ ์ ์ฌํ์ง๋ง ๋ช๊ฐ์ง ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค.
- ์ฑ๋์ ํตํด์๋ ์ฝ๊ณ ์ธ ์ ์์ง๋ง, ์คํธ๋ฆผ์ ์ผ๋ฐ์ ์ผ๋ก ๋จ๋ฐฉํฅ(์ฝ๊ธฐ ํน์ ์ฐ๊ธฐ)์ผ๋ก๋ง ๊ฐ๋ฅํ๋ค.
- ์ฑ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๊ณ ์ธ ์ ์๋ค.
- ์ฑ๋์ ํญ์ ๋ฒํผ์์ ๋ถํฐ ์ฝ๊ฑฐ๋ ๋ฒํผ๋ก ์ด๋ค.
Buffer
NIO์ ๋ฒํผ๋ ์ฑ๋๊ณผ ์ํธ์์ฉํ ๋ ์ฌ์ฉ๋๋ค. ์ปค๋์ ์ํด ๊ด๋ฆฌ๋๋ ์์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋ ์ฑ๋์ ์ ํด ์ง์ read ๋๊ฑฐ๋ write ๋ ์ ์๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๊ฐ์ฒด
IO์์๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ด 1๋ฐ์ดํธ๋ฅผ ์ฐ๋ฉด ์ ๋ ฅ ์คํธ๋ฆผ์ด 1๋ฐ์ดํธ๋ฅผ ์ฝ๋๋ค. ์ด๊ฒ ๋ณด๋ค๋ ๋ฒํผ๋ฅผ ์ฌ์ฉํด์ ๋ณต์ ๊ฐ์ ๋ฐ์ดํธ๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ ฅ๋ฐ๊ณ ์ถ๋ ฅํ๋ ๊ฒ์ด ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ธ๋ค.
Selector
์ ๋ญํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ์ฑ๋์ ์ฒ๋ฆฌ(handle)ํ ์ ์๋ค. ํด๋ผ์ด์ธํธ ํ๋๋น ์ฐ๋ ๋ ํ๋๋ฅผ ์์ฑํด์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๋๊ฐ ๋ง์ด ์์ฑ๋ ์๋ก ๊ธ๊ฒฉํ ์ฑ๋ฅ ์ ํ๋ฅผ ๊ฐ์ก๋ ๋จ์ ์ ๊ฐ์ ํ๋ Reactor ํจํด์ ๊ตฌํ์ฒด
NIO ์ IO
๊ตฌ๋ถ | IO | NIO |
---|---|---|
์ ์ถ๋ ฅ ๋ฐฉ์ | ์คํธ๋ฆผ ๋ฐฉ์ | ์ฑ๋ ๋ฐฉ์ |
๋ฒํผ ๋ฐฉ์ | ๋๋ฒํผ | ๋ฒํผ |
๋น๋๊ธฐ ๋ฐฉ์ | ์ง์ ์ํจ | ์ง์ |
๋ธ๋กํน ๋ฐฉ์ | ๋ธ๋กํน ๋ฐฉ์๋ง ์ง์ | ๋ธ๋กํน / ๋๋ธ๋กํน ๋ชจ๋ ์ง์ |
์คํธ๋ฆผ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ์ ์ก์ ์ํด ์ฌ์ฉ๋๋ค. ์ฆ, ์ ๋ ฅ ์คํธ๋ฆผ์ ๋จ์ง ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ์๋ฐ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , ์ถ๋ ฅ ์คํธ๋ฆผ์ ์๋ฐ ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ ์ฑํฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค. ํ์ง๋ง, ์ฑ๋์ ์๋ฐฉํฅ ์ ์ก ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์๋ค.
์คํธ๋ฆผ ๊ธฐ๋ฐ I/O์์ ๋ฐ์ดํฐ ์ ์ก์ ๊ธฐ๋ณธ ๋จ์๋ byte์ด๋ค. ๊ทธ๋ฌ๋ ์ฑ๋๊ธฐ๋ฐ NIO์์๋ ๋ฐ์ดํฐ ์ ์ก์ ๊ธฐ๋ณธ ๋จ์๋ buffer์ด๋ค.
NIO2.0
NIO2์์๋ ๋ชจ๋ ํ์ผ ์์คํ ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค. ํ์ผ ์์คํ ์ NIO2๋ฅผ ํ์ฅํด์ ์ ๊ณตํ๋ค. ๋ํ ํ์ผ ์์คํ ์ ๋ํ ๊ธฐ๋ณธ๊ตฌํ์ ํ์ฉํ ์ ์๊ณ , ํ์ผ ์์คํ ๊ฐ๊ฐ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋ ํ์ผ ์์คํ ์ ๊ธฐ๋ณธ ํ์ผ ์คํผ๋ ์ด์ (copt, move, delete)๋ฅผ ์ ๊ณตํ๋ค. ๋ํ move ์คํผ๋ ์ด์ ์ ์ ๊ณตํ๋ค. ๋ํ ํฅ์๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ ๊ณตํ๋ค.
ํ์ผ์ด ์ถ๊ฐ๋๊ฑฐ๋ ์๋ธ๋๋ ํ ๋ฆฌ๊ฐ ์๊ธฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๋๋ ํ ๋ฆฌ์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ํ์ผ ํธ๋ฆฌ๋ฅผ ํ์ํ ์ ์๋ API๋ ์ ๊ณต๋๋ค.
๋คํธ์ํฌ ์์ผ์ ๋ํ ๋น๋๊ธฐ I/O๋ ์ ๊ณต๋๋ฉฐ, DatagramChannel์ ์ด์ฉํ ๋ฉํฐ์บ์คํ ๋ ์ง์ํ๋ค.
๐ฟ ์คํธ๋ฆผ (Stream)
์คํธ๋ฆผ์ด๋ ์ฐ์์ ์ธ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๋ฌผ์ ๋น์ ํด์ ๋ถ์ฌ์ง ์ด๋ฆ์ธ๋ฐ, ์ฌ๋ฌ ๊ฐ์ง๋ก ์ ์ฌํ ์ ์ด ๋ง๋ค. ๋ฌผ์ด ํ์ชฝ ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅด๋ ๊ฒ๊ณผ ๊ฐ์ด ์คํธ๋ฆผ์ ๋จ๋ฐฉํฅํต์ ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐํ๋ค. ๊ทธ๋์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ํ๋ ค๋ฉด ์ ๋ ฅ์คํธ๋ฆผ๊ณผ ์ถ๋ ฅ์คํธ๋ฆผ์ ๊ฐ๊ฐ ๋ง๋ค์ด ์ด 2๊ฐ์ ์คํธ๋ฆผ์ด ํ์ํ๋ค.
InputStream
๋ฐ์ดํธ ๊ธฐ๋ฐ ์ ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก ์ถ์ํด๋์ค ์ด๋ค. ๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ ๋ ฅ ์คํธ๋ฆผ์ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์์ ๋ง๋ค์ด ์ง๋ค. InputStream ํด๋์ค์๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ ๋ ฅ ์คํธ๋ฆผ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ผ ํ ๋ฉ์๋๋ค์ด ์ ์ ๋์ด ์๋ค.
read()์ close ํจ์๋ฅผ ํตํด ์์ฑ, ํ๊ดด
OutputStream
๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก ์ถ์ํด๋์ค ์ด๋ค. ๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์์ ๋ง๋ค์ด์ง๋ค. OutputStream ํด๋์ค์๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ผ ํ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋ค.
write ์ flush close ํจ์๋ฅผ ํตํด Control
๐ฟ Byte์ Character ์คํธ๋ฆผ
๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋๋จ
Byte Stream
binary ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅํ๋ ์คํธ๋ฆผ์ด๋ค, ์ด๋ฏธ์ง, ๋์์ ๋ฑ์ ์ก์์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- InputStream / OutputStream : byte ๊ธฐ๋ฐ input/output stream์ ์ต๊ณ ์กฐ์
- ByteArrayInputStream / ByteArrayOutputStream : byte array(byte[]) ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅ ํ๋ ํด๋์ค
- FileInputStream / FileOutputStream : ํ์ผ(file)์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅ ํ๋ ํด๋์ค
Character Stream
text ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉํ๋ ์คํธ๋ฆผ์ด๋ค. HTML ๋ฌธ์, ํ ์คํธ ํ์ผ์ ์ก์์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- Reader / Writer : Character ๊ธฐ๋ฐ input / output stream์ ์ต๊ณ ์กฐ์
- FileReader / FileWriter : ๋ฌธ์ ๊ธฐ๋ฐ์ ํ์ผ์ ์ ์ถ๋ ฅ ํ๋ ํด๋์ค
๐ฟ ํ์ค ์คํธ๋ฆผ
- System.in : ํ์ค ์ ๋ ฅ์ฉ ์คํธ๋ฆผ
- System.out : ํ์ค ์ถ๋ ฅ์ฉ ์คํธ๋ฆผ
- System.err : ํ์ค ์ค๋ฅ ์ถ๋ ฅ ์คํธ๋ฆผ
๋ฉ์๋ | ์ค๋ช |
---|---|
System.in.read() | ํค๋ณด๋๋ก ์ ๋ ฅ๋ ๊ฐ์ ์ฝ์ด๋ค์, ๋ ์ด์ ์ฝ์ด๋ค์ผ ์ ์์ผ๋ฉด -1 ๋ฆฌํด |
System.out.write() | ( )์์ ์ ๋ ฅ๋ ๊ฐ์ ํ๋ฉด(์ฝ์)์ ์ถ๋ ฅ, ์ปดํจํฐ๊ฐ ์ซ์๋ก ์ ์ฅํ๊ณ ์๋ ๊ฒ์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฌธ์๋ก ๋์ฝ๋ฉํด์ ์ถ๋ ฅ |
System.out.flush() | ์ถ๋ ฅ์ ๋ฒํผ์ ์ผ์ ์ฉ๋ ์ด์์ด ์์ฌ์ผ ๊ฐ๋ฅํ๋ฐ, ๋ฒํผ๋ฅผ ๋น์์ ๋ฐ๋ก ์ถ๋ ฅํ๋๋ก ํ๋ ๋ฉ์๋. ๋ฐ์ดํฐ๋ฅผ ์ผ์ ์ฉ๋ ์์๋์๋ค๊ฐ ์ถ๋ ฅํ๋ ์ด์ ๋ ์ ์ถ๋ ฅ ์ฑ๋ฅ ํฅ์์ ์ํจ |
๐ฟ File ์ฝ๊ณ ์ฐ๊ธฐ
read
1
2
3
4
5
6
7
8
9
10
11
String fileName = "C:/test.txt" // ์ฝ์ด๋ค์ผ ํ์ผ๋ช
FileReader fileReader = new FileReader(fileName);
BufferedReader reader = new BufferedReader(fileReadrer);
String line = null;
while((line = reader.readLine()) != null) { // readLine() ์ ํ์ค ๋จ์๋ก ์ฝ์ด๋ค์
System.out.println(line);
}
reader.close();
write
1
2
3
4
5
6
7
8
9
String fileName = "C:/test.txt" // ์์ฑํ ํ์ผ๋ช
String str = "abc" // ์์ฑํ ๋ฌธ์์ด
FileWriter fileWriter = new FileWriter(fileName);
BufferedWriter out = new BufferedWriter(fileWriter);
out.write(str); // ์ฐ๊ธฐ
out.newLine(); // ์ค๋ฐ๊พธ๊ธฐ
out.close();