Directories in Java
Here’s the translation of the Go code example to Java, along with explanations in Markdown format suitable for Hugo:
Java has several useful classes for working with directories in the file system.
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Directories {
private static void check(IOException e) {
if (e != null) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
// Create a new sub-directory in the current working directory.
File subdir = new File("subdir");
boolean created = subdir.mkdir();
if (!created) {
System.out.println("Failed to create directory");
return;
}
// When creating temporary directories, it's good practice to delete them when done.
// We'll use a try-with-resources to ensure cleanup.
try {
// Helper method to create a new empty file.
createEmptyFile("subdir/file1");
// We can create a hierarchy of directories, including parents with mkdirs().
// This is similar to the command-line `mkdir -p`.
File parentChild = new File("subdir/parent/child");
parentChild.mkdirs();
createEmptyFile("subdir/parent/file2");
createEmptyFile("subdir/parent/file3");
createEmptyFile("subdir/parent/child/file4");
// listFiles() lists directory contents, returning an array of File objects.
File parentDir = new File("subdir/parent");
File[] contents = parentDir.listFiles();
System.out.println("Listing subdir/parent");
if (contents != null) {
for (File entry : contents) {
System.out.println(" " + entry.getName() + " " + entry.isDirectory());
}
}
// Change the current working directory
System.setProperty("user.dir", "subdir/parent/child");
// Now we'll see the contents of subdir/parent/child when listing the current directory.
File currentDir = new File(".");
contents = currentDir.listFiles();
System.out.println("Listing subdir/parent/child");
if (contents != null) {
for (File entry : contents) {
System.out.println(" " + entry.getName() + " " + entry.isDirectory());
}
}
// Change back to where we started.
System.setProperty("user.dir", "../../..");
// We can also visit a directory recursively, including all its sub-directories.
// Files.walk() returns a Stream of Path objects that we can iterate over.
System.out.println("Visiting subdir");
Files.walk(Paths.get("subdir"))
.forEach(path -> visit(path.toString(), Files.isDirectory(path)));
} catch (IOException e) {
e.printStackTrace();
} finally {
// Clean up: delete the temporary directory and all its contents
deleteDirectory(new File("subdir"));
}
}
private static void createEmptyFile(String name) throws IOException {
Files.write(Paths.get(name), new byte[0]);
}
private static void visit(String path, boolean isDirectory) {
System.out.println(" " + path + " " + isDirectory);
}
private static void deleteDirectory(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
file.delete();
}
}
}
dir.delete();
}
}
To run the program, compile it and use java
:
$ javac Directories.java
$ java Directories
Listing subdir/parent
child true
file2 false
file3 false
Listing subdir/parent/child
file4 false
Visiting subdir
subdir true
subdir/file1 false
subdir/parent true
subdir/parent/child true
subdir/parent/child/file4 false
subdir/parent/file2 false
subdir/parent/file3 false
This Java program demonstrates various operations with directories, including creating directories, listing contents, changing the working directory, and recursively walking through a directory structure. It uses classes from the java.io
and java.nio.file
packages to handle file system operations.
The program creates a temporary directory structure, performs operations on it, and then cleans up by deleting the created directories and files. It showcases the use of File
class methods like mkdir()
, mkdirs()
, and listFiles()
, as well as newer APIs like Files.walk()
for recursive directory traversal.
Note that Java doesn’t have a direct equivalent to Go’s defer
keyword, so we use a try-with-resources statement to ensure cleanup of resources. Also, changing the current working directory is generally not recommended in Java applications, but it’s demonstrated here using System.setProperty("user.dir", ...)
for completeness.