Java调用Oss JDk实现删除指定目录下的所有文件
作者:APP 肖提莫
这篇文章主要为大家详细介绍了Java如何调用Oss JDk实现删除指定目录下的所有文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
1、引入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.16.1</version>
</dependency>
2、方法
/**
* 删除指定前缀或目录下的多个文件
*
* @param prefix 删除目录
*/
public void deletePathFileList(String prefix) {
OSS ossClient = null;
try {
//封装创建Oss实例
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(access_key, secret_key);
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();
// 列举所有包含指定前缀的文件并删除。
String nextMarker = null;
ObjectListing objectListing;
do {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucket).withPrefix(prefix).withMarker(nextMarker);
objectListing = ossClient.listObjects(listObjectsRequest);
if (!objectListing.getObjectSummaries().isEmpty()) {
List<String> keys = new ArrayList<>();
for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
keys.add(s.getKey());
}
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucket).withKeys(keys).withEncodingType("url");
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(deleteObjectsRequest);
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
for (String obj : deletedObjects) {
String deleteObj = URLDecoder.decode(obj, "UTF-8");
System.out.println(deleteObj);
}
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
} catch (Exception e) {
log.error("阿里云删除指定前缀或目录下的多个文件异常:{}", e.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}3、方法补充
下面小编为大家整理了Java删除文件的所有方法,有需要的可以参考下
1.使用FileUtils类
来自 Apache Commons IO的FileUtils类提供了几个方便的文件操作实用程序。您可以使用该FileUtils.cleanDirectory()方法递归删除目录中的所有文件和子目录,而不删除目录本身。
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File directory = new File("/path/to/dir");
FileUtils.cleanDirectory(directory);
}
}
要递归删除目录及其中的所有内容,您可以使用该FileUtils.deleteDirectory()方法。
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File directory = new File("/path/to/dir");
FileUtils.deleteDirectory(directory);
}
}
或者,您可以使用该FileUtils.forceDelete()方法删除一个目录和所有子目录。
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File directory = new File("/path/to/dir");
FileUtils.forceDelete(directory);
}
}
2.使用File.delete()方法
该File.delete()方法删除由指定路径名表示的文件或目录。有许多方法可以有条件地删除使用它的目录中的文件和子目录。
例如,以下解决方案仅删除主目录中的文件,所有子目录保持不变。
import java.io.File;
import java.util.Objects;
public class Main {
public static void main(String[] args) {
File directory = new File("/path/to/dir");
for (File file: Objects.requireNonNull(directory.listFiles())) {
if (!file.isDirectory()) {
file.delete();
}
}
}
}
如果您使用 Java 8 或更高版本,则可以使用:
import java.io.File;
import java.util.Arrays;
import java.util.Objects;
import java.util.function.Predicate;
public class Main {
public static void deleteDirectory(File directory) {
Arrays.stream(Objects.requireNonNull(directory.listFiles()))
.filter(Predicate.not(File::isDirectory))
.forEach(File::delete);
}
public static void main(String[] args) {
File directory = new File("/path/to/dir");
deleteDirectory(directory);
}
}
您可以轻松扩展解决方案以递归删除目录中的所有文件和子目录。请注意,File.delete()当且仅当目录为空时,您可以使用该方法删除目录。
import java.io.File;
import java.util.Objects;
public class Main {
public static void deleteDirectory(File directory) {
for (File file: Objects.requireNonNull(directory.listFiles())) {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
file.delete();
}
}
}
public static void main(String[] args) {
File directory = new File("/path/to/dir");
deleteDirectory(directory);
}
}
这是使用 Stream API 的版本。它利用该Files.walk()方法并删除目录中的所有文件和子目录以及目录本身。
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
public class Main {
public static void deleteDirectory(Path directory) throws IOException {
Files.walk(directory)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
}
public static void main(String[] args) throws IOException {
Path directory = Path.of("/path/to/dir");
deleteDirectory(directory);
}
}
如果您需要从目录及其所有子目录中删除“仅文件”,您可以执行以下操作:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void deleteDirectory(File directory) throws IOException {
Files.walk(directory.toPath())
.filter(Files::isRegularFile)
.map(Path::toFile)
.forEach(File::delete);
}
public static void main(String[] args) throws IOException {
File directory = new File("/path/to/dir");
deleteDirectory(directory);
}
}
到此这篇关于Java调用Oss JDk实现删除指定目录下的所有文件的文章就介绍到这了,更多相关Java删除指定目录下文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
