Mantas
Mantas

Reputation: 85

How to convert this method from using java.io.File to java.nio.file?

Basically I have this method that I got off a tutorial (My main goal is to simply return the images from the spring boot server so that I could dynamically view them in Angular)

@RestController
public class FileController {

    @Autowired
    ServletContext context;
    
    @GetMapping(path = "/allImages")
    public ResponseEntity<List<String>> getImages(){
        List<String> images = new ArrayList<String>();
        String filesPath = context.getRealPath("/images");
        File fileFolder = new File(filesPath);
        if(fileFolder!=null) {
            for(final File file : fileFolder.listFiles()) {
                if(!file.isDirectory()) {
                    String encodeBase64 = null;
                    try {
                        String extention = FilenameUtils.getExtension(file.getName());
                        FileInputStream fileInputStream = new FileInputStream(file);
                        byte[] bytes = new byte[(int)file.length()];
                        encodeBase64 = Base64.getEncoder().encodeToString(bytes);
                        images.add("data:image/"+extention+";base64,"+encodeBase64);
                        fileInputStream.close();
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }
            }
        }
        return new ResponseEntity<List<String>>(HttpStatus.OK);
    }

With the current code, when I try to return the files, I get:

java.lang.NullPointerException: Cannot read the array length because the return value of "java.io.File.listFiles()" is null

I've been searching around and noticed that people recommend using java.nio.file instead but I'm a little lost on how would I implement this here. Any help is appreciated.

Upvotes: 0

Views: 983

Answers (3)

Mantas
Mantas

Reputation: 85

I solved this issue with this code:

@Autowired
    ServletContext context;
    
    @GetMapping(path = "/allImages")
    public List<String> readImages() throws IOException {
        return Files.list(Paths.get(context.getRealPath("/images")))
                .filter(Files::isRegularFile)
                .map(this::encode)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
      }
    
    private String encode(Path file) {
        try {
          String extension = FilenameUtils.getExtension(file.getFileName().toString());
          String encodeBase64 = Base64.getEncoder().encodeToString(Files.readAllBytes(file));
          return "data:image/"+extension+";base64,"+encodeBase64;
        } catch (Exception e) {
          return null;
        }
      }

Thank you to everyone who helped.

Upvotes: 0

marstran
marstran

Reputation: 28056

First get a Path to your folder:

Path folderPath = Paths.get(filesPath);

If your Path points to a directory, you can get a Stream<Path> of its contents using Files.list:

if (Files.isDirectory(folderPath)) {
    List<Path> files = Files.list(folderPath)
         .filter(path -> !Files.isDirectory(path))
         .collect(Collectors.toList());

    // Do something with the files.
}

It doesn't look like you are using the FileInputStream for anything, so you shouldn't need to translate that part. To get the file extension of your path, you probably need to convert the Path to a string, and extract the extension yourself.

Upvotes: 1

Akif Hadziabdic
Akif Hadziabdic

Reputation: 2890

Example with nio:

  public List<String> readImages() throws IOException {
    return Files.list(Path.of("/images"))
            .filter(Files::isRegularFile)
            .map(this::encode)
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
  }

  private String encode(Path file) {
    try {
      String extension = FilenameUtils.getExtension(file.getFileName().toString());
      String encodeBase64 = Base64.getEncoder().encodeToString(Files.readAllBytes(file));
      return "data:image/"+extension+";base64,"+encodeBase64;
    } catch (Exception e) {
      return null;
    }
  }

Upvotes: 1

Related Questions