๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

[JAVA] File I/O

by ๋Œ€๋ณต2 2024. 7. 28.

 

I/O ?

๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ(Input) ๋ฐ ์ถœ๋ ฅ(Output)์„ ์˜๋ฏธํ•œ๋‹ค.

๋‚ด๊ฐ€ ํ‚ค๋ณด๋“œ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ์ž…๋ ฅ์ด ๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์ฝ˜์†”๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์ด๋•Œ ํ‚ค๋ณด๋“œ์™€ ์ฝ˜์†”์€ ๋…ธ๋“œ, ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋…ธ๋“œ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ์ง€์นญํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ์€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ž…/์ถœ๋ ฅ์„ ๊ฐ™์ด ํ•  ์ˆ˜ ์—†์Œ)

 

 

 

Node Stream์˜ ์ข…๋ฅ˜

 

 

Input Stream(Byte)์˜ ๋ฉ”์„œ๋“œ

- read(): byte ํ•˜๋‚˜๋ฅผ ์ฝ์–ด์„œ int๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋” ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

- read(byte b[]): b๋งŒํผ ์ฝ์–ด์„œ ์ฝ์€ ๋ฐ”์ดํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด, ๋” ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.

- read(byte b[], int offset, int len): len๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด b์˜ offset๋ถ€ํ„ฐ ๋ฐ”์ดํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด(len+offset <= b์˜ ํฌ๊ธฐ)

- close(): ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•ด์„œ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.

 

 

 

Output Stream(Byte)์˜ ๋ฉ”์„œ๋“œ

- write(int b): b๋ฅผ byte๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

- write(byte b[]): b๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

- write(byte b[], int offset, int len): b์˜ offset๋ถ€ํ„ฐ offset+len-1๋งŒํผ์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

- flush(): ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ณ  ๋ฒ„ํผ๋ฅผ ๋น„์šด๋‹ค.

- close(): ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•ด์„œ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.

 

 

Reader(Char)์˜ ๋ฉ”์„œ๋“œ

- read(): char ํ•˜๋‚˜๋ฅผ ์ฝ์–ด์„œ int๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋” ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

- read(char c[]): c๋งŒํผ ์ฝ์–ด์„œ ์ฝ์€ ๋ฐ”์ดํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด, ๋” ์ฝ์„ ๊ฐ’์ด ์—†์œผ๋ฉด 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.

- read(char c[], int offset, int len): len๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด c์˜ offset๋ถ€ํ„ฐ ๋ฐ”์ดํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด(len+offset <= c์˜ ํฌ๊ธฐ)

- read(java.nio.CharBuffer target): ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ target์— ์ €์žฅํ•œ๋‹ค.

- close(): ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•ด์„œ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.

 

 

 

Writer(Char)์˜ ๋ฉ”์„œ๋“œ

- write(int c): c๋ฅผ char๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

- write(char c[]): c๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

- write(char c[], int offset, int len): c์˜ offset๋ถ€ํ„ฐ offset+len-1๋งŒํผ์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

- append(CharSequence csq): csq๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  Writer๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

- append(CharSequence csq, int start, int end): csq์˜ start ~ end๊นŒ์ง€ ์ถœ๋ ฅํ•˜๊ณ  Writer๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

- flush(): ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ณ  ๋ฒ„ํผ๋ฅผ ๋น„์šด๋‹ค.

- close(): ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•ด์„œ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.

 

 

 

 

 

File

- File(String pathname): pathname์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด๊ฑธ ์•ˆ ๋„ฃ์œผ๋ฉด App๋ฅผ ์‹œ์ž‘ํ•œ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•œ๋‹ค.

- File(File P, String C): P๊ฒฝ๋กœ ์•„๋ž˜ C๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

- File(URI uri): file๋กœ ์‹œ์ž‘ํ•˜๋Š” URI ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์„ ์ƒ์„ฑ

- CreateNewFile(): ๋ฌผ๋ฆฌ์ ์ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

- getAbsolutePath(): ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

- getCanonicalPath(): ํŒŒ์ผ์˜ ์ •์‹ ๊ฒฝ๋กœ(์ ˆ๋Œ€ ๊ฒฝ๋กœ์ด๋ฉฐ .์ด๋‚˜ ..๊ฐ™์€ ์ƒ๋Œ€ ๊ฒฝ๋กœ ๊ธฐํ˜ธ๊ฐ€ ์—†๋Š” ๊ฒฝ๋กœ)๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

- ListFile(): ํŒŒ์ผ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์ผ ๊ฒฝ์šฐ ์ž์‹ ํŒŒ์ผ๋“ค์„ File [] ํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

- FileInputStream(String name): name ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ์ฝ๋Š” FIleInputStream์„ ์ƒ์„ฑํ•œ๋‹ค.

- FileOutputStream(String name): name ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์— ์ถœ๋ ฅํ•˜๋Š” FIleOutputStream์„ ์ƒ์„ฑํ•œ๋‹ค.

- FileOutputStream(String name, boolean append): ์œ„์™€ ๋™์ผ, ๊ธฐ์กด ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์ด์–ด์„œ ์ž‘์„ฑ

 

 

 

 

๋ณด์กฐ ์ŠคํŠธ๋ฆผ

๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ŠคํŠธ๋ฆผ์ด๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋ณด์กฐ ์ŠคํŠธ๋ฆผ์„ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(์ŠคํŠธ๋ฆผ ์ฒด์ด๋‹)

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());

๋ณด์กฐ์ŠคํŠธ๋ฆผ์˜ BufferedReader๋ฅผ ์ด์šฉํ•˜์—ฌ Input์„ ๋ฐ›๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

Scanner์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋นจ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 

๊ฐ์ฒด ์ง๋ ฌํ™”

๊ฐ์ฒด๋ฅผ ํŒŒ์ผ ๋“ฑ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํด๋ž˜์Šค์—์„œ Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ์ง๋ ฌํ™”๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๋ฉค๋ฒ„๋Š” transient๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

serialVersionUID: ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์ผ ํ‚ค๋กœ ์ง๋ ฌํ™” - ์—ญ์ง๋ ฌํ™” ๊ฐ„ ๊ฒ€์ฆ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

ObjectOutputStream(OutputStream out): out์„ ์ด์šฉํ•ด ObjectOutputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

writeObject(Object obj): obj๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

 

ObjectInputStream(InputStream in): in์„ ์ด์šฉํ•ด ObjectInputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

readObject(): ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•ด์„œ Object๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

private static File target = new File("c:/Temp/objPerson.dat ");
    private static void write() {
        Person person = new Person("ํฅ๊ธธ๋™2", "pass1234", "123-456", "seoul");
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(target))) {
            oos.writeObject(person);
            System.out.println("์ €์žฅ ์™„๋ฃŒ!");
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    private static void read() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(target))){
            Object readed = ois.readObject();

            if (readed != null && readed instanceof Person casted){
                System.out.println("๋กœ๋”ฉ ์™„๋ฃŒ: " + casted);
            }
        } catch (IOException | ClassNotFoundException e){
            e.printStackTrace();
        }
    }

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] GC - Mark & Sweep ๋™์ž‘ ์›๋ฆฌ  (0) 2025.05.17
[JAVA] ConcurrentHashMap  (0) 2025.05.17
[JAVA] Exception  (0) 2024.07.28
[JAVA] Stream API  (0) 2024.07.25
[JAVA] Lambda  (0) 2024.07.24