[Java] java.nio.file.Files 사용법 익히기

您所在的位置:网站首页 filesreadattributes [Java] java.nio.file.Files 사용법 익히기

[Java] java.nio.file.Files 사용법 익히기

2024-01-24 12:31| 来源: 网络整理| 查看: 265

🥝 작성 계기

일을 하다보니 java.nio.file.Files 를 알게 되었다. 꽤나 유용한 거 같아서 이 기회에 간단한 사용법을 익혀보려고 이 글을 썼다. 지금부터 이 패키지에 어떤 기능이 있는지 간단하게 알아보자.

그리고 java.nio.file.Files 로만 하기 힘들거나, 더 심플하게 코딩할 수 있는 다른 API 들도 중간중간 소개하겠다.

참고: 주로 사용하는 패키지 목록. import 시 헷갈리면 여기를 참조하세요!

import java.util.stream.Collectors; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; 시간 관련된 건 다 java.time 패키지 하위에 있는 걸 사용한다. 🥝 파일 속성 조회 @Test void FileFindFilteringTest() throws IOException { String filePath = "D:/upload/wow.txt"; BasicFileAttributes basicFileAttributes = Files.readAttributes(Paths.get(filePath), BasicFileAttributes.class); System.out.println("isRegularFile = " + basicFileAttributes.isRegularFile()); System.out.println("creationTime = " + basicFileAttributes.creationTime()); System.out.println("lastModifiedTime = " + basicFileAttributes.lastModifiedTime()); }

출력 결과:

isRegularFile() = true creationTime() = 2021-12-21T11:03:45.21Z lastModifiedTime() = 2021-12-21T10:04:22Z

🥝 Stream 을 통한 파일 복제 Files.newInputStream(Paths.get(realPath)) Files.newOutputStream(Paths.get(writePath)) @Test void testMe() { // 그냥 경로를 지정하는 코드다 신경쓰지 말자 String realPath = "D:/[Java] Read And Write File/123.txt"; String writePath = realPath.substring(0, realPath.lastIndexOf("/")) + "/wow.txt" ; // 여기서부터 집중 try(InputStream is = Files.newInputStream(Paths.get(realPath)); OutputStream os = Files.newOutputStream(Paths.get(writePath)) ) { // 어떤 java 버전에서도 가능한 정석 코드 byte[] buffer = new byte[8192]; int read; while ((read = is.read(buffer)) >= 0) { os.write(buffer, 0, read); } // java 9 이상 사용시 Inputstream 의 transferTo(OutputStream out); 사용 // is.transferTo(os); // Spring 을 사용 중이라면 아래 2가지 방식 모두 고려해보자. // StreamUtils.copy(is, os); // is, os 를 close 하지 않음, 내부 버퍼 4096 사용 // FileCopyUtils.copy(is, os); // is, os 를 자동으로 close 함, 내부 버퍼 8192 사용 } catch (Exception e) { e.printStackTrace(); } }

위에서 사용한 것은 InputStream, OutputStream 이였다면 이번에는 Reader, Writer로 파일을 제어할 수 있는 방법도 알아보자.

Files.newBufferedReader(Paths.get("파일경로"), StandardCharsets.UTF_8); Files.newBufferedWriter(Paths.get("파일경로"), StandardCharsets.UTF_8);

이 방법으로 다시 위의 동일한 파일 복제 기능을 구현하려면 아래처럼 코딩한다.

String realPath = "D:/[Java] Read And Write File/123.txt"; String writePath = realPath.substring(0, realPath.lastIndexOf("/")) + "/wow.txt" ; try(BufferedReader reader = Files.newBufferedReader(Paths.get(realPath), StandardCharsets.UTF_8); BufferedWriter writer = Files.newBufferedWriter(Paths.get(writePath), StandardCharsets.UTF_8) ) { // 어떤 java 버전에서도 가능한 정석 코드 char[] buffer = new char[8192]; int read; while ((read = reader.read(buffer)) >= 0) { writer.write(buffer, 0, read); } } catch (Exception e) { e.printStackTrace(); }

지금까지 Stream 을 사용한 파일 복제 방법을 알아봤다.

그런데 단순 파일 복제는 아래에서 볼 경로를 통한 파일 복제 방법이 더 편하다. Stream 방식은 HttpServletRequest, HttpServletResponse 와 작업을 할 때 더 유용하다.

🥝 경로를 통한 파일 복제

정말 간단하다.

public static void main(String[] args) throws IOException { String realPath = "D:/[Java] Read And Write File/123.txt"; String writePath = realPath.substring(0, realPath.lastIndexOf("/")) + "/wow.txt" ; Files.copy(Paths.get(realPath), Paths.get(writePath)); }

Files.copy(); 는 오버라이드로 3가지 종류가 있다

Files.copy(Path path, OutputStream out) Files.copy(InputStream in, Path path, CopyOption... option) Files.copy(Path path, Path target, CopyOption... option)

대충보면 어떻게 쓰는지 감이 잡히리라 생각한다. 더 이상의 설명은 안하겠다.

참고로 java.nio.file.CopyOption 인자 값으로 몇가지 추가적인 옵션을 줄 수 있다.

다른 블로그에서는 StandardCopyOption.REPLACE_EXISTING 를 흔히 쓰는 걸 봤다. 필요하다면 사용하자.

🥝 Directory 복사하기

Files 에는 재귀적으로 Directory 내의 모든 것을 복사하는 기능은 없다.

Directory의 내부 모든 파일을 재귀적으로 복사하고 싶다면 org.springframework.util.FileSystemUtils.copyRecursively(~) 를 사용하자.

🥝 파일의 문자열 모두 읽어오기

방법1: Files.newBufferedReader

public static void main(String[] args) { String temp = "D:/[Java] Read And Write File/123.txt"; try(BufferedReader br = Files.newBufferedReader(Paths.get(temp), StandardCharsets.UTF_8)) { StringBuilder builder = new StringBuilder(); String str = null; while((str = br.readLine()) != null) { builder.append(str).append("\n"); } System.out.print(builder.toString()); } catch (IOException e) { e.printStackTrace(); } }

방법2: Files.lines

public static void main(String[] args) { String temp = "D:/[Java] Read And Write File/123.txt"; try(Stream lines = Files.lines(Paths.get(temp), StandardCharsets.UTF_8)) { StringBuilder builder = new StringBuilder(); lines.forEach(s -> builder.append(s).append("\n")); System.out.println(builder.toString()); } catch (IOException e) { e.printStackTrace(); } }

🥝 텍스트 파일에 글 쓰기 public static void main(String[] args) throws IOException { String temp = "D:/[Java] Read And Write File/123.txt"; ArrayList messageList = new ArrayList(Arrays.asList("hello", "world")); // 방법1: Files.write // 두번째 파라미터로 Iterable


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3