📄 fileutility.java
字号:
/**
* $RCSfile: FileUtility.java,v $
* $Revision: 1.4 $
* $Date: 2004/03/01 08:54:04 $
*
* Copyright (C) 2003 ICSS, Inc. All rights reserved.
*
* This software is the proprietary information of ICSS, Inc.
* Use is subject to license terms.
*/
package com.gctech.misc.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
/**
* This class provides basic facilities for manipulating files and file paths.
*
* <h3>Path-related methods</h3>
*
* <p>Methods exist to retrieve the components of a typical file path. For example
* <code>/www/hosted/mysite/index.html</code>, can be broken into:
* <ul>
* <li><code>/www/hosted/mysite/</code> -- retrievable through {@link #getPath}</li>
* <li><code>index.html</code> -- retrievable through {@link #removePath}</li>
* <li><code>/www/hosted/mysite/index</code> -- retrievable through {@link #removeExtension}</li>
* <li><code>html</code> -- retrievable through {@link #getExtension}</li>
* </ul>
* There are also methods to {@link #catPath concatenate two paths}, {@link #resolveFile resolve a
* path relative to a File} and {@link #normalize} a path.
* </p>
*
* <h3>File-related methods</h3>
* <p>
* There are methods to create a {@link #toFile File from a URL}, copy a
* {@link #copyFileToDirectory File to a directory},
* copy a {@link #copyFile File to another File},
* copy a {@link #copyURLToFile URL's contents to a File},
* as well as methods to {@link #deleteDirectory(File) delete} and {@link #cleanDirectory(File)
* clean} a directory.
* </p>
*
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
* @author <a href="mailto:jefft@apache.org">Jeff Turner</a>
*/
public final class FileUtility {
/**
* Private constructor to prevent instantiation.
*
*/
private FileUtility() {}
/**
* Compare the contents of two files to determine if they are equal or not.
*
* @param file1 the first file
* @param file2 the second file
* @return true if the content of the files are equal or they both don't exist, false otherwise
*/
public static boolean contentEquals(final File file1, final File file2) throws IOException {
final boolean file1Exists = file1.exists();
if (file1Exists != file2.exists()) {
return false;
}
if (!file1Exists) {
// two not existing files are equal
return true;
}
if (file1.isDirectory() || file2.isDirectory()) {
// don't want to compare directory contents
return false;
}
InputStream input1 = null;
InputStream input2 = null;
try {
input1 = new FileInputStream(file1);
input2 = new FileInputStream(file2);
final InputStream bufferedInput1 = new BufferedInputStream(input1);
final InputStream bufferedInput2 = new BufferedInputStream(input2);
int ch = bufferedInput1.read();
while (ch != -1) {
if (ch != bufferedInput2.read()) {
return false;
}
ch = bufferedInput1.read();
}
if (-1 != bufferedInput2.read()) {
return false;
}
return true;
}
finally {
IOUtility.shutdownStream(input1);
IOUtility.shutdownStream(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(final URL url) {
if (url.getProtocol().equals("file") == false) {
return null;
}
else {
final 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
* @exception IOException if an error occurs
*/
public static URL[] toURLs(final File[] files) throws IOException {
final URL[] urls = new URL[files.length];
for (int i = 0; i < urls.length; i++) {
urls[i] = files[i].toURL();
}
return urls;
}
/**
* Remove extension from filename.
* ie
* <pre>
* foo.txt --> foo
* a\b\c.jpg --> a\b\c
* a\b\c --> a\b\c
* </pre>
*
* @param filename the filename
* @return the filename minus extension
* @deprecated Use removeExtension as removeExtention is mispelled
*/
public static String removeExtention(final String filename) {
return removeExtension(filename);
}
/**
* Remove extension from filename.
* ie
* <pre>
* foo.txt --> foo
* a\b\c.jpg --> a\b\c
* a\b\c --> a\b\c
* </pre>
*
* @param filename the filename
* @return the filename minus extension
*/
public static String removeExtension(final String filename) {
final int index = filename.lastIndexOf('.');
if (-1 == index) {
return filename;
}
else {
return filename.substring(0, index);
}
}
/**
* Get extension from filename.
* ie
* <pre>
* foo.txt --> "txt"
* a\b\c.jpg --> "jpg"
* a\b\c --> ""
* </pre>
*
* @param filename the filename
* @return the extension of filename or "" if none
*/
public static String getExtension(final String filename) {
final int index = filename.lastIndexOf('.');
if (-1 == index) {
return "";
}
else {
return filename.substring(index + 1);
}
}
/**
* Remove path from filename. Equivalent to the unix command <code>basename</code>
* ie.
* <pre>
* a/b/c.txt --> c.txt
* a.txt --> a.txt
* </pre>
*
* @param filepath the filepath
* @return the filename minus path
*/
public static String removePath(final String filepath) {
return removePath(filepath, File.separatorChar);
}
/**
* Remove path from filename.
* ie.
* <pre>
* a/b/c.txt --> c.txt
* a.txt --> a.txt
* </pre>
*
* @param filepath the filepath
* @return the filename minus path
*/
public static String removePath(final String filepath, final char fileSeparatorChar) {
final int index = filepath.lastIndexOf(fileSeparatorChar);
if (-1 == index) {
return filepath;
}
else {
return filepath.substring(index + 1);
}
}
/**
* Get path from filename. Roughly equivalent to the unix command <code>dirname</code>.
* ie.
* <pre>
* a/b/c.txt --> a/b
* a.txt --> ""
* </pre>
*
* @param filepath the filepath
* @return the filename minus path
*/
public static String getPath(final String filepath) {
return getPath(filepath, File.separatorChar);
}
/**
* Get path from filename.
* ie.
* <pre>
* a/b/c.txt --> a/b
* a.txt --> ""
* </pre>
*
* @param filepath the filepath
* @return the filename minus path
*/
public static String getPath(final String filepath, final char fileSeparatorChar) {
final int index = filepath.lastIndexOf(fileSeparatorChar);
if (-1 == index) {
return "";
}
else {
return filepath.substring(0, index);
}
}
/**
* 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.
*
* @param source An existing <code>File</code> to copy.
* @param destination 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(final String source, final String destinationDirectory) throws IOException {
copyFileToDirectory(new File(source), new File(destinationDirectory));
}
/**
* 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.
*
* @param source An existing <code>File</code> to copy.
* @param destination 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(final File source, final File destinationDirectory) throws IOException {
if (destinationDirectory.exists() && !destinationDirectory.isDirectory()) {
throw new IllegalArgumentException("Destination is not a directory");
}
copyFile(source, new File(destinationDirectory, source.getName()));
}
/**
* 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).
*
* @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(final File source, final File destination) throws IOException {
//check source exists
if (!source.exists()) {
final String message = "File " + source + " does not exist";
throw new IOException(message);
}
//does destinations directory exist ?
if (destination.getParentFile() != null && !destination.getParentFile().exists()) {
destination.mkdirs();
}
//make sure we can write to destination
if (destination.exists() && !destination.canWrite()) {
final String message = "Unable to open file " + destination + " for writing.";
throw new IOException(message);
}
final FileInputStream input = new FileInputStream(source);
final FileOutputStream output = new FileOutputStream(destination);
IOUtility.copy(input, output);
IOUtility.shutdownStream(input);
IOUtility.shutdownStream(output);
if (source.length() != destination.length()) {
final String message = "Failed to copy full contents from " + source + " to " + destination;
throw new IOException(message);
}
}
/**
* 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(final URL source, final File destination) throws IOException {
//does destination directory exist ?
if (destination.getParentFile() != null && !destination.getParentFile().exists()) {
destination.mkdirs();
}
//make sure we can write to destination
if (destination.exists() && !destination.canWrite()) {
final String message = "Unable to open file " + destination + " for writing.";
throw new IOException(message);
}
final InputStream input = source.openStream();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -