fileutils.java
来自「JAVA 文章管理系统源码」· Java 代码 · 共 845 行 · 第 1/3 页
JAVA
845 行
InputStream input1 = null;
InputStream input2 = null;
try {
input1 = new java.io.FileInputStream(file1);
input2 = new java.io.FileInputStream(file2);
return IOUtils.contentEquals(input1, input2);
} finally {
IOUtils.closeQuietly(input1);
IOUtils.closeQuietly(input2);
}
}
/**
* Convert from a <code>URL</code> to a <code>File</code>.
* @param url File URL.
* @return The equivalent <code>File</code> object, or <code>null</code> if the URL's protocol
* is not <code>file</code>
*/
public static File toFile(URL url) {
if (url.getProtocol().equals("file") == false) {
return null;
} else {
String filename =
url.getFile().replace('/', File.separatorChar);
return new File(filename);
}
}
/**
* Convert the array of Files into a list of URLs.
*
* @param files the array of files
* @return the array of URLs
* @throws IOException if an error occurs
*/
public static URL[] toURLs(File[] files) throws IOException {
URL[] urls = new URL[files.length];
for (int i = 0; i < urls.length; i++) {
urls[i] = files[i].toURL();
}
return urls;
}
/**
* Copy file from source to destination. If <code>destinationDirectory</code> does not exist, it
* (and any parent directories) will be created. If a file <code>source</code> in
* <code>destinationDirectory</code> exists, it will be overwritten.
* The copy will have the same file date as the original.
*
* @param source An existing <code>File</code> to copy.
* @param destinationDirectory A directory to copy <code>source</code> into.
*
* @throws FileNotFoundException if <code>source</code> isn't a normal file.
* @throws IllegalArgumentException if <code>destinationDirectory</code> isn't a directory.
* @throws IOException if <code>source</code> does not exist, the file in
* <code>destinationDirectory</code> cannot be written to, or an IO error occurs during copying.
*/
public static void copyFileToDirectory(
File source,
File destinationDirectory)
throws IOException {
if (destinationDirectory.exists()
&& !destinationDirectory.isDirectory()) {
throw new IllegalArgumentException("Destination is not a directory");
}
copyFile(source, new File(destinationDirectory, source.getName()), true);
}
/**
* Copy file from source to destination. The directories up to
* <code>destination</code> will be created if they don't already exist.
* <code>destination</code> will be overwritten if it already exists.
* The copy will have the same file date as the original.
*
* @param source An existing non-directory <code>File</code> to copy
* bytes from.
* @param destination A non-directory <code>File</code> to write bytes to
* (possibly overwriting).
*
* @throws IOException if <code>source</code> does not exist, <code>destination</code> cannot be
* written to, or an IO error occurs during copying.
*
* @throws FileNotFoundException if <code>destination</code> is a directory
* (use {@link #copyFileToDirectory}).
*/
public static void copyFile(File source, File destination)
throws IOException {
copyFile(source, destination, true);
}
/**
* Copy file from source to destination. The directories up to
* <code>destination</code> will be created if they don't already exist.
* <code>destination</code> will be overwritten if it already exists.
*
* @param source An existing non-directory <code>File</code> to copy
* bytes from.
* @param destination A non-directory <code>File</code> to write bytes to
* (possibly overwriting).
* @param preserveFileDate True if the file date of the copy should be the
* same as the original.
*
* @throws IOException if <code>source</code> does not exist, <code>destination</code> cannot be
* written to, or an IO error occurs during copying.
*
* @throws FileNotFoundException if <code>destination</code> is a directory
* (use {@link #copyFileToDirectory}).
*/
public static void copyFile(File source, File destination, boolean preserveFileDate)
throws IOException {
//check source exists
if (!source.exists()) {
String message = "File " + source + " does not exist";
throw new FileNotFoundException(message);
}
//does destinations directory exist ?
if (destination.getParentFile() != null
&& !destination.getParentFile().exists()) {
destination.getParentFile().mkdirs();
}
//make sure we can write to destination
if (destination.exists() && !destination.canWrite()) {
String message =
"Unable to open file " + destination + " for writing.";
throw new IOException(message);
}
//makes sure it is not the same file
if (source.getCanonicalPath().equals(destination.getCanonicalPath())) {
String message =
"Unable to write file " + source + " on itself.";
throw new IOException(message);
}
FileInputStream input = new FileInputStream(source);
try {
FileOutputStream output = new FileOutputStream(destination);
try {
CopyUtils.copy(input, output);
} finally {
IOUtils.closeQuietly(output);
}
} finally {
IOUtils.closeQuietly(input);
}
if (source.length() != destination.length()) {
String message =
"Failed to copy full contents from "
+ source
+ " to "
+ destination;
throw new IOException(message);
}
if (preserveFileDate) {
//file copy should preserve file date
destination.setLastModified(source.lastModified());
}
}
/**
* Copies bytes from the URL <code>source</code> to a file <code>destination</code>.
* The directories up to <code>destination</code> will be created if they don't already exist.
* <code>destination</code> will be overwritten if it already exists.
*
* @param source A <code>URL</code> to copy bytes from.
* @param destination A non-directory <code>File</code> to write bytes to (possibly
* overwriting).
*
* @throws IOException if
* <ul>
* <li><code>source</code> URL cannot be opened</li>
* <li><code>destination</code> cannot be written to</li>
* <li>an IO error occurs during copying</li>
* </ul>
*/
public static void copyURLToFile(URL source, File destination)
throws IOException {
//does destination directory exist ?
if (destination.getParentFile() != null
&& !destination.getParentFile().exists()) {
destination.getParentFile().mkdirs();
}
//make sure we can write to destination
if (destination.exists() && !destination.canWrite()) {
String message =
"Unable to open file " + destination + " for writing.";
throw new IOException(message);
}
InputStream input = source.openStream();
try {
FileOutputStream output = new FileOutputStream(destination);
try {
CopyUtils.copy(input, output);
} finally {
IOUtils.closeQuietly(output);
}
} finally {
IOUtils.closeQuietly(input);
}
}
/**
* Recursively delete a directory.
* @param directory directory to delete
* @throws IOException in case deletion is unsuccessful
*/
public static void deleteDirectory(File directory)
throws IOException {
if (!directory.exists()) {
return;
}
cleanDirectory(directory);
if (!directory.delete()) {
String message =
"Unable to delete directory " + directory + ".";
throw new IOException(message);
}
}
/**
* Clean a directory without deleting it.
* @param directory directory to clean
* @throws IOException in case cleaning is unsuccessful
*/
public static void cleanDirectory(File directory)
throws IOException {
if (!directory.exists()) {
String message = directory + " does not exist";
throw new IllegalArgumentException(message);
}
if (!directory.isDirectory()) {
String message = directory + " is not a directory";
throw new IllegalArgumentException(message);
}
IOException exception = null;
File[] files = directory.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
try {
forceDelete(file);
} catch (IOException ioe) {
exception = ioe;
}
}
if (null != exception) {
throw exception;
}
}
/**
* Waits for NFS to propagate a file creation, imposing a timeout.
*
* @param file The file
* @param seconds The maximum time in seconds to wait.
* @return True if file exists.
* TODO Needs a clearer javadoc to see its real purpose for someone without
* NFS-knowledge.
*/
public static boolean waitFor(File file, int seconds) {
int timeout = 0;
int tick = 0;
while (!file.exists()) {
if (tick++ >= 10) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?