在Java中创建新线程时出现FileNotFoundException

时间:2018-12-06 04:47:52

标签: java filenotfoundexception

我已经有一个能读取excel文件的代码。首先,控制器案例中的API将文件接收为MultipartFile类型。然后,由于某些原因,我需要将MultipartFile转换为File类型。这是代码:

private static File convert(MultipartFile file) throws IOException {
    try {
        File convertedFile = new File(file.getOriginalFilename());
        convertedFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(convertedFile);
        fos.write(file.getBytes());
        fos.close();
        return convertedFile;
    } catch (IOException e) {
        e.printStackTrace();
        throw new IOException("Error in converting the file with error message: " + e.getMessage());
    }
}

这是在控制器中调用的服务类,它调用了上面的convert方法:

public void create(MultipartFile file) throws Exception {
    try {
        File newFile = convert(file);
        // rest of code
    } catch (Exception e) {
        // rest of code
    }
}

在尝试在新线程中调用服务之前,上面的代码可以正常工作。但是,当我尝试在新线程中调用该服务时,如下面的代码所示,它显示为java.io.FileNotFoundException(系统找不到指定的文件),主要问题在此行fos.write(file.getBytes());中。这是我在控制器中创建新线程的方法:

@RequestMapping(method = RequestMethod.POST, value = "uploadfile")
public ResponseEntity<?> create(@RequestParam (value = "file", required = false) MultipartFile file) throws Exception {
    try {

        // ...other process

        // ================================== code below not work
        Thread create;

        create = new Thread() {
            public void run() {
                try {
                    service.create(file);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        create.start();

        // ================================== code below not work
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    service.create(file);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

        // ================================== code below not work
        new Thread(() -> {
            try {
                service.create(file);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }){{start();}};

        // ...rest of code
    } catch (Exception e) {
        // ...rest of code
    }
}
上面的

是我尝试制作线程的几种方法,但是它们都不起作用,执行相同的结果。

目标:总而言之,我想让文件在后台读取,并在调用服务后立即将响应发送给客户端。

1 个答案:

答案 0 :(得分:0)

Spring通过返回一个Callable对象来支持异步方式。伪代码就像:

@RequestMapping(method = RequestMethod.POST, value = "uploadfile")
public Callable<ResponseEntity<?>> create(@RequestParam (value = "file", required = false) MultipartFile file) throws Exception {
    return () -> {
     try {
            service.create(file);
            return ResponseEntity.ok()
        } catch (Exception e) {
            return ResponseEntity.error( /*some error*/
            e.printStackTrace();
        }
    };
}

这里是教程参考:https://niels.nu/blog/2016/spring-async-rest.html

另一个参考:How to make a async rest with Spring?