com.ibm.wala.util.io.FileUtil Maven / Gradle / Ivy
Show all versions of com.ibm.wala.util Show documentation
/*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*/
package com.ibm.wala.util.io;
import com.ibm.wala.util.collections.HashSetFactory;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.jspecify.annotations.Nullable;
/** Simple utilities for accessing files. */
public class FileUtil {
/**
* List all the files in a directory that match a regular expression
*
* @param recurse recurse to subdirectories?
* @throws IllegalArgumentException if dir is null
*/
public static Collection listFiles(String dir, String regex, boolean recurse) {
if (dir == null) {
throw new IllegalArgumentException("dir is null");
}
File d = new File(dir);
Pattern p = null;
if (regex != null) {
p = Pattern.compile(regex);
}
return listFiles(d, recurse, p);
}
private static Collection listFiles(File directory, boolean recurse, @Nullable Pattern p) {
File[] files = directory.listFiles();
if (files == null) {
return Collections.emptyList();
}
HashSet result = HashSetFactory.make();
for (File file : files) {
if (p == null || p.matcher(file.getAbsolutePath()).matches()) {
result.add(file);
}
if (recurse && file.isDirectory()) {
result.addAll(listFiles(file, recurse, p));
}
}
return result;
}
/**
* This may be a resource leak.
*
* We may have to reconsider using nio for this, or apply one of the horrible workarounds
* listed in the bug report above.
*/
public static void copy(String srcFileName, String destFileName) throws IOException {
if (srcFileName == null) {
throw new IllegalArgumentException("srcFileName is null");
}
if (destFileName == null) {
throw new IllegalArgumentException("destFileName is null");
}
try (final FileInputStream srcStream = new FileInputStream(srcFileName);
final FileOutputStream dstStream = new FileOutputStream(destFileName);
final FileChannel src = srcStream.getChannel();
final FileChannel dest = dstStream.getChannel(); ) {
long n = src.size();
MappedByteBuffer buf = src.map(FileChannel.MapMode.READ_ONLY, 0, n);
dest.write(buf);
}
}
/**
* delete all files (recursively) in a directory. This is dangerous. Use with care.
*
* @throws IOException if there's a problem deleting some file
*/
public static void deleteContents(String directory) throws IOException {
File f = new File(directory);
if (!f.exists()) {
return;
}
if (!f.isDirectory()) {
throw new IOException(directory + " is not a vaid directory");
}
for (String s : f.list()) {
deleteRecursively(new File(f, s));
}
}
private static void deleteRecursively(File f) throws IOException {
if (f.isDirectory()) {
for (String s : f.list()) {
deleteRecursively(new File(f, s));
}
}
boolean b = f.delete();
if (!b) {
throw new IOException("failed to delete " + f);
}
}
/**
* Create a {@link FileOutputStream} corresponding to a particular file name. Delete the existing
* file if one exists.
*/
public static final FileOutputStream createFile(String fileName) throws IOException {
if (fileName == null) {
throw new IllegalArgumentException("null file");
}
File f = new File(fileName);
if (f.getParentFile() != null && !f.getParentFile().exists()) {
boolean result = f.getParentFile().mkdirs();
if (!result) {
throw new IOException("failed to create " + f.getParentFile());
}
}
if (f.exists()) {
f.delete();
}
boolean result = f.createNewFile();
if (!result) {
throw new IOException("failed to create " + f);
}
return new FileOutputStream(f);
}
/** read fully the contents of s and return a byte array holding the result */
public static byte[] readBytes(InputStream s) throws IOException {
if (s == null) {
throw new IllegalArgumentException("null s");
}
try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
byte[] b = new byte[1024];
int n = s.read(b);
while (n != -1) {
out.write(b, 0, n);
n = s.read(b);
}
byte[] bb = out.toByteArray();
return bb;
}
}
/** write string s into file f */
public static void writeFile(File f, String content) throws IOException {
try (final Writer fw = Files.newBufferedWriter(f.toPath(), StandardCharsets.UTF_8)) {
fw.append(content);
}
}
public static void recurseFiles(Consumer action, final Predicate filter, File top) {
if (top.isDirectory()) {
for (File f : top.listFiles(file -> filter.test(file) || file.isDirectory())) {
recurseFiles(action, filter, f);
}
} else {
action.accept(top);
}
}
}