Skip to content

Commit 1d14807

Browse files
author
Gary Gregory
committed
[IO-632] Add PathUtils for operations on NIO Path.
1 parent 30d8c4c commit 1d14807

3 files changed

Lines changed: 143 additions & 0 deletions

File tree

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ The <action> type attribute can be add,update,fix,remove.
146146
<action issue="IO-631" dev="ggregory" type="add" due-to="Gary Gregory">
147147
Add a CountingFileVisitor (as the basis for a forthcoming DeletingFileVisitor).
148148
</action>
149+
<action issue="IO-632" dev="ggregory" type="add" due-to="Gary Gregory">
150+
Add PathUtils for operations on NIO Path.
151+
</action>
149152
</release>
150153

151154
<release version="2.6" date="2017-10-15" description="Java 7 required, Java 9 supported.">
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.commons.io;
19+
20+
import java.io.IOException;
21+
import java.nio.file.DirectoryStream;
22+
import java.nio.file.Files;
23+
import java.nio.file.Path;
24+
25+
/**
26+
* NIO Path utilities.
27+
*
28+
* @since 2.7
29+
*/
30+
public class PathUtils {
31+
32+
/**
33+
* Returns whether the given file or directory is empty.
34+
*
35+
* @param path the the given file or directory to query.
36+
* @return whether the given file or directory is empty.
37+
* @throws IOException if an I/O error occurs
38+
*/
39+
public static boolean isEmpty(final Path path) throws IOException {
40+
return Files.isDirectory(path) ? isEmptyDirectory(path) : isEmptyFile(path);
41+
}
42+
43+
/**
44+
* Returns whether the directory is empty.
45+
*
46+
* @param directory the the given directory to query.
47+
* @return whether the given directory is empty.
48+
* @throws IOException if an I/O error occurs
49+
*/
50+
public static boolean isEmptyDirectory(final Path directory) throws IOException {
51+
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(directory)) {
52+
if (directoryStream.iterator().hasNext()) {
53+
return false;
54+
}
55+
}
56+
return true;
57+
}
58+
59+
/**
60+
* Returns whether the given file is empty.
61+
*
62+
* @param file the the given file to query.
63+
* @return whether the given file is empty.
64+
* @throws IOException if an I/O error occurs
65+
*/
66+
public static boolean isEmptyFile(final Path file) throws IOException {
67+
return Files.size(file) <= 0;
68+
}
69+
70+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.commons.io;
19+
20+
import java.io.IOException;
21+
import java.nio.file.Files;
22+
import java.nio.file.Path;
23+
import java.nio.file.Paths;
24+
25+
import org.junit.jupiter.api.Assertions;
26+
import org.junit.jupiter.api.Test;
27+
28+
/**
29+
* Tests {@link PathUtils}.
30+
*/
31+
public class PathUtilsTest {
32+
33+
private static final Path DIR_SIZE_1 = Paths.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-1");
34+
35+
private static final Path FILE_SIZE_0 = Paths
36+
.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-0/file-size-0.bin");
37+
38+
private static final Path FILE_SIZE_1 = Paths
39+
.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-1/file-size-1.bin");
40+
41+
@Test
42+
public void testIsEmpty() throws IOException {
43+
Assertions.assertTrue(PathUtils.isEmpty(FILE_SIZE_0));
44+
Assertions.assertFalse(PathUtils.isEmpty(FILE_SIZE_1));
45+
final Path tempDirectory = Files.createTempDirectory(getClass().getCanonicalName());
46+
try {
47+
Assertions.assertTrue(PathUtils.isEmpty(tempDirectory));
48+
} finally {
49+
Files.delete(tempDirectory);
50+
}
51+
Assertions.assertFalse(PathUtils.isEmpty(DIR_SIZE_1));
52+
}
53+
54+
@Test
55+
public void testisEmptyDirectory() throws IOException {
56+
final Path tempDirectory = Files.createTempDirectory(getClass().getCanonicalName());
57+
try {
58+
Assertions.assertTrue(PathUtils.isEmptyDirectory(tempDirectory));
59+
} finally {
60+
Files.delete(tempDirectory);
61+
}
62+
Assertions.assertFalse(PathUtils.isEmptyDirectory(DIR_SIZE_1));
63+
}
64+
65+
@Test
66+
public void testisEmptyFile() throws IOException {
67+
Assertions.assertTrue(PathUtils.isEmptyFile(FILE_SIZE_0));
68+
Assertions.assertFalse(PathUtils.isEmptyFile(FILE_SIZE_1));
69+
}
70+
}

0 commit comments

Comments
 (0)