[Java] java.nio ์‚ฌ์šฉ๋ฒ• | Path, Files, FileChannel ์˜ˆ์ œ ๋ชจ์Œ

2025. 5. 30. 01:39ยทโ˜•Java/๐Ÿ“Java Programming

โœ… 1. java.nio ํŒจํ‚ค์ง€

  • NIO(New Input Output)๋Š” ๊ธฐ์กด java.io ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ์„ ํ•œ ์ƒˆ๋กœ์šด ์ž…์ถœ๋ ฅ ํŒจํ‚ค์ง€์ด๋‹ค.
  • JDK 7๋ถ€ํ„ฐ๋Š” ํŒŒ์ผ I/O๋ฅผ ๊ฐœ์„ ํ•œ NIO2๋„ ๋“ฑ์žฅ์„ ํ•จ( ์ด๋•Œ java.nio.file ํŒจํ‚ค์ง€๊ฐ€ ๋“ฑ์žฅํ•จ )
  • java.nio.file, java.nio.channels, java.nio.charset ๋“ฑ์ด ์žˆ์Œ
  • File ํด๋ž˜์Šค๋ณด๋‹ค ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Path ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•จ. java.nio.file ์•ˆ์— Path ํด๋ž˜์Šค๊ฐ€ ์žˆ์Œ.
  • Files ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํŒŒ์ผ/๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์กฐ์ž‘, ํŒŒ์ผ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ
  • ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ FileChannel ํด๋ž˜์Šค๊ฐ€ ์žˆ์Œ ( ๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•จ )
  • ์ž…์ถœ๋ ฅ์ด ๊ธฐ์กด์—๋Š” ๊ตฌ๋ถ„์ด ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ์ง€๋งŒ, FileChannel ํด๋ž˜์Šค์—์„œ๋Š” ์ž…์ถœ๋ ฅ ๋™์‹œ์— ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค
  • ๋น„๋™๊ธฐ์‹ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์„ ์œ„ํ•œ AsynchronousFileChannel ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•จ ( non-blocking ๋ฐฉ์‹ ํŒŒ์ผ ์ž…์ถœ๋ ฅ )

โœ… 2. Path ์ธํ„ฐํŽ˜์ด์Šค

import java.nio.file.*;
import java.io.IOException;

public class SimpleNioExample {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("hello.txt");                    // ํŒŒ์ผ ๊ฒฝ๋กœ ์ƒ์„ฑ

        Files.writeString(path, "์•ˆ๋…•ํ•˜์„ธ์š”!");                  // ํŒŒ์ผ์— ๋ฌธ์ž์—ด ์“ฐ๊ธฐ
        String text = Files.readString(path);                 // ํŒŒ์ผ์—์„œ ๋ฌธ์ž์—ด ์ฝ๊ธฐ

        System.out.println("์ฝ์€ ๋‚ด์šฉ: " + text);              // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”!

        Files.deleteIfExists(path);                           // ํŒŒ์ผ ์‚ญ์ œ
    }
}
  • java.nio.file ํŒจํ‚ค์ง€์— ์กด์žฌํ•˜๋ฉฐ java.io.File ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ.
  • ํŒŒ์ผ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ํ‘œํ˜„ํ•จ ( ์ ˆ๋Œ€ ๊ฒฝ๋กœ, ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ํ‘œํ˜„๋จ )
  • ๊ฒฝ๋กœ์˜ ์ƒ์„ฑ, ๊ฒฝ๋กœ์˜ ๋น„๊ต, ๊ฒฝ๋กœ ์ •๋ณด ์ถ”์ถœ, ๊ฒฝ๋กœ ์š”์†Œ ์กฐ์ž‘ ๊ธฐ๋Šฅ ๋“ฑ์„ ์ œ๊ณตํ•จ.
  • java.nio.file.Files ํด๋ž˜์Šค๊ฐ€ ์‹ค์ œ ํŒŒ์ผ์˜ ๋Œ€ํ•œ ์ƒ์„ฑ, ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ๋ณต์‚ฌ, ์ด๋™ ๋“ฑ์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค์ž„.
  • ์ฆ‰, InputStream, OutputStream ๋“ฑ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ํ™œ์šฉํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.
  • ํ•ด๋‹น Files ํด๋ž˜์Šค์— Path ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์ž„. ์ฆ‰, Path ๊ฐ์ฒด๊ฐ€ ์ธ์ž๋กœ ์ œ๊ณต์ด ๋˜์–ด์•ผ ํ•จ.
  • ๊ทธ๋ฆฌ๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ InputStream ๋“ฑ์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ์–ด, nio๋Š” ๊ธฐ์กด์˜ ioํŒจํ‚ค์ง€๋ฅผ ํ™•์žฅํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.


โœ… 3. FileSystem ํด๋ž˜์Šค & FileStore ํด๋ž˜์Šค

(1) FileSystem

import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.io.IOException;

public class DiskInfoExample {
    public static void main(String[] args) throws Exception {
        FileSystem fs = FileSystems.getDefault();

        for (FileStore store : fs.getFileStores()) {
            System.out.println("๋“œ๋ผ์ด๋ธŒ ์ด๋ฆ„ : " + store.name());
            System.out.println("ํŒŒ์ผ์‹œ์Šคํ…œ : " + store.type());
            System.out.println("์ „์ฒด ๊ณต๊ฐ„: " + store.getTotalSpace() + " bytes");
            System.out.println("์‚ฌ์šฉ ์ค‘์ธ ๊ณต๊ฐ„: " + (stroe.getTotalSpace() - store.getUsableSpace()) + " bytes");
        }
    }
}
  • FileSystem์€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•จ
  • FileSystems.getDefault()์€ ๊ธฐ๋ณธ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋ฆฌํ„ด์„ ํ•ด์ค€๋‹ค.
  • lterable <FileStore> getFileStores() ํ˜ธ์ถœ ํ•˜๋ฉด, FileStore ๊ตฌํ˜„์ฒด๋ฅผ ๋ฆฌํ„ดํ•จ. ์šด์˜์ฒด์ œ์— ๋งž๋Š” ๊ตฌํ˜„์ฒด์ž„.
  • FileSystem ํด๋ž˜์Šค์—์„œ WatchService new WatchService() ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
  • ํ˜„์žฌ ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•จ.
  • ์ฆ‰, ์šด์˜์ฒด์ œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , Window์šฉ JRE์—๋Š” WindowsFileSystem๊ณผ ๊ฐ™์€ ๊ตฌํ˜„์ด์žˆ์Œ.
  • ์ฃผ์š” ์—ญํ• : ๊ฒฝ๋กœ(Path) ๊ฐ์ฒด ์ƒ์„ฑ, ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ ๋“ฑ์ด ์žˆ์Œ.

(2) FileStore

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


โœ… 4. Files ํด๋ž˜์Šค

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;

public class FilesPathExample {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("example.txt");

        if (Files.exists(path)) {
            String firstLine = Files.readAllLines(path).get(0);
            System.out.println("First line: " + firstLine);
        } else {
            System.out.println("File does not exist.");
        }
    }
}
  • ํŒŒ์ผ ์กฐ์ž‘ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” static ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ฉ”์†Œ๋“œ๋Š” Path ๊ฐ์ฒด๋กœ ์ธ์ž๋กœ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ํ•จ.
  • ์‰ฝ๊ฒŒ๋งํ•ด, ํŒŒ์ผ ์ž…์ถœ๋ ฅ I/O ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, Path ๊ฐ์ฒด์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•จ.

(1) ์ฃผ์š” ๋ฉ”์„œ๋“œ


โœ… 5. java.nio.file ์ •๋ฆฌํ•˜๋ฉด..

  • ์ •๋ฆฌํ•˜๋ฉด, Path๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์šด์˜์ฒด์ œ์˜ ํŒŒ์ผ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” FileSystem ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Path ์ •๋ณด ์ฆ‰, ํ•ด๋‹น ํด๋”์˜ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ฆฌ๊ณ  Path ๊ฐ์ฒด๋ฅผ Files์— ์คŒ์œผ๋กœ์จ, Files์˜ ํŒŒ์ผ์˜ ๋Œ€ํ•œ ์ž…์ถœ๋ ฅ ์ฆ‰, I/O๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

โœ… 6. ๋ฒ„ํผ

  • ๋ฒ„ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ฃผ๋กœ I/O ์ž‘์—…์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ.
  • ์‰ฝ๊ฒŒ๋งํ•ด, CPU๋Š” ์ž…์ถœ๋ ฅ ๋ง๊ณ ๋„ ๋งŽ์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ. ์ด๋•Œ, I/O ๊ณผ์ •์—์„œ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ์ž…๋ ฅ์ด ๋А๋ฆฌ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด CPU๋Š” ์ž…๋ ฅ์„ ๋‹ค ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ. ์ด๋•Œ, ๋ฒ„ํผ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž…๋ ฅ๊ณผ์ •์—์„œ ๋ฒ„ํผ์— ์ž„์‹œ ์ €์žฅ์„ ํ•ด๋‘๊ณ , CPU๋Š” ๊ทธ ์‚ฌ์ด์— ๋‹ค๋ฅธ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋А๋‚Œ์ž„. ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ์ด ๋๋‚˜๋ฉด ๋ฒ„ํผ์—์„œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ถœ๋ ฅ์„ ๋ฐ”๋กœ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹
< ๋ฒ„ํผ ์‚ฌ์šฉ o >
[์‚ฌ๋žŒ ์ž…๋ ฅ] →→→ [๋ฒ„ํผ] →→→ [์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ]
  (๋А๋ฆผ)     (์ž„์‹œ ์ €์žฅ)       (๋น ๋ฆ„)
        
< ๋ฒ„ํผ ์‚ฌ์šฉ x >
[์‚ฌ๋žŒ ์ž…๋ ฅ] →→→ [์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ]
  → ๋А๋ ค์„œ ์ž๋ฐ”๊ฐ€ ๊ณ„์† ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ
  • ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์—ฐ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ”„๋กœ๊ทธ๋žจ์€ ๋ฒ„ํผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Œ(์ž…๋ ฅ)
  • ํ”„๋กœ๊ทธ๋žจ์€ ๋ฒ„ํผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•จ(์ถœ๋ ฅ)

โœ… 7. Buffer ํด๋ž˜์Šค

import java.nio.ByteBuffer;

public class ByteBufferExample {
    public static void main(String[] args) {
        // 1. ๋ฒ„ํผ ์ƒ์„ฑ (์šฉ๋Ÿ‰ 10๋ฐ”์ดํŠธ)
        ByteBuffer buffer = ByteBuffer.allocate(10);

        // 2. ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ (put)
        buffer.put((byte) 10);
        buffer.put((byte) 20);
        buffer.put((byte) 30);

        // 3. ์ฝ๊ธฐ ์ „์— ๋ฒ„ํผ๋ฅผ '์ฝ๊ธฐ ๋ชจ๋“œ'๋กœ ์ „ํ™˜ (flip)
        buffer.flip();

        // 4. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ (get)
        while (buffer.hasRemaining()) {
            byte b = buffer.get();
            System.out.println("์ฝ์€ ๊ฐ’: " + b);
        }
    }
}
  • ๋ฒ„ํผ๋Š” ๊ธฐ๋ณธํ˜• ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ณด๊ด€์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ฑ„๋„ ์ž…์ถœ๋ ฅ์— ์‚ฌ์šฉ๋˜๋ฉฐ ๋ฒ„ํผ ๋‹จ์œ„๋กœ ์ž…์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Œ.
  • ๊ธฐ๋ณธ Stream IO๋Š” 1๋ฐ”์ดํŠธ ๋˜๋Š” 1๋ฌธ์ž์”ฉ ์ž…์ถœ๋ ฅ์„ ํ•˜๋Š”๋ฐ, Channel IO๋Š” ๋ฒ„ํผ ๋‹จ์œ„๋กœ ์ž…์ถœ๋ ฅ์„ ํ•จ.
  • Buffer๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ java.nio ํŒจํ‚ค์ง€์— ์กด์žฌํ•จ ( ์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ณตํ†ต์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•จ )
  • ์‹ค์ œ ์‚ฌ์šฉ์„ ์œ„ํ•ด boolean์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ธฐ๋ณธํ˜•์— ๋Œ€ํ•ด Buffer์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•จ
  • ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
  • ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ๊ฑด ByteBufferํด๋ž˜์Šค์ž„.

(1) Buffer ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ข…๋ฅ˜

// ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฒ„ํผ ์ƒ์„ฑ (์ž๋ฐ” ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ)
ByteBuffer buffer = ByteBuffer.allocate(1024);

// ๋‹ค์ด๋ ‰ํŠธ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฒ„ํผ ์ƒ์„ฑ (OS ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ)
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);

// ๊ธฐ์กด ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ๊ฐ์‹ธ์„œ ๋ฒ„ํผ๋กœ ์‚ฌ์šฉ
byte[] data = new byte[10];
ByteBuffer buffer = ByteBuffer.wrap(data);

 

(2) Buffer ํด๋ž˜์Šค ๋‚ด๋ถ€์ ์ธ 4๊ฐ€์ง€ ์ฃผ์š” ์†์„ฑ

  • ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ’ ์ฆ‰, ํ•„๋“œ์˜ ๊ฐ’์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฒ„ํผ ๊ฐ์ฒด๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ ์ •๋ณด์ด๋‹ค.
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.capacity() // 10
buffer.position() // 0
buffer.limit()    // 10
  • ์ด๋Ÿฐ์‹์œผ๋กœ ํ•„๋“œ๊ฐ’์˜ ๋‹ด๊ธฐ๊ฒŒ ๋จ

(3) Buffer ํด๋ž˜์Šค ์ฃผ์š” ๋ฉ”์„œ๋“œ


โœ… 8. FileChannel ํด๋ž˜์Šค

try (FileChannel channel = FileChannel.open(Paths.get("data.txt"), StandardOpenOption.READ)) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    channel.read(buffer);
    buffer.flip();
    while (buffer.hasRemaining()) {
        System.out.print((char) buffer.get());
    }
}
  • java.io ํŒจํ‚ค์ง€์˜ ํŒŒ์ผ ๊ด€๋ จ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋Œ€์ฒดํ•จ.
  • java.nio.channels ํŒจํ‚ค์ง€์— ์กด์žฌํ•จ.
  • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•จ.
  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  • FileInputStream, FileOutputStream ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๊ฐ€ ๋˜์–ด์žˆ์Œ.
  • FileChannel์€ Java์—์„œ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘์„ ์œ„ํ•œ ํšจ์œจ์ ์ธ API.
  • ByteBuffer์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ธฐ์กด ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ํ›จ์”ฌ ์ €์ˆ˜์ค€ I/O ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•จ.
  • ์ฃผ๋กœ ํŒŒ์ผ ๋ณต์‚ฌ, ๋กœ๊ทธ ์ฒ˜๋ฆฌ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋“ฑ์— ๋งŽ์ด ์‚ฌ์šฉ๋จ.

(1) ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

// ์ฝ๊ธฐ ์ „์šฉ
FileChannel channel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ);

// ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ
FileChannel channel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE);

 

(2) ์ฃผ์š” ๋ฉ”์„œ๋“œ

 

(3) FileChannel ํด๋ž˜์Šค ์‚ฌ์šฉ ์˜ˆ์ œ

import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

public class FileChannelReadExample {
    public static void main(String[] args) throws Exception { // JVM์—๊ฒŒ ์˜ˆ์™ธ ์œ„์ž„
        Path path = Path.of("example.txt"); // ์ฝ์„ ํŒŒ์ผ ๊ฒฝ๋กœ

        try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024); // ๋ฒ„ํผ ์ƒ์„ฑ

            int bytesRead = fileChannel.read(buffer);

            while (bytesRead != -1) {
                buffer.flip(); // ๋” ์ด์ƒ์˜ ์ž‘์—…์ด ์—†๊ณ  ์ฝ๊ธฐ ์ž‘์—…๋งŒ ์žˆ๋‹ค๋ฉด ๊ทธ๋•Œ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ

                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }

                buffer.clear();
                bytesRead = fileChannel.read(buffer);
            }
        }
    }
}

 

(4) ์ •๋ฆฌ

  • ๊ฒฐ๋ก ์€ FileChannel์€ java.nio.file.Path์™€ java.nio.file.Files ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๋” ์ •๋ฐ€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“  ๊ณ ๊ธ‰ ํŒŒ์ผ ์ ‘๊ทผ ๋„๊ตฌ๋‹ค.
  • java.io.File ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ, NIO ๊ธฐ๋ฐ˜์˜ Path/Files๋ฅผ ํ™œ์šฉ
  • ์ž…์ถœ๋ ฅ๋ฟ ์•„๋‹ˆ๋ผ ๋žœ๋ค ์ ‘๊ทผ, ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘, ๊ณ ์„ฑ๋Šฅ ๋ณต์‚ฌ ๋“ฑ๋„ ๊ฐ€๋Šฅ
  • ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ๋” ์ •๋ฐ€ํ•˜๊ณ  ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ œ์–ด ๊ฐ€๋Šฅ
  • ์ฝ๊ธฐ, ์“ฐ๊ธฐ ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, Input Output์ด ๋‚˜๋‰˜์ง€ ์•Š์Œ ํด๋ž˜์Šค์ž์ฒด๋Š”..

โœ… 9. WatchService ์ธํ„ฐํŽ˜์ด์Šค

public class WatchTest {
    public static void main(String[] args) throws Exception {
        Path dir = Paths.get("watched"); // ๊ฐ์‹œํ•  ํด๋” (ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€)
        WatchService watchService = FileSystems.getDefault().newWatchService();
        // watchService์— ์ด๋ฒคํŠธ ๊ฐ์‹œ ๋Œ€์ƒ์œผ๋กœ ๋“ฑ๋ก
        // ENTRY_CREATE: ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ์ด๋ฒคํŠธ ๊ฐ์ง€
        // ENTRY_DELETE: ์‚ญ์ œ ์ด๋ฒคํŠธ ๊ฐ์ง€ MODIFY: ์ˆ˜์ • ์ด๋ฒคํŠธ๊ฐ์ง€
        dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

        System.out.println("Watching folder: " + dir);

        WatchKey key = watchService.take(); // ์ด๋ฒคํŠธ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ (ํ•œ ๋ฒˆ๋งŒ ๊ฐ์ง€)
        for (WatchEvent<?> event : key.pollEvents()) {
            System.out.println("Event: " + event.kind() + ", File: " + event.context());
        }
        key.reset();
    }
}
  • java.nio.file ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • ์ฆ‰, ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด ํŒŒ์ผ์˜ ์ƒ์„ฑ, ์‚ญ์ œ, ์ˆ˜์ • ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” API์ด๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ”Œ๋ง ์—†์ด๋„ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ฐ์‹œํ•˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ.
  • ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” Path ๊ฐ์ฒด์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€
  • ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ ๋˜๋Š” ์„œ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ƒ์„ฑ, ์‚ญ์ œ, ์ˆ˜์ •์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•จ์„ ๊ฐ์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž„.
  • ์œ„์˜ ์ฝ”๋“œ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋ธ”๋กœํ‚น ์ƒํƒœ๋กœ ๋Œ€๊ธฐ๋ฅผ ํ•จ. (  WatchKey key = watchService.take(); )
  • ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด WatchKey๋ฅผ ๋ฐ˜ํ™˜
  • ์ฆ‰, ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ „๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถฐ์„œ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋จ. ( ๊ฒฐ๋ก ์€ ๋”ฑ ํ•œ ๋ฒˆ์˜ ์ด๋ฒคํŠธ ๊ฐ์ง€ ์ฝ”๋“œ์ž„. )
  • WatchKey๋Š” ์–ด๋–ค ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๋“ค์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์—ด์‡ ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ.
  • ๋ฆฌํ„ด์„ ํ•˜๋ฉด์„œ ์–ด๋–ค ๋””๋ ‰ํ† ๋ฆฌ, ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ๋‹ด์•„์„œ ๋ฆฌํ„ดํ•ด์คŒ์œผ๋กœ์จ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋จ.
  • ๋˜ํ•œ, key.pollEvents() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด, ์ด๋ฒคํŠธ ํ•˜๋‚˜ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ ์ƒ์„ธํžˆ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  • ์ด๋ฒคํŠธ๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” boolean valid = key.reset(); ์„ ํ•ด ์ค„ ์ˆ˜ ์žˆ์Œ.

์ •๋ฆฌํ•˜๋ฉด

  • take() ๋ฉ”์„œ๋“œ๋Š” WatchService๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๋ธ”๋กœํ‚น ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. register()์— ๋ช…์‹œํ•œ ์ด๋ฒคํŠธ(์ƒ์„ฑ, ์‚ญ์ œ, ์ˆ˜์ • ๋“ฑ) ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฐœ์ƒํ•˜๋ฉด, ํ•ด๋‹น ์ด๋ฒคํŠธ๋“ค์ด WatchKey์— ๋‹ด๊ฒจ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜ํ™˜๋œ WatchKey๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์ด๋ฒคํŠธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ , key.reset() ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰์„ ์‹œ์ผœ์ค˜์•ผ, ๋‹ค์Œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ๋จ.

'โ˜•Java > ๐Ÿ“Java Programming' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Stream) ๊ฐœ๋… + ์˜ˆ์ œ ์ด์ •๋ฆฌ ๐Ÿ“š  (2) 2025.06.03
[Java] ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ •๋ฆฌ: List, Set, Map ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด ์ด์ •๋ฆฌ  (0) 2025.05.30
[Java] java.io ํŒจํ‚ค์ง€ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ  (2) 2025.05.28
[Java] java.lang ํŒจํ‚ค์ง€ ์ •๋ฆฌ: Object, String, Math ํด๋ž˜์Šค ์ด์ •๋ฆฌ  (0) 2025.05.26
[Java] ์ž๋ฐ” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋žŒ๋‹ค์‹(Lambda Expression) ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๊ธฐ  (1) 2025.05.23
'โ˜•Java/๐Ÿ“Java Programming' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Java] ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Stream) ๊ฐœ๋… + ์˜ˆ์ œ ์ด์ •๋ฆฌ ๐Ÿ“š
  • [Java] ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ •๋ฆฌ: List, Set, Map ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด ์ด์ •๋ฆฌ
  • [Java] java.io ํŒจํ‚ค์ง€ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ
  • [Java] java.lang ํŒจํ‚ค์ง€ ์ •๋ฆฌ: Object, String, Math ํด๋ž˜์Šค ์ด์ •๋ฆฌ
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (151)
      • ๐ŸŽ“๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต (26)
        • ๐Ÿ–ฅ๏ธ์ปดํ“จํ„ฐ๊ณผํ•™๊ณผ (1)
        • ๐ŸŒ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ… (11)
        • โš™๏ธ์ปดํ“จํ„ฐ์˜ ์ดํ•ด (11)
        • ๐Ÿ›๏ธ์„ธ๊ณ„์˜์ •์น˜์™€๊ฒฝ์ œ (3)
      • ๐Ÿ“šComputer Science (0)
      • ๐Ÿ› ๏ธBackend (2)
      • โ˜•Java (20)
        • ๐Ÿ“Java Programming (19)
        • ๐ŸงฉJava Design Pattern (1)
      • ๐ŸŒณSpring (9)
        • ๐ŸŒฑSpring Framework (6)
        • ๐ŸŒฑSpring Security (1)
      • โšกPython (13)
      • ๐Ÿ›ข๏ธDatabase (0)
      • ๐ŸŒฟGitHub (1)
      • ๐ŸŒ Network (7)
        • ๐Ÿ“œHTTP (7)
      • ๐Ÿš€DevOps (1)
      • Algorithm Problem Solving (2)
      • Data Structure (1)
      • JavaScript (1)
      • โ›บ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ (65)
      • ์žก๋‹ด (1)
      • ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ธ€ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…
    ์œ ๋น„์ฟผํ„ฐ์Šค
    ํด๋ผ์šฐ๋“œ
    spring
    ์Šคํ”„๋ง
    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…๊ฐœ๋ก 
    ์ปดํŒŒ์ผ๋Ÿฌ
    Spring Framework
    Python
    ๋‹คํ˜•์„ฑ
    ๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต
    ๋ฐฉ์†ก๋Œ€
    ๋ฐฉํ†ต๋Œ€
    Java
    ์ž…์ถœ๋ ฅ
    ์ž๋ฐ”
    ํŒŒ์ด์ฌ
    ์„ธ๊ณ„ํ™”
    ํด๋ž˜์Šค
    ์ปดํ“จํ„ฐ์˜ ์ดํ•ด
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
junbin2
[Java] java.nio ์‚ฌ์šฉ๋ฒ• | Path, Files, FileChannel ์˜ˆ์ œ ๋ชจ์Œ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”