[Java] 49. File, Files

2025. 7. 1. 16:54·Java/IO, Network
File, Files

File, Files

#Java/adv2


파일이나 디렉토리를 다루는 객체 File 또는 Files, Path 클래스
/File

  • File은 파일과 디렉토리를 둘 다 다룬다.
    • File file = new File("temp/example.txt");
    • File directory = new File("temp/exampleDir");
  • 주요 메서드
    • createNewFile(): 새 파일을 생성. 단순히 객체를 생성한다고 파일이 생성되는게 아니라, 이 메서드를 호출해야 생성된다.
    • exists(): 파일이나 디렉토리의 존재 여부를 확인
    • mkdir(): 새 디렉토리를 생성
    • delete(): 파일이나 디렉토리를 삭제
    • isFile(): 파일인지 확인
    • isDirectory(): 디렉토리인지 확인
    • getName(): 파일이나 디렉토리의 이름을 반환
    • renameTo(File dest): 파일의 이름을 변경하거나 이동
    • lastModified(): 마지막으로 수정된 시간을 반환

자바 1.7에서 File 클래스를 대체할 Files와 Path가 등장한다.
/Files, Path

  • 성능과 편의성 개선. 수많은 유틸리티 기능이 존재
  • File과 관련된 스트림을 사용하기 전에 Files의 기능을 고려하자. 성능, 사용성 모두 나은듯.
  • 파일이나 디렉토리의 경로에 대해서는 Path 클래스를 사용해야 한다.
    • Path file = Path.of("temp/example.txt");
    • Path directory = Path.of("temp/exampleDir");
    • Path 자체를 표현하는 책임과, 그 경로를 가지고 실제 파일 시스템에서 작업을 수행하는 책임을 명확히 나누기 위함
  • Files는 직접 생성할 수 없고, static 메서드를 통해 기능을 제공한다.
  • 주요 메서드
    • exists(): 파일이나 디렉토리의 존재 여부를 확인
      • Files.exists(file);
    • createFile(): 새 파일을 생성
      • Files.createFile(file);
    • createDirectory(): 새 디렉토리를 생성
      • Files.createDirectory(directory);
    • delete(): 파일이나 디렉토리를 삭제
      • Files.delete(file);
    • isRegularFile(): 일반 파일인지 확인
      • Files.isRegularFile(file)
    • getFileName(): 파일이나 디렉토리의 이름을 반환
      • file.getFileName() : Path 객체의 메서드임!
    • size(): 파일의 크기를 바이트 단위로 반환
      • Files.size(file)
    • move(): 파일의 이름을 변경하거나 이동
      • Path newFile = Paths.get("temp/newExample.txt");
      • Files.move(file, newFile, StandardCopyOption.REPLACE_EXISTING);
    • getLastModifiedTime(): 마지막으로 수정된 시간을 반환
      • Files.getLastModifiedTime(newFile)
    • readAttributes(): 파일의 기본 속성들을 한 번에 읽기
      • BasicFileAttributes attrs = Files.readAttributes(newFile, BasicFileAttributes.class);
        • attrs.creationTime()
        • attrs.isDirectory()
        • attrs.isRegularFile()
        • attrs.isSymbolicLink()
        • attrs.size()

/경로 표시

  • 파일이나 디렉토리의 경로는 크게 절대 경로와 정규 경로로 나눌 수 있다.
  • /File 경로 표시
    • File file = new File("temp/..");라면
    • 절대 경로: file.getAbsolutePath(), 정규 경로: file.getCanonicalPath()
      • 절대 경로: 경로의 처음부터 ~ 내가 입력한 모든 경로를 다 표현.
        • /Users/yh/study/inflearn/java/java-adv2/temp/..
        • /Users/yh/study/inflearn/java/java-adv2
        • 2가지 경로 모두 가능
      • 정규 경로: 경로의 계산이 모두 끝난 경로.
        • /Users/yh/study/inflearn/java/java-adv2
        • 정규 경로는 하나만 존재한다.
      • cf) 상대 경로: 자바 프로그램 시작 위치부터 표현
  • File[] files = file.listFiles();
    • 현재 경로에 있는 모든 파일 또는 디렉토리를 반환한다.
  • /Files 경로 표시
    • Path path = Path.of("temp/..");라면
    • 절대 경로: path.toAbsolutePath(), 정규 경로: path.toRealPath()
    • Stream<Path> pathStream = Files.list(path);
      • 현재 경로에 있는 모든 파일 또는 디렉토리를 스트림으로 반환

/Files로 문자 파일 읽기

  • FileReader, FileWriter 같은 스트림 클래스 + 보조 스트림 조합 활용의 복잡함을 코드 한줄로 해결해준다.
  • Path path = Path.of("temp/hello2.txt");
  • /Files로 문자 파일 읽기
    • 파일에 쓰기
      • Files.writeString(path, writeString, UTF_8);
    • 파일에서 읽기
      • String readString = Files.readString(path, UTF_8);
  • /Files - 라인 단위로 읽기
    • List<String> lines = Files.readAllLines(path, UTF_8);
      • 파일을 한 번에 다 읽고, 라인 단위로 List에 나누어 저장하고 반환한다.
      • 문제점: 파일에 있는 걸 한 번에 통째로 불러온다 OutofMemoryException 오류가 발생할 수도 있다.
    • try (Stream<String> lineStream = Files.lines(path, UTF_8)) + forEach()
      • 메모리 사용량을 위해 파일을 한 줄 단위로 나누어 읽으려면 이 기능을 사용하자.
      • 파일을 스트림 단위로 나누어 조회한다.
      • try-with-resource를 통해 조금씩 메모리에 올려두고, 기존에 사용한 데이터는 GC한다.

/파일 복사 최적화

  • /파일 복사 예제1: fis.readAllBytes(), fos.write(bytes)
    • FileInputStream에서 readAllBytes를 통해 한 번에 모든 데이터를 읽고 fos의 write(bytes)를 통해 한 번에 모든 데이터를 저장한다.
    • 파일(copy.dat) → 자바(byte) → 파일(copy_new.dat)의 과정
  • /파일 복사 예제2: fis.transferTo(fos);
    • 이 메서드는 InputStream에서 읽은 데이터를 바로 OutputStream으로 출력한다.
    • 성능 최적화가 되어 있어서 예제 1이랑 성능이 비슷하거나 조금 더 빠르다.
    • 파일(copy.dat) → 자바(byte) → 파일(copy_new.dat)의 과정
  • /파일 복사 예제3: Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    • source와 target에 해당하는 path 객체와, 복사 옵션을 넘겨준다.
    • Files.copy() 는 자바에 파일 데이터를 불러오지 않고, 운영체제의 파일 복사 기능을 사용한다 가장 빠르다.
    • 자바에 데이터를 올리지 않기 때문에 파일에서 파일을 복사할 때만 유용하다.

Ref) 김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션 강의 | 김영한 - 인프런

'Java > IO, Network' 카테고리의 다른 글

[Java] 51. 네트워크 - 프로그램(2)  (0) 2025.07.01
[Java] 50. 네트워크 - 프로그램(1)  (0) 2025.07.01
[Java] 48. 자바 I/O 활용  (0) 2025.07.01
[Java] 47. 자바 IO 기본(2)  (0) 2025.07.01
[Java] 46. 자바 IO 기본(1)  (0) 2025.07.01
'Java/IO, Network' 카테고리의 다른 글
  • [Java] 51. 네트워크 - 프로그램(2)
  • [Java] 50. 네트워크 - 프로그램(1)
  • [Java] 48. 자바 I/O 활용
  • [Java] 47. 자바 IO 기본(2)
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Java] 49. File, Files
상단으로

티스토리툴바