Posts Java IO
Post
Cancel

Java IO

I/O


๐Ÿ’ฟ I/O

input๊ณผ output์˜ ์•ฝ์ž๋กœ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ์ปดํ“จํ„ฐ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์™€์˜ ์žฅ์น˜์™€ ํ”„๋กœ๊ทธ๋žจ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.


๐Ÿ’ฟ NIO

์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜ I/O์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๋ฐ์ดํ„ฐ ์‹ฑํฌ, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ด๋™์„ ์œ„ํ•ด์„œ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ์ŠคํŠธ๋ฆผ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ด๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ์€ I/O ์ˆ˜ํ–‰์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ ๋‹ค. NIO๋Š” ์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜ I/O๋Š” ๋Š๋ฆฐ ์†๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. NIO์—์„œ๋Š” I/O์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฑ„๋„๊ณผ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฑ„๋„์€ stream๊ณผ ๋น„์Šทํ•˜๋‹ค. ์ฑ„๋„์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค/์‹ฑํฌ ๋ฐ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋Œ€ํ‘œํ•œ๋‹ค.

image

Channels

์ผ๋ฐ˜์ ์œผ๋กœ NIO์˜ ๋ชจ๋“  IO๋Š” ์ฑ„๋„๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์ฑ„๋„๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ๋ฒ„ํผ์—์„œ ์ฑ„๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์ฑ„๋„์€ ์ŠคํŠธ๋ฆผ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ช‡๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค.

  • ์ฑ„๋„์„ ํ†ตํ•ด์„œ๋Š” ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ŠคํŠธ๋ฆผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ(์ฝ๊ธฐ ํ˜น์€ ์“ฐ๊ธฐ)์œผ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ฑ„๋„์€ ๋น„๋™๊ธฐ์  ์œผ๋กœ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฑ„๋„์€ ํ•ญ์ƒ ๋ฒ„ํผ์—์„œ ๋ถ€ํ„ฐ ์ฝ๊ฑฐ๋‚˜ ๋ฒ„ํผ๋กœ ์“ด๋‹ค.

Buffer

NIO์˜ ๋ฒ„ํผ๋Š” ์ฑ„๋„๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ปค๋„์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ„๋„์— ์˜ ํ•ด ์ง์ ‘ read ๋˜๊ฑฐ๋‚˜ write ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฐ์ฒด

IO์—์„œ๋Š” ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์ด 1๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๋ฉด ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์ด 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ๋Š”๋‹ค. ์ด๊ฒƒ ๋ณด๋‹ค๋Š” ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณต์ˆ˜ ๊ฐœ์˜ ๋ฐ”์ดํŠธ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ž…๋ ฅ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋‚ธ๋‹ค.

Selector

์…€๋Ÿญํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ์ฑ„๋„์„ ์ฒ˜๋ฆฌ(handle)ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ํ•˜๋‚˜๋‹น ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋งŽ์ด ์ƒ์„ฑ๋ ์ˆ˜๋ก ๊ธ‰๊ฒฉํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฐ€์กŒ๋˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•˜๋Š” Reactor ํŒจํ„ด์˜ ๊ตฌํ˜„์ฒด

NIO ์™€ IO

๊ตฌ๋ถ„IONIO
์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ŠคํŠธ๋ฆผ ๋ฐฉ์‹์ฑ„๋„ ๋ฐฉ์‹
๋ฒ„ํผ ๋ฐฉ์‹๋„Œ๋ฒ„ํผ๋ฒ„ํผ
๋น„๋™๊ธฐ ๋ฐฉ์‹์ง€์› ์•ˆํ•จ์ง€์›
๋ธ”๋กœํ‚น ๋ฐฉ์‹๋ธ”๋กœํ‚น ๋ฐฉ์‹๋งŒ ์ง€์›๋ธ”๋กœํ‚น / ๋„Œ๋ธ”๋กœํ‚น ๋ชจ๋‘ ์ง€์›

์ŠคํŠธ๋ฆผ์€ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์€ ๋‹จ์ง€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ , ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์‹ฑํฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ฑ„๋„์€ ์–‘๋ฐฉํ–ฅ ์ „์†ก ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜ 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 ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ด๋‹ค, ์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์„ ์†ก์ˆ˜์‹ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

image

  • InputStream / OutputStream : byte ๊ธฐ๋ฐ˜ input/output stream์˜ ์ตœ๊ณ  ์กฐ์ƒ
  • ByteArrayInputStream / ByteArrayOutputStream : byte array(byte[]) ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅ ํ•˜๋Š” ํด๋ž˜์Šค
  • FileInputStream / FileOutputStream : ํŒŒ์ผ(file)์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅ ํ•˜๋Š” ํด๋ž˜์Šค

Character Stream

text ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ด๋‹ค. HTML ๋ฌธ์„œ, ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์†ก์ˆ˜์‹ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

image

  • 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();
This post is licensed under CC BY 4.0 by the author.

Spring-JPA-Entity

Java Lambda