์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ์ฝ๋์
- ๊ฐ์ฌ์ค
- Git
- GitHub
- java
- ํด๋ฆฐ์ฝ๋
- ๊ธฐ์ด100์
- spring security
- ์๊ณ ๋ฆฌ์ฆ
- H2 ์ค์น
- springboot
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- Codeup
- ์คํ๋ง
- Postman
- ํด๋ฆฐ ์ฝ๋
- MySQL
- JPA
- golang
- Gradle
- thymeleaf
- mariadb
- ๋กฌ๋ณต
- Spring
- Vue.js
- Spring Boot
- go
- ํ์ด์ฌ
- ์ค๋ธ์
- Python
- Today
- Total
nyximos.log
[Java] I/O ๋ณธ๋ฌธ
๐ฉ๐ ๋ชฉํ
์๋ฐ์ Input๊ณผ Ontput์ ๋ํด ํ์ตํ์ธ์.
๐ฉ๐ป ํ์ตํ ๊ฒ
- ์คํธ๋ฆผ (Stream) / ๋ฒํผ (Buffer) / ์ฑ๋ (Channel) ๊ธฐ๋ฐ์ I/O
- InputStream๊ณผ OutputStream
- Byte์ Character ์คํธ๋ฆผ
- ํ์ค ์คํธ๋ฆผ (System.in, System.out, System.err)
- ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ
I/O ์ ์ถ๋ ฅ
- Input/Output์ ์ฝ์, ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ปํ๋ค.
- ์ปดํจํฐ ๋ด๋ถ ๋๋ ์ธ๋ถ ์ฅ์น์ ํ๋ก๊ทธ๋จ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๊ฒ
- ex) ํค๋ณด๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ, System.out.println()์ ์ด์ฉํด ํ๋ฉด์ ๋ฐ์ดํฐ ์ถ๋ ฅ
- I/O : ์คํธ๋ฆผ ๋ฐฉ์, ๋น๋๊ธฐ ์ง์ ๐ โ๏ธ, Blocking ์ง์, ๋ฒํผ๐ โ๏ธ
- NIO : ์ฑ๋๋ฐฉ์, ๋น๋๊ธฐ ์ง์ ๐โ๏ธ, Blocking/Non-Blocking ์ง์, ๋ฒํผ๐โ๏ธ
์คํธ๋ฆผ stream
- ํ ์ชฝ์์ ๋ค๋ฅธ ์ชฝ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๋ ๋์์ ์ฐ๊ฒฐํ๊ณ ์ ์กํ ์ ์๋ ๊ฒ
- ์ฝ๊ฒ ๋งํด์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฐํ๋๋ฐ ์ฌ์ฉ๋๋ ์ฐ๊ฒฐ ํต๋ก
- ๋จ๋ฐฉํฅํต์ ๋ง ๊ฐ๋ฅ → ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๐ค ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋์์ ์ํํ๋ ค๋ฉด?
- ์ ๋ ฅ์คํธ๋ฆผ input stream๊ณผ ์ถ๋ ฅ์คํธ๋ฆผ output stream, ๋ ๊ฐ์ ์คํธ๋ฆผ์ด ํ์ํ๋ค.
- Queue์ ๊ฐ์ FIFO ๊ตฌ์กฐ๋ก ๋์ด ์๋ค.
- ๋จผ์ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๋ฐ๊ณ ์ค๊ฐ์ ๊ฑด๋๋ ์์ด ์ฐ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
[๊ทธ๋ฆผ ์ฒจ๋ถ]
NIO New Input/Output
- ์๋ก์ด ์ ์ถ๋ ฅ
- Java 4๋ถํฐ ์๋ก์ด ์ ์ถ๋ ฅ API๋ฅผ ์ง์ํ๋ค.
- ๋น๋๊ธฐ ์ง์๐โ๏ธ, Non-blocking IO API ์ ๊ณต
- Channel ๊ธฐ๋ฐ
- ์คํธ๋ฆผ๊ณผ ๋ฌ๋ฆฌ ์๋ฐฉํฅ ์ ์ถ๋ ฅ ๊ฐ๋ฅ
- ํ๋์ ์ฑ๋๋ก ์ฝ๊ธฐ ์ฐ๊ธฐ ๋ชจ๋ ํ ์ ์๋ค.
๐ต Blocking๊ณผ Non-blocking
๊ด์ฌ์ฌ : ์ ์ด๊ถ์ด ๋๊ตฌ์๊ฒ ์๋๊ฐ
Blocking
- ์ด์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ
- A ํจ์๊ฐ B ํจ์ ํธ์ถ์, A์์ B์๊ฒ๋ก ์ ์ด๊ถ์ ๋๊ธด๋ค.
A ํจ์๋ ์ ์ด๊ถ์ด ์์ผ๋ฏ๋ก ์คํ์ ๋ฉ์ถ๊ณ
B ํจ์ ์คํ์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ๊ณผ ์ ์ด๊ถ์ Aํจ์์๊ฒ ๋ฐํํ๋ค.
Non-Blocking
- ์์ ์๋ฃ ์ฌ๋ถ์ ์๊ด ์์ด ๋ค์ ์์ ์ํ
- ํ๋์ ์ฐ๋ ๋๋ก ์ฌ๋ฌ ๊ฐ์ I/O ์ฒ๋ฆฌ
- A ํจ์๊ฐ B ํจ์ ํธ์ถ์, B ํจ์๋ ์คํ๋์ง๋ง A ํจ์๊ฐ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๋ค.
B ํจ์์ ์คํ์ด ๋๋์ง ์๋๋ผ๋ A๋ ๊ณ์ ์คํํ๋ค.
๋ฒํผ (Buffer)
- ์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ๋ ๊ณต๊ฐ
- ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ OS์ API ํธ์ถ ํ์๊ฐ ์ค์ด๋ ๋ค → ์ ์ถ๋ ฅ ์ฑ๋ฅ ๊ฐ์
- ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋ฐ๋ผ ์ข
๋ฅ์ ๋๋๋ค.
-Buffer
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- ShortBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
https://docs.oracle.com/javase/8/docs/api/java/nio/package-summary.html#buffers
์ฑ๋ (Channel)
- ๋ฐ์ดํฐ๊ฐ ํต๊ณผํ๋ ์คํธ๋ฆผ
- file๊ณผ socket ๊ฐ์ I/O ์์
์ ์ํํ ์ ์๋ ์ํฐํฐ์ ๋ํ ์ฐ๊ฒฐ์ ๋ํ๋ธ๋ค.
- FileChannel
- SocketChannel
- DatagramChannel
- AsynchronounsChannel
- ์๋ฐฉํฅ ์ ์ถ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.
- ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค.
https://docs.oracle.com/javase/8/docs/api/java/nio/channels/package-summary.html#package.description
InputStream๊ณผ OutputStream
๋ชจ๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์คํธ๋ฆผ์ ์กฐ์
InputStream
์ด ์ถ์ ํด๋์ค๋ ๋ฐ์ดํธ์ ์ ๋ ฅ ์คํธ๋ฆผ์ ๋ํ๋ด๋ ๋ชจ๋ ํด๋์ค์ ์ํผ ํด๋์ค์ ๋๋ค.
- int available() : ์ฝ๋ฆผ์ผ๋ก๋ถํฐ ์ฝ์ด์ฌ ์ ์๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ค.
- void close() : ์คํธ๋ฆผ์ ๋ซ์์ผ๋ก์จ ์ฌ์ฉํ๊ณ ์๋ ์์์ ๋ฐํํ๋ค.
- void mark(int readlimit) : ํ์ฌ ์์น๋ฅผ ํ์ํด ๋๋๋ค. readlimit๋ ๋๋์ ๊ฐ ์ ์๋ byte์ ์์ด๋ค.
- boolean markSupported() : mark()์ reset()์ ์ง์ํ๋์ง ์๋ ค์ค๋ค.
- abstract int read() : ๋ค์ 1byte๋ฅผ ์ฝ์ด์จ๋ค. ์ฝ์ด์ฌ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด -1์ ๋ฐํํ๋ค.
- int read(byte[] b) : ๋ฐฐ์ด b์ ํฌ๊ธฐ๋งํผ ์ฝ์ด์ ๋ฐฐ์ด์ ์ฑ์ฐ๊ณ ์ฝ์ด์จ ๋ฐ์ดํฐ์ ์๋ฅผ ๋ฐํํ๋ค.
- int read(byte[] b, int off, int len) : ์ต๋ len๊ฐ์ byte๋ฅผ ์ฝ์ด์ ๋ฐฐ์ด b์ ์ง์ ๋ ์์น off ๋ถํฐ ์ ์ฅํ๋ค.
- void reset() : ์คํธ๋ฆผ์์์ ์์น๋ฅผ ๋ง์ง๋ง์ผ๋ก mark()์ด ํธ์ถ๋์๋ ์์น๋ก ๋๋๋ฆฐ๋ค.
- long skip(long n) : ์คํธ๋ฆผ์์ ์ฃผ์ด์ง ๊ธธ์ด n๋งํผ ๊ฑด๋๋ด๋ค.
https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html
OutputStream
์ด ์ถ์ ํด๋์ค๋ ๋ฐ์ดํธ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ํ๋ด๋ ๋ชจ๋ ํด๋์ค์ ์ํผ ํด๋์ค์ ๋๋ค.
- void close() : ์ ๋ ฅ ์์ค๋ฅผ ๋ซ์์ผ๋ก์จ ์ฌ์ฉํ๊ณ ์๋ ์์์ ๋ฐํํ๋ค.
- void flush() : ์คํธ๋ฆผ์ ๋ฒํผ์ ์๋ ๋ชจ๋ ๋ด์ฉ์ ์ถ๋ ฅ ์์ค์ ์ด๋ค.
- abstract void write(int b) : ์ฃผ์ด์ง ๊ฐ์ ์ถ๋ ฅ์์ค์ ์ด๋ค.
- void write(byte[] b) : ์ฃผ์ด์ง ๋ฐฐ์ด b์ ์ ์ฅ๋ ๋ชจ๋ ๋ด์ฉ์ ์ถ๋ ฅ ์์ค์ ์ด๋ค.
- void write(byte[] b, int off, int len) : ์ฃผ์ด์ง ๋ฐฐ์ด b์ ์ ์ฅใ ๋ ๋ด์ฉ ์ค์์ off ๋ฒ์งธ๋ถํฐ len๊ฐ ๋งํผ๋ง์ ์ฝ์ด์ ์ถ๋ ฅ ์์ค์ ์ด๋ค.
Byte์ Character ์คํธ๋ฆผ
Byte Stream
๋ฐ์ดํธ ๊ธฐ๋ฐ ์คํธ๋ฆผ
์ ์ถ๋ ฅ ๋จ์๊ฐ 1๋ฐ์ดํธ
์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ด๋ค.
- InputStream/OutputStream : ์ต๊ณ ์กฐ์
- FileInputStream/FileOutputStream : ํ์ผ
- ByteArrayInputStream/ByteArrayOutputStream : ๋ฉ๋ชจ๋ฆฌ (byte ๋ฐฐ์ด)
- PipeInputStream/PipeOutputStream : ํ๋ก์ธ์ค (ํ๋ก์ธ์ค๊ฐ์ ํต์ )
- AudioInputStream/AudioOutputStream : ์ค๋์ค ์ฅ์น
Character Stream
๋ฌธ์ ๊ธฐ๋ฐ ์คํธ๋ฆผ
C์ธ์ด์ ๋ฌ๋ฆฌ Java์์๋ ํ๋ฌธ์๋ฅผ ์๋ฏธํ๋ charํ์ด 2byte์ด๋ฏ๋ก ๋ฐ์ดํธ ๊ธฐ๋ฐ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ์ ์ด๋ ค์์ด์๋ค.
์ด ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฌธ์ ๊ธฐ๋ฐ ์คํธ๋ฆผ์ ์ ๊ณตํ๋ค.
๋จ์ํ 2๋ฐ์ดํธ๋ก ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ง์ ์๋ฏธํ์ง๋ ์๋๋ค.
๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ํ์ํ ๋ ํ๋์ ์ ๋ณด๋ ์ธ์ฝ๋ฉ์ด๋ค.
๋ฌธ์๊ธฐ๋ฐ ์คํธ๋ฆผ์ ์ ๋์ฝ๋(UTF-16) ๊ฐ์ ๋ณํ์ ์๋์ ์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค. (์๋ฐ๋ ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์๋ฅผ ์ ์ฅ)
Reader : ํน์ ์ธ์ฝ๋ฉ์ ์ฝ์ด์ ์ ๋์ฝ๋๋ก ๋ณํ
Writer : ์ ๋์ฝ๋๋ฅผ ํน์ ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํํ์ฌ ์ ์ฅ
- FileReader/FileWriter
- CharArrayReader/CharArrayWriter
- PipeReader/PipeWriter
- StringReader/StringWriter :
ํ์ค ์คํธ๋ฆผ (System.in, System.out, System.err)
์ฝ์(console, ๋์ค์ฐฝ)์ ํตํ ๋ฐ์ดํฐ ์ ๋ ฅ๊ณผ ์ฝ์๋ก์ ๋ฐ์ดํฐ ์ถ๋ ฅ์ ์๋ฏธ
์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํ๊ณผ ๋์์ ์ฌ์ฉํ ์ ์๊ฒ ์๋์ ์ผ๋ก ์์ฑ
๊ฐ๋ฐ์๊ฐ ๋ณ๋์ ์คํธ๋ฆผ์ ์์ฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ฌ์ฉ ๊ฐ๋ฅ
- System.in : ์ฝ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ๋ฐ๋๋ฐ ์ฌ์ฉ (ํ์ค ์ถ๋ ฅ)
- System.out : ์ฝ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉ (ํ์ค ์ ๋ ฅ)
- System.err : ์ฝ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉ (ํ์ค ์ ๋ ฅ)
Systemํด๋์ค์ ์์ค์์ ์ ์ ์๋ฏ์ด in, out, err์ System ํด๋์ค์ ์ ์ธ๋ ํด๋์ค ๋ณ์(static ๋ณ์)์ด๋ค.
์ ์ธ ๋ถ๋ถ๋ง ๋ด์๋ out, err, in ์ ํ์ ์ InputStream๊ณผ PrintStream์ด์ง๋ง,
์ค์ ๋ก๋ ๋ฒํผ๋ฅผ ์ด์ฉํ๋ BufferedInputStream๊ณผ BufferedOutputStream์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ
๋ฐ์ดํธ ์คํธ๋ฆผ
- FileInputStream, FileOutputStream ์ด์ฉํด์ ์ด๋ฏธ ์กด์ฌํ๋ ํ์ผ์ ์ฝ๊ณ ํ์ผ ์์ฑํ๊ธฐ
- ๋ฎ์ ์์ค์ ์ ์ถ๋ ฅ ์ฌ์ฉ
public class FileTest {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("C:/input.txt"); // ํ์ผ ์
๋ ฅ ์คํธ๋ฆผ ์์ฑ
out = new FileOutputStream("C:/output.txt"); // ํ์ผ ์ถ๋ ฅ ์คํธ๋ฆผ ์์ฑ
int c;
// ํ๋์ ๋ฐ์ดํธ๋ฅผ ์ฝ์ ๋๋ read()๋ฅผ ์ฌ์ฉํ๊ณ
// ํ๋์ ๋ฐ์ดํธ๋ฅผ ์ธ ๋๋ write()๋ฅผ ์ฌ์ฉํ๋ค.
while ((c = in.read()) != -1 ){
out.write(c);
}
} finally {
if (in != null){
in.close();
}
if (out != null){
out.close();
}
}
}
}
๋ฌธ์ ์คํธ๋ฆผ
- ํ ์คํธ ํ์ผ์ ์ฝ๊ณ ์ฐ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ
- FileInputStream๊ณผ FIleOutputStream ๋์ ์ FileReader์ FileWriter๋ฅผ ์ฌ์ฉํ๋ค.
public class FileTest {
public static void main(String[] args) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("C:/input.txt"); // ํ์ผ ์
๋ ฅ ์คํธ๋ฆผ ์์ฑ
out = new FileWriter("C:/output.txt"); // ํ์ผ ์ถ๋ ฅ ์คํธ๋ฆผ ์์ฑ
int c;
// ํ๋์ ๋ฐ์ดํธ๋ฅผ ์ฝ์ ๋๋ read()๋ฅผ ์ฌ์ฉํ๊ณ
// ํ๋์ ๋ฐ์ดํธ๋ฅผ ์ธ ๋๋ write()๋ฅผ ์ฌ์ฉํ๋ค.
while ((c = in.read()) != -1 ){
out.write(c);
}
} finally {
if (in != null){
in.close();
}
if (out != null){
out.close();
}
}
}
}
https://docs.oracle.com/javase/tutorial/essential/io/index.html
๋จ๊ถ์ฑ, ์๋ฐ์ ์ ์ ๊ธฐ์ดํธ, ๋์ฐ์ถํ, 201
์ฒ์ธ๊ตญ, ์ด์์ JAVA๋ ์ฒ์์ด์ง!, INFINITYBOOKS, 2015
[10๋ถ ํ ์ฝํก] ๐ง ์ฐ์ Block vs Non-Block & Sync vs Async
๋๊ธฐ/๋น๋๊ธฐ, ๋ธ๋กํน/๋ ผ๋ธ๋กํน
'Programming > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋๋ค์ (0) | 2023.03.29 |
---|---|
[Java] ์ ๋ค๋ฆญ (1) | 2022.09.26 |
[Java] ์ ๋ ธํ ์ด์ (1) | 2022.09.11 |
[Java] Enum (1) | 2022.09.08 |
[Java] ๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.09.06 |