-
[Java] Java IO, NIOAndroid/Java 2021. 2. 22. 14:47๋ฐ์ํ
- ์ด ๊ธ์ "์๋ฐ ์จ๋ผ์ธ ์คํฐ๋"์์ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ์ฌ ์์ฑํ์์ต๋๋ค.
Java IO
๋ชจ๋ ํ๋ก๊ทธ๋จ์์๋ ๋ฐ์ดํฐ ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์ ์ ํ์ฐ์ ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ง์ฐ์ค๋ ํค๋ณด๋๋ฅผ ํตํด ์ง์ ์ ๋ ฅ์ ํ์ฌ ํ๋ก๊ทธ๋จ์๊ฒ ์ ์ก์ ํ๊ฑฐ๋, ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ์์๊ฒ ๋ชจ๋ํฐ๋ ํ์ผ ๋ฑ์ผ๋ก ๋ณด๋ด์ด ์ถ๋ ฅํ ์๋ ์์ต๋๋ค. ์๋ฐ์์๋ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆผ(stream) ํํ๋ก ์ ์ถ๋ ฅ์ ํ๊ฒ ๋ฉ๋๋ค. ์คํธ๋ฆผ์ด๋ ์ถ๋ฐ์ ์์ ๋์ฐฉ์ ๊น์ง ์ฐ์์ ์ผ๋ก ํ๋ฌ๊ฐ๋ค๋ ๊ฐ๋ ์ ๋ปํฉ๋๋ค.
ํ๋์ ์คํธ๋ฆผ์ ๊ฐ์ง๊ณ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ํ ์๋ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ก์ ์ธก์ธ์ง, ์์ ์ธก์ธ์ง์ ๋ฐ๋ผ ์คํธ๋ฆผ์ ์ข ๋ฅ๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค. ํ๋ก๊ทธ๋จ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ ๋๋ InputStream์ ์ฌ์ฉํ๊ณ , ํ๋ก๊ทธ๋จ์ด ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ ๋๋ OutputStream์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์๋ฐ์ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ์ Java.io ํจํค์ง์์ ์ ๊ณตํฉ๋๋ค. ํ์์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ Java.io ํจํค์ง์๋ File ํด๋์ค์ ๋ค์ํ ์ ์ถ๋ ฅ ์คํธ๋ฆผ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
InputStream
InputStream์ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก abstract class์ ๋๋ค. ๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ ๋ ฅ ์คํธ๋ฆผ์ InputStrem ํด๋์ค๋ฅผ ์์๋ฐ์์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
import java.io.FileInputStream; import java.io.IOException; public class IOstream { public static void main(String[] args) { FileInputStream fileInputStream = null; String inputFilePath = "src/IOExample.java"; try { fileInputStream = new FileInputStream(inputFilePath); int i = 0; do{ i = fileInputStream.read(); System.out.print((char)i); }while(i!=-1); } catch (IOException e) { e.printStackTrace(); } } }
OutputStream
OutputStream๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก abstract class์ ๋๋ค. ๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ๋ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class IOstream { public static void main(String[] args) { FileInputStream fileInputStream = null; FileOutputStream outputStream = null; String inputFilePath = "src/IOExample.java"; // ํ์ผ๋ช String outputFilePath = "src/NewIOExample.java"; // ํ์ผ๋ช try { fileInputStream = new FileInputStream(inputFilePath); byte[] b = new byte[10]; System.out.println(fileInputStream.read(b)); System.out.println((new String(b))); outputStream = new FileOutputStream(outputFilePath); outputStream.write(b); } catch (IOException e) { e.printStackTrace(); } } }
Character Stream
์์ ์ค๋ช ์ ํ InputStream๊ณผ OutputStream ๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ์ผ๋ก ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค๋ก ๋ฐ์ดํธ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค. ๋ฐ์ดํฐ ์ ์กํ๋ ์ ์ถ๋ ฅ ๋์์ ๋ฐ๋ผ ์ ๊ณตํ๋ ํด๋์ค๋ง ๋ค๋ฅผ ๋ฟ์ ๋๋ค. Charater Stream์ ๋ฌธ์ ๋จ์ ๊ธฐ๋ฐ ์ ์ถ๋ ฅ์ผ๋ก Reader์ Writer ํด๋์ค๊ฐ ์ต์์ ํด๋์ค์ ๋๋ค. ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฌธ์๊ธฐ๋ฐ ์คํธ๋ฆผ์ ๋๋ค.
import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class IOstream { public static void main(String[] args) { Reader reader = null; String inputFilePath = "src/IOExample.java"; try { reader = new FileReader(inputFilePath); int data = 0; do{ data = reader.read(); System.out.print((char)data); }while(data!=-1); } catch (IOException e) { e.printStackTrace(); } } }
ํ์ค ์คํธ๋ฆผ
Java์์๋ System ํด๋์ค์ in, out, err๋ฅผ ์ด์ฉํ์ฌ ํค๋ณด๋๋ฅผ ํตํ ์ ์ถ๋ ฅ ๋ฐฉ๋ฒ์ธ ํ์ค ์ ์ถ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. System ํด๋์ค๋ ์๋ฐ ๊ฐ์ ๋จธ์ ์ด ๊ตฌ์ฑํ๊ณ ์๋ ํ์ค ์ฅ์น ํด๋์ค์ ๋๋ค. ์๋ฐ ๊ฐ์ ๋จธ์ ์ ๊ทธ ์์ฒด๊ฐ ํ๋์ ์ปดํจํฐ ํ๋ซํผ์ด๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด์ ํ์ค ์ ๋ ฅ๊ณผ ํ์ค ์ถ๋ ฅ์ด System ํด๋์ค์ ๋ฑ๋ก๋์ด ์์ต๋๋ค.
- System.in
System.in์ inputstream ์ผ๋ก ์ค์ inputstream์ ์ถ์ํด๋์ค์ฌ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ง๋ง System.in์ ์ค์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ฌ ์ ๋ ฅ์ ๋ฐ์ ์ ์์ต๋๋ค.
- System.out
Systemout์ ํ์ค ์ถ๋ ฅ์ฅ์น๊ณ PrintStream ํ์ ์ ๋๋ค. PrintStream์ OutputStream ํด๋์ค๋ฅผ ์์๋ฐ์ Exception์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ ๋ฉ์๋๋ก๋ง ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๊ทธ ์ด์ ๋ก System.out์ผ๋ก ์ถ๋ ฅ ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋ฉ๋๋ค.
- System.err
System.err ๋ ํ์ค ์๋ฌ ์ถ๋ ฅ ์ฅ์น๋ก PrintStream ํ์ ์ ํด๋น๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ๋ System.out๊ณผ ๋์ผํ์ง๋ง, ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ ๋ฌํด์ผํ ๋ด์ฉ์ System.err๋ก ๋๊ฐ๋๋ค.
import java.io.IOException; public class SystemStream { public static void main(String[] args) { int count = 0; int data; try{ while((data = System.in.read())!=-1){ count++; System.out.write(data); } } catch (IOException e) { e.printStackTrace(); System.err.println(e); } System.out.println(); System.out.println("total bytes : "+count); } }
Java NIO
์๋ฐ์ NIO(New I/O)๋ฅผ ์ค๋ช ํ๊ธฐ ์ ์ NIO๊ฐ ๋ํ๋๊ฒ ๋ ๋ฐฐ๊ฒฝ์ ์ดํดํด์ผ ํฉ๋๋ค. Java I/O์ ํฐ ๋จ์ ์ธ ์ค๋์๊ฐ์ ์๋ฐ์ธ์ด์ ํน์ฑ์ผ๋ก ์ปค๋ ๋ฒํผ์ ์ง์ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ๊ณผ I/O ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์น๋ ๋์ ์์ ์์ฒญํ ์ฐ๋ ๋๋ ๋ธ๋กํน๋๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฐ I/o ํ๋ก์ธ์ค ๊ณผ์
- ํ๋ก์ธ์ค๊ฐ file์ ์ฝ๊ธฐ ์ํด kernel ๋ช ๋ น์ ์ ๋ฌํฉ๋๋ค.
- Kernel์ system call(read())์ ์ฌ์ฉํฉ๋๋ค.
- ๋์คํฌ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฌผ๋ฆฌ์ ๋์คํฌ๋ก๋ถํฐ ํ์ผ์ ์ฝ์ด์ต๋๋ค.
- DMA(Direct Memory Access)์ ์ด์ฉํ์ฌ ์ปค๋ ๋ฒํผ๋ก ๋ณต์ฌํฉ๋๋ค.
- Process ๋ด๋ถ ๋ฒํผ๋ก ๋ณต์ฌํฉ๋๋ค.
๊ธฐ์กด I/O์ ๋ฌธ์
- JVM ๋ด๋ถ ๋ฒํผ๋ก ๋ณต์ฌ์, CPU ์ฐ์ฐ์ด ํ์ํ๋ฐ CPU ์ฐ์ฐ์ ๋ฆฌ์์ค๋ฅผ ํฌ๊ฒ ์ก์๋จน๊ฒ ๋๋ค.
- Java I/O ๋ด๋ถ ๋ฒํผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ ๋ณ์๋ GC ๋์์ด ๋๋๋ฐ ์ด ์ญ์๋ ํฐ ์ค๋ฒํค๋ ์์์ ๋๋ค.
- I/O ์์ฒญ๋ ์ฐ๋ ๋๋ ๋ธ๋กํน์ด ๋์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ก ๋ณต์ฌํ๋๋ฐ๊น์ง ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค. ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ง์ํ ์ง๋ผ๋ ์๋ง์ ์์ฒญ ์์ Context-Swithing์ ๋ฐ๋ฅธ ์ค๋ฒํค๋๋ ํด ๊ฒ์ ๋๋ค.
Buffer I/O
IO์์์ ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ ํ ๋ฐ์ดํธ์ฉ ์ฝ๊ณ ์ถ๋ ฅ์ ํ๊ฒ ๋ฉ๋๋ค. cpu์ ์๋๊ฐ ๋น ๋ฅด๊ณ ์ ์ถ๋ ฅ ์๋๋ ๋๋ฆฌ์ง๋ง ์ด๋ ๊ฒ ์ ์ถ๋ ฅ์ ๋ฐ๊ฒ ๋๋ฉด cpu์ ํจ์จ์ ์ต๋ํ์ผ๋ก ์ด๋์ด ๋ผ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํด์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํธ๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ ฅ๋ฐ๊ณ ์ ์ฅํ๋ค๊ฐ ํ๋ฒ์ ์ถ๋ ฅํ๋ ํํ๋ก ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ๋์ ๋๋ค. I/O๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒํผ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฒํผ ์ ๊ณตํด์ฃผ๋ ์คํธ๋ฆผ์ธ BufferedInputStream๊ณผ BufferedOutputStream์ ์ด์ฉํฉ๋๋ค. NIO์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒํผ๊ฐ ์ง์๋๋ฉฐ, ์์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋ Buffer ํด๋์ค๊ฐ ๋์ ๋์์ต๋๋ค.
Channel I/O
๊ธฐ์กด I/O๋ blocking ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ ์คํธ๋ฆผ, ์ถ๋ ฅ ์คํธ๋ฆผ์ด ๋ฌ๋์ต๋๋ค. ํ์ง๋ง Java NIO๋ Non-blocking ๋ฐฉ์์ด๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด์ ์ค๋ ๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ๋ฒํผ ์ฌ์ด์ ์ผ์ข ์ ํฐ๋์ ๋ง๋ค์ด ์ค์ผํฉ๋๋ค. ์ด ์ญํ ์ ์ฑ๋์ด ํ๊ฒ ๋ฉ๋๋ค.
- Socket๊ณผ ์ฐ๊ฒฐ๋์ด ์ ์ถ๋ ฅ ์ญํ ์ ์ํํ๊ณ , ๋์์ ํ ์ ์์ต๋๋ค.
- Selector์ ์ฐ๊ฒฐ๋์ด ์๊ณ , ํ๋์ Selector์๋ ๋ค์์ ์ฑ๋์ด ์กด์ฌํฉ๋๋ค.
ํ๋์ ์ค๋ ๋์ ์ฌ๋ฌ ์ฑ๋์ด ์ฐ๊ฒฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ค I/O์ ์ ์ถ๋ ฅ์ ํ ์ง ์ ํด์ผ ํฉ๋๋ค. ์ด๋ด ๋ Selector๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ I/O์ ์ฐ๊ฒฐํ ์ง๋ฅผ ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. Selector๋ ์ฑ๋์ ์ ํํ๋ ๊ธฐ๋ฅ์ ํ๊ณ , ์ ํ๋ ์ฑ๋์ด ์ค๋ ๋์ ๋ฒํผ๋ฅผ ์ฐ๊ฒฐ์์ผ I/O๋ฅผ ์งํํ๋ ๋ฐฉ์์ด NIO์ ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฐ์ํ'Android > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋๋ค์์ด๋? (0) 2021.03.21 [Java] Java Generic(์ ๋ค๋ฆญ) (0) 2021.03.01 [Java] Annotation, Meta data๋? (0) 2021.02.19 [Java] Enum์ด๋? (0) 2021.02.14 [Java] ์๋ฐ ์ฐ๋ ๋ ๊ต์ฐฉ์ํ(deadlock) (2) 2021.02.07