如何批量获取目录下的文件列表?
How to get list of file in directory in batches?
我有一个存储 3000 个文件的位置。但是我想一次获取 1000 个文件的列表,然后在下一次调用另外 1000 个文件等等。
请找到我的以下代码:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class FileSystem {
public static void main(String args[]) throws Exception {
FileSystem.createListFile();
FileSystem.getFileInBatch();
}
private static void getFileInBatch() {
int MAX_INDEX = 1000;
List<String> result = new ArrayList<>();
try (Stream<Path> walk = Files.walk(Paths.get("C://FileTest"))) {
List<String> batchResult = walk.filter(p -> Files.isRegularFile(p) && p.getFileName().toString().endsWith(".txt"))
.sorted(Comparator.comparingInt(FileSystem::pathToInt))
.map(x -> x.toString()).limit(MAX_INDEX).collect(Collectors.toList());
batchResult.forEach(System.out::println);
System.out.println(batchResult.size());
result.addAll(batchResult);
} catch (IOException e) {
e.printStackTrace();
}
}
private static int pathToInt(final Path path) {
return Integer.parseInt(path.getFileName()
.toString()
.replaceAll("Aamir(\d+).txt", "")
);
}
private static void createListFile() throws IOException {
for (int i = 0; i < 3000; i++) {
File file = new File("C://FileTest/Aamir" + i + ".txt");
if (file.createNewFile()) {
System.out.println(file.getName() + " is created!");
}
}
}
}
我能够使用流中的限制获取前 1000 个(Aamir0.txt 到 Aamir999.txt)个文件。
现在如何批量获取接下来的 1000 个文件(Aamir1000.txt 到 Aamir1999.txt),然后再获取接下来的 1000 个文件。我期待一些循环,他们将连续批量提供 1000 个有序文件。
您正在使用流,它们有很好的 API 来满足您的需求。
您正在使用
限制读取数据
.limit(MAX_INDEX)
要获得其他结果,一种方法是结合使用跳过和限制方法:
.skip(MAX_INDEX).limit(MAX_INDEX)
这样您就可以根据您的 MAX_INDEX 值访问后 1000 个字符。
我不确定你想对每个文件做什么,但这个逻辑应该适合你:
private static final int MAX_VALUE = 5;
public static void main(String[] args) {
try (Stream<Path> walk = Files.walk(Paths.get("path/to/your/directory"))) {
List<String> list = new ArrayList<>(MAX_VALUE);
walk.filter(path -> path.getFileName().toString().endsWith("txt"))
.sorted((a, b) -> compare(a, b)
.forEach(path -> handlePath(path, list));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void handlePath(Path path, List<String> list) {
list.add(path.toString());
if (list.size() >= MAX_VALUE) {
// Do something
list.clear();
}
}
public static int compare(Path a, Path b) {
String aStr = a.getFileName().toString(), bStr = b.getFileName().toString();
int valA = Integer.parseInt(aStr.replaceAll("[^0-9.]|\.", ""));
int valB = Integer.parseInt(bStr.replaceAll("[^0-9.]|\.", ""));
return valA - valB;
}
我有一个存储 3000 个文件的位置。但是我想一次获取 1000 个文件的列表,然后在下一次调用另外 1000 个文件等等。
请找到我的以下代码:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class FileSystem {
public static void main(String args[]) throws Exception {
FileSystem.createListFile();
FileSystem.getFileInBatch();
}
private static void getFileInBatch() {
int MAX_INDEX = 1000;
List<String> result = new ArrayList<>();
try (Stream<Path> walk = Files.walk(Paths.get("C://FileTest"))) {
List<String> batchResult = walk.filter(p -> Files.isRegularFile(p) && p.getFileName().toString().endsWith(".txt"))
.sorted(Comparator.comparingInt(FileSystem::pathToInt))
.map(x -> x.toString()).limit(MAX_INDEX).collect(Collectors.toList());
batchResult.forEach(System.out::println);
System.out.println(batchResult.size());
result.addAll(batchResult);
} catch (IOException e) {
e.printStackTrace();
}
}
private static int pathToInt(final Path path) {
return Integer.parseInt(path.getFileName()
.toString()
.replaceAll("Aamir(\d+).txt", "")
);
}
private static void createListFile() throws IOException {
for (int i = 0; i < 3000; i++) {
File file = new File("C://FileTest/Aamir" + i + ".txt");
if (file.createNewFile()) {
System.out.println(file.getName() + " is created!");
}
}
}
}
我能够使用流中的限制获取前 1000 个(Aamir0.txt 到 Aamir999.txt)个文件。
现在如何批量获取接下来的 1000 个文件(Aamir1000.txt 到 Aamir1999.txt),然后再获取接下来的 1000 个文件。我期待一些循环,他们将连续批量提供 1000 个有序文件。
您正在使用流,它们有很好的 API 来满足您的需求。
您正在使用
限制读取数据.limit(MAX_INDEX)
要获得其他结果,一种方法是结合使用跳过和限制方法:
.skip(MAX_INDEX).limit(MAX_INDEX)
这样您就可以根据您的 MAX_INDEX 值访问后 1000 个字符。
我不确定你想对每个文件做什么,但这个逻辑应该适合你:
private static final int MAX_VALUE = 5;
public static void main(String[] args) {
try (Stream<Path> walk = Files.walk(Paths.get("path/to/your/directory"))) {
List<String> list = new ArrayList<>(MAX_VALUE);
walk.filter(path -> path.getFileName().toString().endsWith("txt"))
.sorted((a, b) -> compare(a, b)
.forEach(path -> handlePath(path, list));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void handlePath(Path path, List<String> list) {
list.add(path.toString());
if (list.size() >= MAX_VALUE) {
// Do something
list.clear();
}
}
public static int compare(Path a, Path b) {
String aStr = a.getFileName().toString(), bStr = b.getFileName().toString();
int valA = Integer.parseInt(aStr.replaceAll("[^0-9.]|\.", ""));
int valB = Integer.parseInt(bStr.replaceAll("[^0-9.]|\.", ""));
return valA - valB;
}