Files
geg-gas-pcitc/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/utils/IoUtils.java
2025-10-10 09:20:48 +08:00

350 lines
9.0 KiB
Java

package com.pictc.utils;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class IoUtils {
private final static Charset charset=Charset.forName("UTF-8");
private final static ForkJoinPool forkJoinPool = new ForkJoinPool();
public static void closeQuietly(Closeable... closeables) {
if (closeables == null)
return;
for (Closeable closeable : closeables) {
if (closeable == null)
return;
try {
closeable.close();
} catch (IOException ignored) {
}
}
}
// In JDK 1.6, java.net.Socket doesn't implement Closeable, so we have this
// overload.
public static void closeQuietly(final Socket... sockets) {
if (sockets == null)
return;
for (Socket socket : sockets) {
if (socket == null)
return;
try {
socket.close();
} catch (IOException ignored) {
}
}
}
/**
* Returns the text read from the given reader as a String. Closes the given
* reader upon return.
*/
public static String getText(Reader reader) throws IOException {
try {
StringBuilder source = new StringBuilder();
BufferedReader buffered = new BufferedReader(reader);
String line = buffered.readLine();
while (line != null) {
source.append(line);
source.append('\n');
line = buffered.readLine();
}
return source.toString();
} finally {
closeQuietly(reader);
}
}
/**
* Returns the text read from the given file as a String.
*/
public static String getText(File path) throws IOException {
return getText(new FileReader(path));
}
public static String getText(InputStream stream) throws IOException {
return getText(new InputStreamReader(stream,charset));
}
public static String getText(InputStream stream,Charset charset) throws IOException {
return getText(new InputStreamReader(stream,charset));
}
public static void createDirectory(File dir) throws IOException {
if (!dir.exists()) {
dir.mkdirs();
}
}
public static void copyStream(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8192];
try {
int read = in.read(buffer);
while (read > 0) {
out.write(buffer, 0, read);
read = in.read(buffer);
}
} finally {
closeQuietly(in, out);
}
}
public static void copyFile(File source, File target) throws FileNotFoundException, IOException {
if (!source.isFile())
throw new IOException(
String.format("Error copying file %s to %s; source file does not exist", source, target));
createDirectory(target.getParentFile());
doCopyFile(source, target);
checkSameSize(source, target);
}
public static List<File> listFilesRecursively(File baseDir) throws IOException {
if (!baseDir.exists())
return Collections.emptyList();
List<File> result = new ArrayList<File>();
doListFilesRecursively(baseDir, result);
return result;
}
public static String getFileExtension(String filename) {
int index = filename.lastIndexOf('.');
return index == -1 ? null : filename.substring(index + 1, filename.length());
}
public static void createFile(File file) throws IOException {
if(!file.exists()) {
if(file.isDirectory()) {
file.mkdirs();
}else {
file.getParentFile().mkdirs();
file.createNewFile();
}
}
}
private static void doListFilesRecursively(File baseDir, List<File> result) throws IOException {
List<File> dirs = new ArrayList<File>();
File[] files = baseDir.listFiles();
if (files == null) {
throw new IOException("Failed to list files of directory '" + baseDir + "'");
}
for (File file : files) {
if (file.isFile()) {
result.add(file);
} else {
dirs.add(file);
}
}
for (File dir : dirs) {
doListFilesRecursively(dir, result);
}
}
private static void doCopyFile(File source, File target) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(source);
out = new FileOutputStream(target);
// instead of checking transferred size, we'll compare file sizes in
// checkSameSize()
in.getChannel().transferTo(0, Long.MAX_VALUE, out.getChannel());
} finally {
closeQuietly(in, out);
}
}
private static void checkSameSize(File source, File target) throws IOException {
long fromSize = source.length();
long toSize = target.length();
if (fromSize != toSize)
throw new IOException(
String.format("Error copying file %s to %s; source file size is %d, but target file size is %d",
source, target, fromSize, toSize));
}
public static byte[] getBytes(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
copyStream(in, out);
return out.toByteArray();
}
public static byte[] getBytes(File in) throws IOException {
return getBytes(new FileInputStream(in));
}
public static void streamToFile(InputStream in, File file) throws IOException {
if (!file.exists()) {
//createDirectory(file.getParentFile());
file.createNewFile();// 将压缩文件内容写入到这个文件中
}
FileOutputStream fos = new FileOutputStream(file);
int count;
byte[] buf = new byte[8192];
while ((count = in.read(buf)) != -1) {
fos.write(buf, 0, count);
}
fos.flush();
closeQuietly(in, fos);
}
public static void byteToFile(byte[] bytes, File file) throws IOException {
if (!file.exists()) {
//createDirectory(file.getParentFile());
file.createNewFile();// 将压缩文件内容写入到这个文件中
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.flush();
closeQuietly(fos);
}
public static void writeFile(File file, OutputStream out, boolean close) throws IOException {
FileInputStream in = null;
try {
in = new FileInputStream(file);
int count;
byte[] buf = new byte[8192];
while ((count = in.read(buf)) != -1) {
out.write(buf, 0, count);
}
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
closeQuietly(in);
if (close) {
closeQuietly(out);
}
}
}
private static class FileSizeFinder extends RecursiveTask<Long> {
/**
*
*/
private static final long serialVersionUID = 1L;
final File file;
public FileSizeFinder(final File theFile) {
file = theFile;
}
@Override
public Long compute() {
long size = 0;
if (file.isFile()) {
size = file.length();
} else {
final File[] children = file.listFiles();
if (children != null) {
List<ForkJoinTask<Long>> tasks = new ArrayList<ForkJoinTask<Long>>();
for (final File child : children) {
if (child.isFile()) {
size += child.length();
} else {
tasks.add(new FileSizeFinder(child));
}
}
for (final ForkJoinTask<Long> task : invokeAll(tasks)) {
size += task.join();
}
}
}
return size;
}
}
public static long getFileSize(File file) {
return forkJoinPool.invoke(new FileSizeFinder(file));
}
public static String getProjectPath() {
String url=Thread.currentThread().getContextClassLoader().getResource("").getPath();
try {
url=url.substring(1, url.length()-15);
if(url.contains("/targe")) {
url = url.replace("/targe","");
}
return URLDecoder.decode(url,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return url;
}
public static void delFile(File file) {
if(file.isDirectory()) {
File[] childs = file.listFiles();
if(childs!=null) {
for (int i = 0; i < childs.length; i++) {
if(childs[i].isDirectory()) {
delFile(childs[i]);
}else {
childs[i].delete();
}
}
}
}
file.delete();
}
public static List<File> findFile(File file,FilenameFilter filter) {
List<File> res = new ArrayList<File>();
findChilds(res, file, filter);
return res;
}
private static void findChilds(List<File> res,File file,FilenameFilter filter) {
if(file.isDirectory()) {
File[] delFiles=file.listFiles(filter);
for (int i = 0; i < delFiles.length; i++) {
res.add(delFiles[i]);
}
File[] childs= file.listFiles();
for (int i = 0; i < childs.length; i++) {
findChilds(res,childs[i],filter);
}
}
}
}