上传一组 .png 文件并保存到 HashMap 中

Upload a set of .png files and save into a HashMap

我需要上传一个包含 x 个 .png 文件的文件夹并将它们保存到哈希图中。 我怎样才能做到这一点。 我的想法是

    HashMap<Integer,Image> map = new HashMap<>();
    for (int i= map.size();map>0;map-- ){
        map.put(i, new Image(new FileInputStream("C:\Users\drg\Documents\image"+i+".png")));
    }

问题是,一开始我的 HashMap 包含 0 个项目,因此它将始终保持为 0。那么如果我不知道我的文件夹中有多少 .png 文件,我该如何将 .png 文件添加到我的 HashMap .

另一个问题是我正在使用 FileInputStream 并且需要知道 .png 文件的确切“名称”。 如何找出有多少 .png 文件并将它们上传到我的 HashMap 而无需知道它们的确切文件名?

您需要做的就是列出文件夹的内容并找到匹配的文件名。例如。使用 java.nio API 并将图像放入列表中:

Path folder = FileSystems.getDefault().getPath("Users", "drg", "Documents");
List<Image> images = Files.list(folder)
    .filter(path -> path.getFileName().toString().matches("image\d+\.png"))
    .map(Path::toUri)
    .map(URI::toString)
    .map(Image::new)
    .collect(Collectors.toList());

或使用旧的 java.io API:

File folder = new File("C:/Users/drg/Documents");
File[] imageFiles = folder.listFiles(file -> file.getName().matches("image\d+\.png"));
List<Image> images = new ArrayList<>();
for (File file : imageFiles) {
    images.add(new Image(file.toURI().toString()));
}

如果您需要按整数索引它们,当您有文件名时提取整数值相当容易。

如果有帮助,您可以帮助使用 FileChooser 手动选择文件(例如使用 GUI),然后您可以将它们加载到列表中,然后从列表到地图可能更容易?

```
private void uploadPhoto() {
    FileChooser fileChooser = new FileChooser();
    //Sets file extension type filters (Pictures)
    fileChooser.getExtensionFilters().addAll
            (new FileChooser.ExtensionFilter("Picture Files", "*.jpg", "*.png"));
    
    //Setting initial directory (finds current system user)
    File initialDirectory;
    String user = System.getProperty("user.name"); //platform independent
    List<File> selectedFiles;
    try {
        initialDirectory = new File("C:\Users\" + user + "\Pictures" );
        fileChooser.setInitialDirectory(initialDirectory);  
        selectedFiles = fileChooser.showOpenMultipleDialog(Main.stage);
    } catch(Exception e) {
        initialDirectory = new File("C:\Users\" + user);
        fileChooser.setInitialDirectory(initialDirectory);
        selectedFiles = fileChooser.showOpenMultipleDialog(Main.stage);
    }
```