๐Ÿ“‚ JAVA/์ฃผ์š” ๊ฐœ๋…

์ž…์ถœ๋ ฅ(I/O)(1) - ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ, ๋ณด์กฐ ์ŠคํŠธ๋ฆผ

Amenable 2023. 1. 29. 21:24

  ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์— ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์–ด 3๊ฐœ๋ฅผ ์‚ดํŽด๋ณด์ž.

  I/O๋ž€ Input/Ouput์˜ ์•ฝ์ž๋กœ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋…ธ๋“œ(Node)๋ž€ '๋ฐ์ดํ„ฐ์˜ ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€' ๋˜๋Š” '์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ๋๋‹จ'์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์šด๋ฐ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ๊ฒฐ ํ†ต๋กœ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ๊ทธ๊ฒƒ์ด ์ŠคํŠธ๋ฆผ(Stream)์ด๋‹ค.

  ์ด๋ฒˆ ์ฃผ์ œ์—์„œ๋Š” ์ž…์ถœ๋ ฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ, ์ด๋ฅผ ๋„์™€์ฃผ๋Š” ๋ณด์กฐ ์ŠคํŠธ๋ฆผ, ๊ทธ๋ฆฌ๊ณ  ์ง๋ ฌํ™”(Serialization)๋ฅผ ์•Œ์•„๋ณด์ž. 

 

1. ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ ๐Ÿ›ด

  ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ์ด๋ž€ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ์ŠคํŠธ๋ฆผ์ด๋‹ค. ๋‹ค์–‘ํ•œ ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ๋“ค์ด ์žˆ๋Š”๋ฐ 3๊ฐ€์ง€ ์กฐ๊ฑด์œผ๋กœ ๋ถ„๋ฅ˜๋ฅผ ํ•˜์—ฌ ๊ทธ๊ฒƒ์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 3๊ฐ€์ง€ ๋ถ„๋ฅ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๋ฐ์ดํ„ฐ ํƒ€์ž…
    ์ „์†กํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด Byte์ธ์ง€ ์•„๋‹ˆ๋ฉด Char์ธ์ง€
  2. ๋ฐ์ดํ„ฐ ์ด๋™๋ฐฉํ–ฅ
    ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ๊ฒฝ์šฐ์™€ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ
  3. ๋…ธ๋“œ ํƒ€์ž…
    ํ‚ค๋ณด๋“œ, ๋ชจ๋‹ˆํ„ฐ, File, ByteArray, Pipe, CharArray, String

  ์ตœ์ข… ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋“ค์€ 'InputStream, OutputStream', 'Reader, Writer'์˜ ์ž์†ํด๋ž˜์Šค์ด๋ฏ€๋กœ InputStream, OutputStream, Reader, Writer๋งŒ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ๋˜ํ•œ, FileInputStream๊ณผ FileOutputStream์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ด๊ฒƒ๋„ ๊ฐ™์ด ์‚ดํŽด๋ณด์ž.

InputStream๊ณผ OutputStream โšพ

[InputStream]

๋ฉ”์„œ๋“œ๋ช… ์„ค๋ช…
abstract int read()   1byte๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  ๋” ์ด์ƒ ์ฝ์–ด ์˜ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
int read(byte[] b)   ๋ฐฐ์—ด b์˜ ํฌ๊ธฐ๋งŒํผ ์ฝ์–ด์„œ ๋ฐฐ์—ด์„ ์ฑ„์šฐ๊ณ  ์ฝ์–ด ์˜จ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  ๋” ์ด์ƒ ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
int read(byte[] b, int off, int len)   ์ตœ๋Œ€ len๊ฐœ์˜ byte๋ฅผ ์ฝ์–ด์„œ ๋ฐฐ์—ด b์˜ ์ง€์ •๋œ ์œ„์น˜(off)๋ถ€ํ„ฐ ์ €์žฅํ•œ๋‹ค.
  off + len์€ b์˜ ํฌ๊ธฐ ์ดํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

[OutputStream]

๋ฉ”์„œ๋“œ๋ช… ์„ค๋ช…
abstract void write(int b)   ์ฃผ์–ด์ง„ ๊ฐ’์„ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
void write(byte[] b)   ์ฃผ์–ด์ง„ ๋ฐฐ์—ด b์— ์ €์žฅ๋œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
void write(byte[] b, int off, int len)   ์ฃผ์–ด์ง„ ๋ฐฐ์—ด b์— ์ €์žฅ๋œ ๋‚ด์šฉ ์ค‘์—์„œ off๋ฒˆ์งธ๋ถ€ํ„ฐ len๊ฐœ ๋งŒํผ๋งŒ ์ฝ์–ด์„œ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
public static void main(String[] args) {
    byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    byte[] outSrc = null;
    byte[] temp = new byte[10];

    ByteArrayInputStream input = new ByteArrayInputStream(inSrc);
    ByteArrayOutputStream output = new ByteArrayOutputStream();

    System.out.println("๊ธฐ์กด temp : " + Arrays.toString(temp));

    input.read(temp, 0, temp.length); // ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ์ธ inSrc๋ฅผ temp์— ๋‹ด๋Š”๋‹ค.
    System.out.println("์ž…๋ ฅ ํ›„ temp : " + Arrays.toString(temp));

    output.write(temp, 5, 5); // temp[5]๋ถ€ํ„ฐ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ writeํ•œ๋‹ค.
    outSrc = output.toByteArray();
    System.out.println("์ถœ๋ ฅ ํ›„ outSrc : " + Arrays.toString(outSrc));

}
// ๊ธฐ์กด temp : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// ์ž…๋ ฅ ํ›„ temp : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// ์ถœ๋ ฅ ํ›„ outSrc : [5, 6, 7, 8, 9]

  ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ์ŠคํŠธ๋ฆผ์˜ ์ข…๋ฅ˜๋งŒ ๋‹ค๋ฅผ ๋ฟ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋™์ผํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๋Š” ์ƒ๋žตํ•œ๋‹ค.

 

Reader์™€ Writer ๐Ÿ€

[Reader]

๋ฉ”์„œ๋“œ ์„ค๋ช…
int read()   ์ž…๋ ฅ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ๋ฌธ์ž๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  ๋” ์ด์ƒ ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
int read(char[] c)   ์ž…๋ ฅ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด c์˜ ํฌ๊ธฐ๋งŒํผ ์ฝ์–ด์„œ ๋ฐฐ์—ด c์— ์ €์žฅํ•œ๋‹ค.
  ๋” ์ด์ƒ ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด 0์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
abstract int read(char[] c, int off, int len)   ์ž…๋ ฅ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์ตœ๋Œ€ len๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ฝ์–ด์„œ ๋ฐฐ์—ด c์˜ ์ง€์ •๋„๋‹ˆ ์œ„์น˜(off)๋ถ€ํ„ฐ ์ฝ์€ ๋งŒํผ ์ €์žฅํ•œ๋‹ค.
  off + len์€ c์˜ ํฌ๊ธฐ ์ดํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
int read(CharBuffer target)   ์ž…๋ ฅ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์ฝ์–ด์„œ ๋ฌธ์ž๋ฒ„ํผ(target)์— ์ €์žฅํ•œ๋‹ค.
abstract void close()   ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•ด์„œ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค. 

[Writer]

๋ฉ”์„œ๋“œ ์„ค๋ช…
void write(int b)   ์ฃผ์–ด์ง„ ๊ฐ’์„ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
void write(char[] c)   ์ฃผ์–ด์ง„ ๋ฐฐ์—ด c์— ์ €์žฅ๋œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
abstract void write(char[] c, int off, int len)   ์ฃผ์–ด์ง„ ๋ฐฐ์—ด c์— ์ €์žฅ๋œ ๋‚ด์šฉ ์ค‘์—์„œ off๋ฒˆ์งธ๋ถ€ํ„ฐ len๊ธธ์ด๋งŒํผ๋งŒ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
void write(String str)   ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด(str)์„ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค.
void write(String str, int off, int len)   ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด(str)์˜ off๋ฒˆ์งธ ๋ฌธ์ž๋ถ€ํ„ฐ len๊ฐœ ๋งŒํผ์˜ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅ์†Œ์Šค์— ์“ด๋‹ค. 
Writer append(c)   ์ง€์ •๋œ ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅ์†Œ์Šค์— ์ถœ๋ ฅํ•œ๋‹ค.
Writer append(CharSequence c)   c๋ฅผ ์ถœ๋ ฅ์†Œ์Šค์— ์ถœ๋ ฅํ•œ๋‹ค.
Writer append(CharSequence c, int start, int end)   c์˜ ์ผ๋ถ€๋ฅผ ์ถœ๋ ฅ์†Œ์Šค์— ์ถœ๋ ฅํ•œ๋‹ค.
abstract void close()   ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•ด์„œ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.
abstract void flush()   ๋ฒ„ํผ๊ฐ€ ์žˆ๋Š” ์ŠคํŠธ๋ฆผ์—์„œ ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ณ  ๋ฒ„ํผ๋ฅผ ๋น„์šด๋‹ค.

 

FileInputStream๊ณผ FileOutputStream ๐Ÿˆ

[FileInputStream & FileOutputStream]

์ƒ์„ฑ์ž ์„ค๋ช…
FileInputStream(String name)   name์„ ๊ฐ€์ง„ ์‹ค์ œ ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐ๋œ FileInputStream์„ ์ƒ์„ฑํ•œ๋‹ค.
FileOutputStream(String name)   name์„ ๊ฐ€์ง„ ์‹ค์ œ ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐ๋œ FileOutputStream์„ ์ƒ์„ฑํ•œ๋‹ค.
FileOutputStream(String name, boolean append)   name์„ ๊ฐ€์ง„ ์‹ค์ œ ํŒŒ์ผใ„น๊ณผ ์—ฐ๊ฒฐ๋œ FileOutputStream์„ ์ƒ์„ฑํ•œ๋‹ค. 
  ๋งŒ์•ฝ append๊ฐ€ true์ด๋ฉด ๊ธฐ์กด ํŒŒ์ผ์— ์ด์–ด์„œ ์“ฐ๊ณ , false์ด๋ฉด ๊ธฐ์กด์˜ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค.
File src = new File("C:\\src.txt");
File target = new File("C:\\new\\target.txt");

byte[] buffer = new byte[10];
try(InputStream input = new FileInputStream(src);
        OutputStream output = new FileOutputStream(target)){
    int read = -1;
    while((read = input.read(buffer)) > 0) {
        output.write(buffer, 0, read);
    }
} catch(IOException e) {
    e.printStackTrace();
}

 

  ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ๋‹ค. OS๋งˆ๋‹ค ๊ฒฝ๋กœ(path) ๊ตฌ๋ถ„์ž๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ์ž์‹ ์˜ OS ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฒฝ๋กœ์™€ ๊ด€๋ จ๋œ File์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

๋ฉค๋ฒ„๋ณ€์ˆ˜ ์„ค๋ช…
static String pathSeparator OS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž
์œˆ๋„์šฐ = ";", ์œ ๋‹‰์Šค = ":"
static char pathSeparatorChar OS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž
์œˆ๋„์šฐ = ';', ์œ ๋‹‰์Šค = ':'
static String separator OS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„ ๊ตฌ๋ถ„์ž
์œˆ๋„์šฐ = "\", ์œ ๋‹‰์Šค = "/"
static char separatorChar OS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„ ๊ตฌ๋ถ„์ž
์œˆ๋„์šฐ = "\", ์œ ๋‹‰์Šค = "/"
File target = new File("C:" + File.separator + "Amenable" + File.separator + "test.txt");

 

2. ๋ณด์กฐ ์ŠคํŠธ๋ฆผ ๐Ÿ›ต

  ๋ณด์กฐ ์ŠคํŠธ๋ฆผ์€ ๋ง ๊ทธ๋Œ€๋กœ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ด๋‹ค. ์ž์ฒด์ ์œผ๋กœ ์ž…์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ž์—์„œ ๋ฐฐ์šด ๋…ธ๋“œ์ŠคํŠธ๋ฆผ์ด ํ•„์š”ํ•˜๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๋ณด์กฐ ์ŠคํŠธ๋ฆผ์„ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๋ฅธ ์ŠคํŠธ๋ฆผ ์ฒด์ด๋‹(Stream Chaining)์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ธฐ๋Šฅ byte ๊ธฐ๋ฐ˜ char ๊ธฐ๋ฐ˜
byte ์ŠคํŠธ๋ฆผ์„ char ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ InputStreamReader
OutputStreamWriter
 
๋ฒ„ํผ๋ง์„ ํ†ตํ•œ ์†๋„ ํ–ฅ์ƒ BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
๊ฐ์ฒด ์ „์†ก ObjectInputStream
ObjectOutputStream
 

  ๋ฒ„ํผ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž…์ถœ๋ ฅ์˜ ํšจ์œจ์ด ๋น„๊ตํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ์ข‹์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

 

ํ•ด๋‹น ๊ธ€์€ ๋‚จ๊ถ ์„ฑ๋‹˜์˜ Java์˜ ์ •์„์„ ์ฝ๊ณ  ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.