/*
* Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.store.fs;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
This utility class contains utility functions that use the file system
abstraction.
/**
* This utility class contains utility functions that use the file system
* abstraction.
*/
public class FileUtils {
Checks if a file exists.
This method is similar to Java 7 java.nio.file.Path.exists
.
Params: - fileName – the file name
Returns: true if it exists
/**
* Checks if a file exists.
* This method is similar to Java 7 <code>java.nio.file.Path.exists</code>.
*
* @param fileName the file name
* @return true if it exists
*/
public static boolean exists(String fileName) {
return FilePath.get(fileName).exists();
}
Create a directory (all required parent directories must already exist).
This method is similar to Java 7
java.nio.file.Path.createDirectory
.
Params: - directoryName – the directory name
/**
* Create a directory (all required parent directories must already exist).
* This method is similar to Java 7
* <code>java.nio.file.Path.createDirectory</code>.
*
* @param directoryName the directory name
*/
public static void createDirectory(String directoryName) {
FilePath.get(directoryName).createDirectory();
}
Create a new file. This method is similar to Java 7
java.nio.file.Path.createFile
, but returns false instead of
throwing a exception if the file already existed.
Params: - fileName – the file name
Returns: true if creating was successful
/**
* Create a new file. This method is similar to Java 7
* <code>java.nio.file.Path.createFile</code>, but returns false instead of
* throwing a exception if the file already existed.
*
* @param fileName the file name
* @return true if creating was successful
*/
public static boolean createFile(String fileName) {
return FilePath.get(fileName).createFile();
}
Delete a file or directory if it exists.
Directories may only be deleted if they are empty.
This method is similar to Java 7
java.nio.file.Path.deleteIfExists
.
Params: - path – the file or directory name
/**
* Delete a file or directory if it exists.
* Directories may only be deleted if they are empty.
* This method is similar to Java 7
* <code>java.nio.file.Path.deleteIfExists</code>.
*
* @param path the file or directory name
*/
public static void delete(String path) {
FilePath.get(path).delete();
}
Get the canonical file or directory name. This method is similar to Java
7 java.nio.file.Path.toRealPath
.
Params: - fileName – the file name
Returns: the normalized file name
/**
* Get the canonical file or directory name. This method is similar to Java
* 7 <code>java.nio.file.Path.toRealPath</code>.
*
* @param fileName the file name
* @return the normalized file name
*/
public static String toRealPath(String fileName) {
return FilePath.get(fileName).toRealPath().toString();
}
Get the parent directory of a file or directory. This method returns null
if there is no parent. This method is similar to Java 7
java.nio.file.Path.getParent
.
Params: - fileName – the file or directory name
Returns: the parent directory name
/**
* Get the parent directory of a file or directory. This method returns null
* if there is no parent. This method is similar to Java 7
* <code>java.nio.file.Path.getParent</code>.
*
* @param fileName the file or directory name
* @return the parent directory name
*/
public static String getParent(String fileName) {
FilePath p = FilePath.get(fileName).getParent();
return p == null ? null : p.toString();
}
Check if the file name includes a path. This method is similar to Java 7
java.nio.file.Path.isAbsolute
.
Params: - fileName – the file name
Returns: if the file name is absolute
/**
* Check if the file name includes a path. This method is similar to Java 7
* <code>java.nio.file.Path.isAbsolute</code>.
*
* @param fileName the file name
* @return if the file name is absolute
*/
public static boolean isAbsolute(String fileName) {
return FilePath.get(fileName).isAbsolute()
// Allows Windows to recognize "/path" as absolute.
// Makes the same configuration work on all platforms.
|| fileName.startsWith(File.pathSeparator)
// Just in case of non-normalized path on Windows
|| fileName.startsWith("/");
}
Rename a file if this is allowed. This method is similar to Java 7
java.nio.file.Files.move
.
Params: - source – the old fully qualified file name
- target – the new fully qualified file name
/**
* Rename a file if this is allowed. This method is similar to Java 7
* <code>java.nio.file.Files.move</code>.
*
* @param source the old fully qualified file name
* @param target the new fully qualified file name
*/
public static void move(String source, String target) {
FilePath.get(source).moveTo(FilePath.get(target), false);
}
Rename a file if this is allowed, and try to atomically replace an
existing file. This method is similar to Java 7
java.nio.file.Files.move
.
Params: - source – the old fully qualified file name
- target – the new fully qualified file name
/**
* Rename a file if this is allowed, and try to atomically replace an
* existing file. This method is similar to Java 7
* <code>java.nio.file.Files.move</code>.
*
* @param source the old fully qualified file name
* @param target the new fully qualified file name
*/
public static void moveAtomicReplace(String source, String target) {
FilePath.get(source).moveTo(FilePath.get(target), true);
}
Get the file or directory name (the last element of the path).
This method is similar to Java 7 java.nio.file.Path.getName
.
Params: - path – the directory and file name
Returns: just the file name
/**
* Get the file or directory name (the last element of the path).
* This method is similar to Java 7 <code>java.nio.file.Path.getName</code>.
*
* @param path the directory and file name
* @return just the file name
*/
public static String getName(String path) {
return FilePath.get(path).getName();
}
List the files and directories in the given directory.
This method is similar to Java 7
java.nio.file.Path.newDirectoryStream
.
Params: - path – the directory
Returns: the list of fully qualified file names
/**
* List the files and directories in the given directory.
* This method is similar to Java 7
* <code>java.nio.file.Path.newDirectoryStream</code>.
*
* @param path the directory
* @return the list of fully qualified file names
*/
public static List<String> newDirectoryStream(String path) {
List<FilePath> list = FilePath.get(path).newDirectoryStream();
int len = list.size();
List<String> result = new ArrayList<>(len);
for (FilePath filePath : list) {
result.add(filePath.toString());
}
return result;
}
Get the last modified date of a file.
This method is similar to Java 7
java.nio.file.attribute.Attributes.
readBasicFileAttributes(file).lastModified().toMillis()
Params: - fileName – the file name
Returns: the last modified date
/**
* Get the last modified date of a file.
* This method is similar to Java 7
* <code>java.nio.file.attribute.Attributes.
* readBasicFileAttributes(file).lastModified().toMillis()</code>
*
* @param fileName the file name
* @return the last modified date
*/
public static long lastModified(String fileName) {
return FilePath.get(fileName).lastModified();
}
Get the size of a file in bytes
This method is similar to Java 7
java.nio.file.attribute.Attributes.
readBasicFileAttributes(file).size()
Params: - fileName – the file name
Returns: the size in bytes
/**
* Get the size of a file in bytes
* This method is similar to Java 7
* <code>java.nio.file.attribute.Attributes.
* readBasicFileAttributes(file).size()</code>
*
* @param fileName the file name
* @return the size in bytes
*/
public static long size(String fileName) {
return FilePath.get(fileName).size();
}
Check if it is a file or a directory.
java.nio.file.attribute.Attributes.
readBasicFileAttributes(file).isDirectory()
Params: - fileName – the file or directory name
Returns: true if it is a directory
/**
* Check if it is a file or a directory.
* <code>java.nio.file.attribute.Attributes.
* readBasicFileAttributes(file).isDirectory()</code>
*
* @param fileName the file or directory name
* @return true if it is a directory
*/
public static boolean isDirectory(String fileName) {
return FilePath.get(fileName).isDirectory();
}
Open a random access file object.
This method is similar to Java 7
java.nio.channels.FileChannel.open
.
Params: - fileName – the file name
- mode – the access mode. Supported are r, rw, rws, rwd
Returns: the file object
/**
* Open a random access file object.
* This method is similar to Java 7
* <code>java.nio.channels.FileChannel.open</code>.
*
* @param fileName the file name
* @param mode the access mode. Supported are r, rw, rws, rwd
* @return the file object
*/
public static FileChannel open(String fileName, String mode)
throws IOException {
return FilePath.get(fileName).open(mode);
}
Create an input stream to read from the file.
This method is similar to Java 7
java.nio.file.Path.newInputStream
.
Params: - fileName – the file name
Returns: the input stream
/**
* Create an input stream to read from the file.
* This method is similar to Java 7
* <code>java.nio.file.Path.newInputStream</code>.
*
* @param fileName the file name
* @return the input stream
*/
public static InputStream newInputStream(String fileName)
throws IOException {
return FilePath.get(fileName).newInputStream();
}
Create an output stream to write into the file.
This method is similar to Java 7
java.nio.file.Path.newOutputStream
.
Params: - fileName – the file name
- append – if true, the file will grow, if false, the file will be
truncated first
Returns: the output stream
/**
* Create an output stream to write into the file.
* This method is similar to Java 7
* <code>java.nio.file.Path.newOutputStream</code>.
*
* @param fileName the file name
* @param append if true, the file will grow, if false, the file will be
* truncated first
* @return the output stream
*/
public static OutputStream newOutputStream(String fileName, boolean append)
throws IOException {
return FilePath.get(fileName).newOutputStream(append);
}
Check if the file is writable.
This method is similar to Java 7
java.nio.file.Path.checkAccess(AccessMode.WRITE)
Params: - fileName – the file name
Returns: if the file is writable
/**
* Check if the file is writable.
* This method is similar to Java 7
* <code>java.nio.file.Path.checkAccess(AccessMode.WRITE)</code>
*
* @param fileName the file name
* @return if the file is writable
*/
public static boolean canWrite(String fileName) {
return FilePath.get(fileName).canWrite();
}
// special methods =======================================
Disable the ability to write. The file can still be deleted afterwards.
Params: - fileName – the file name
Returns: true if the call was successful
/**
* Disable the ability to write. The file can still be deleted afterwards.
*
* @param fileName the file name
* @return true if the call was successful
*/
public static boolean setReadOnly(String fileName) {
return FilePath.get(fileName).setReadOnly();
}
Get the unwrapped file name (without wrapper prefixes if wrapping /
delegating file systems are used).
Params: - fileName – the file name
Returns: the unwrapped
/**
* Get the unwrapped file name (without wrapper prefixes if wrapping /
* delegating file systems are used).
*
* @param fileName the file name
* @return the unwrapped
*/
public static String unwrap(String fileName) {
return FilePath.get(fileName).unwrap().toString();
}
// utility methods =======================================
Delete a directory or file and all subdirectories and files.
Params: - path – the path
- tryOnly – whether errors should be ignored
/**
* Delete a directory or file and all subdirectories and files.
*
* @param path the path
* @param tryOnly whether errors should be ignored
*/
public static void deleteRecursive(String path, boolean tryOnly) {
if (exists(path)) {
if (isDirectory(path)) {
for (String s : newDirectoryStream(path)) {
deleteRecursive(s, tryOnly);
}
}
if (tryOnly) {
tryDelete(path);
} else {
delete(path);
}
}
}
Create the directory and all required parent directories.
Params: - dir – the directory name
/**
* Create the directory and all required parent directories.
*
* @param dir the directory name
*/
public static void createDirectories(String dir) {
if (dir != null) {
if (exists(dir)) {
if (!isDirectory(dir)) {
// this will fail
createDirectory(dir);
}
} else {
String parent = getParent(dir);
createDirectories(parent);
createDirectory(dir);
}
}
}
Try to delete a file or directory (ignoring errors).
Params: - path – the file or directory name
Returns: true if it worked
/**
* Try to delete a file or directory (ignoring errors).
*
* @param path the file or directory name
* @return true if it worked
*/
public static boolean tryDelete(String path) {
try {
FilePath.get(path).delete();
return true;
} catch (Exception e) {
return false;
}
}
Create a new temporary file.
Params: - prefix – the prefix of the file name (including directory name if
required)
- suffix – the suffix
- inTempDir – if the file should be stored in the temporary directory
Returns: the name of the created file
/**
* Create a new temporary file.
*
* @param prefix the prefix of the file name (including directory name if
* required)
* @param suffix the suffix
* @param inTempDir if the file should be stored in the temporary directory
* @return the name of the created file
*/
public static String createTempFile(String prefix, String suffix,
boolean inTempDir) throws IOException {
return FilePath.get(prefix).createTempFile(suffix, inTempDir).toString();
}
Fully read from the file. This will read all remaining bytes,
or throw an EOFException if not successful.
Params: - channel – the file channel
- dst – the byte buffer
/**
* Fully read from the file. This will read all remaining bytes,
* or throw an EOFException if not successful.
*
* @param channel the file channel
* @param dst the byte buffer
*/
public static void readFully(FileChannel channel, ByteBuffer dst)
throws IOException {
do {
int r = channel.read(dst);
if (r < 0) {
throw new EOFException();
}
} while (dst.remaining() > 0);
}
Fully write to the file. This will write all remaining bytes.
Params: - channel – the file channel
- src – the byte buffer
/**
* Fully write to the file. This will write all remaining bytes.
*
* @param channel the file channel
* @param src the byte buffer
*/
public static void writeFully(FileChannel channel, ByteBuffer src)
throws IOException {
do {
channel.write(src);
} while (src.remaining() > 0);
}
}