Apache Commons IO

1. 개요

Apache Commons 프로젝트는 개발자에게 일상적인 코드에서 사용할 수있는 공통 라이브러리 세트를 제공하기 위해 만들어졌습니다.

이 튜토리얼에서는 Commons IO 모듈의 주요 유틸리티 클래스와 가장 잘 알려진 기능을 탐색합니다.

2. Maven 종속성

라이브러리를 사용하기 위해 pom.xml 에 다음 Maven 종속성을 포함시켜 보겠습니다 .

 commons-io commons-io 2.5 

최신 버전의 라이브러리는 Maven Central에서 찾을 수 있습니다.

3. 유틸리티 클래스

간단히 말해, 유틸리티 클래스는 파일에 대한 일반적인 작업수행하는 데 사용할 수있는 정적 메서드 집합을 제공합니다 .

3.1. FileUtils

이 클래스는 파일 열기, 읽기, 복사 및 이동과 같은 다양한 작업을 제공합니다.

FileUtils를 사용하여 파일을 읽거나 복사하는 방법을 살펴 보겠습니다 .

File file = FileUtils.getFile(getClass().getClassLoader() .getResource("fileTest.txt") .getPath()); File tempDir = FileUtils.getTempDirectory(); FileUtils.copyFileToDirectory(file, tempDir); File newTempFile = FileUtils.getFile(tempDir, file.getName()); String data = FileUtils.readFileToString(newTempFile, Charset.defaultCharset());

3.2. FilenameUtils

이 유틸리티는 파일 이름에 대해 공통 기능을 실행 하는 운영 체제에 구애받지 않는 방법을 제공합니다 . 우리가 활용할 수있는 몇 가지 다른 방법을 살펴 보겠습니다.

String fullPath = FilenameUtils.getFullPath(path); String extension = FilenameUtils.getExtension(path); String baseName = FilenameUtils.getBaseName(path);

3.3. FileSystemUtils

FileSystemUtils 를 사용 하여 주어진 볼륨 또는 드라이브의 여유 공간확인할 수 있습니다 .

long freeSpace = FileSystemUtils.freeSpaceKb("/");

4. 입력 및 출력

이 패키지는 입력 및 출력 스트림 작업을 위한 여러 구현을 제공합니다 .

TeeInputStreamTeeOutputSteam중점둘 것 입니다. " T " 라는 단어 (문자 " T " 에서 파생 됨 )는 일반적으로 단일 입력이 두 개의 다른 출력으로 분할됨을 설명하는 데 사용됩니다.

단일 입력 스트림을 두 개의 다른 출력 스트림에 작성하는 방법을 보여주는 예제를 살펴 보겠습니다 .

String str = "Hello World."; ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream(); FilterOutputStream teeOutputStream = new TeeOutputStream(outputStream1, outputStream2); new TeeInputStream(inputStream, teeOutputStream, true) .read(new byte[str.length()]); assertEquals(str, String.valueOf(outputStream1)); assertEquals(str, String.valueOf(outputStream2));

5. 필터

Commons IO에는 유용한 파일 필터 목록이 포함되어 있습니다. 개발자가 이기종 파일 목록에서 원하는 특정 파일 목록 으로 범위좁히고 자 할 때 유용 할 수 있습니다.

라이브러리는 주어진 파일 목록에 대한 ANDOR 논리 연산 도 지원 합니다. 따라서 이러한 필터를 혼합하고 일치시켜 원하는 결과를 얻을 수 있습니다.

하자는 차종이의 사용을 예를 참조 WildcardFileFilterSuffixFileFilter "이 파일을 검색 할 수 PLE 는"그들의 이름에 " TXT "접미사를. ANDFileFilter를 사용하여 위의 필터를 래핑합니다 .

@Test public void whenGetFilewith_ANDFileFilter_thenFind_sample_txt() throws IOException { String path = getClass().getClassLoader() .getResource("fileTest.txt") .getPath(); File dir = FileUtils.getFile(FilenameUtils.getFullPath(path)); assertEquals("sample.txt", dir.list(new AndFileFilter( new WildcardFileFilter("*ple*", IOCase.INSENSITIVE), new SuffixFileFilter("txt")))[0]); }

6. 비교기

비교기 패키지 제공 파일에 대한 비교의 다른 유형을 . 여기서는 두 가지 다른 비교기를 살펴 보겠습니다.

6.1. PathFileComparator

The PathFileComparator class can be used to sort lists or arrays of files by their path either in a case-sensitive, case-insensitive, or system-dependent case-sensitive way. Let's see how to sort file paths in the resources directory using this utility:

@Test public void whenSortDirWithPathFileComparator_thenFirstFile_aaatxt() throws IOException { PathFileComparator pathFileComparator = new PathFileComparator( IOCase.INSENSITIVE); String path = FilenameUtils.getFullPath(getClass() .getClassLoader() .getResource("fileTest.txt") .getPath()); File dir = new File(path); File[] files = dir.listFiles(); pathFileComparator.sort(files); assertEquals("aaa.txt", files[0].getName()); }

Note that we have used the IOCase.INSENSITIVE configuration. PathFileComparator also provides a number of singleton instances that have different case-sensitivity and reverse-sorting options.

These static fields include PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, to name few.

6.2. SizeFileComparator

SizeFileComparator is, as its name suggests, used to compare the sizes (lengths) of two files. It returns a negative integer value if the first file's size is less than that of the second file. It returns zero if the file sizes are equal and a positive value if the first file's size is greater than the second file's size.

Let's write a unit test demonstrating a comparison of file sizes:

@Test public void whenSizeFileComparator_thenLargerFile_large() throws IOException { SizeFileComparator sizeFileComparator = new SizeFileComparator(); File largerFile = FileUtils.getFile(getClass().getClassLoader() .getResource("fileTest.txt") .getPath()); File smallerFile = FileUtils.getFile(getClass().getClassLoader() .getResource("sample.txt") .getPath()); int i = sizeFileComparator.compare(largerFile, smallerFile); Assert.assertTrue(i > 0); }

7. File Monitor

The Commons IO monitor package provides the capability to track changes to a file or directory. Let's see a quick example of how FileAlterationMonitor can be used together with FileAlterationObserver and FileAlterationListener to monitor a file or folder.

FileAlterationMonitor 가 시작 되면 모니터링중인 디렉터리의 파일 변경에 대한 알림을 받기 시작합니다 .

FileAlterationObserver observer = new FileAlterationObserver(folder); FileAlterationMonitor monitor = new FileAlterationMonitor(5000); FileAlterationListener fal = new FileAlterationListenerAdaptor() { @Override public void onFileCreate(File file) { // on create action } @Override public void onFileDelete(File file) { // on delete action } }; observer.addListener(fal); monitor.addObserver(observer); monitor.start();

8. 결론

이 기사에서는 Commons IO 패키지에서 일반적으로 사용되는 몇 가지 구성 요소에 대해 설명했습니다. 그러나 패키지에는 다른 많은 기능도 제공됩니다. 자세한 내용은 API 문서를 참조하십시오.

이 예제에 사용 된 코드는 GitHub 프로젝트에서 찾을 수 있습니다.