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);
- 현재 경로에 있는 모든 파일 또는 디렉토리를 스트림으로 반환
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()
는 자바에 파일 데이터를 불러오지 않고, 운영체제의 파일 복사 기능을 사용한다 가장 빠르다.- 자바에 데이터를 올리지 않기 때문에 파일에서 파일을 복사할 때만 유용하다.
'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 |