实现思路是获取到jar包平级的绝对路径,在这个目录上进行操作。
实现也非常简单:
File directory = new File("");
String basePath = directory.getCanonicalPath();
package com.wdf.test.javabasic.io.spring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.*;
/**
* 测试插入文件到目录中
* 非写死目录
*/
@RestController
public class InsertResourceFileTest {
/**
* 用于测试springboot项目的例子
* 调用接口即可
* @return
* @throws IOException
*/
@GetMapping("insert/resource/file")
public String test1() throws IOException {
// 获取基本路径 【最核心的一句代码...】
File directory = new File("");
String basePath = directory.getCanonicalPath();
// 新建一个a.txt文件,并写点东西进去
basePath = basePath + "/a.txt";
// 创建文件
File file = new File(basePath);
file.createNewFile();
// 利用流写入文件,跟本次主题关系不大
OutputStream outputStream = new FileOutputStream(basePath);
outputStream.write("123".getBytes());
outputStream.flush();
outputStream.close();
// 实现伟大的业务操作...
/**
* 。。。。
*/
// 保护资源,记得删除文件呀
// file.delete();
return "finish";
}
/**
* 仅作理解的方法,没有什么含义
* @return
* @throws IOException
*/
public static String getBasePathForNote() throws IOException {
/**
* 最重要的就是这个地方,通过这种方式获取的路径是一个绝对路径,
* 而且这个路径是和jar平级的目录下。
* 例如我们把jar放在了【E:/test/a.jar】
* 那么我们获取的目录就是【E:/test/】,就可以在这个目录下面新建文件,为所欲为了。
* 如果是暂存的文件还是建议马上删除,或者过后采取一个机制进行删除,保护空间
*/
File directory = new File("");
String path = directory.getCanonicalPath();
System.out.println("getCanonicalPath : " + directory.getCanonicalPath());
System.out.println("path : " + directory.getPath());
System.out.println("getAbsolutePath : " + directory.getAbsolutePath());
/**
* getCanonicalPath : D:\project\wdf\web\SpringBoot-WDF
* path :
* getAbsolutePath : D:\project\wdf\web\SpringBoot-WDF
*/
return path;
}
}
最近拿到一个需求,需要把一个excel模板的内容获取到,处理完成后,生成一个新的文件。再把这个新的文件转成pdf文件。
在这个过程中,有些点也花了一些时间,但是之前一直没出的问题的路径,部署到服务器后开始出问题了。
可以获取到模板文件,但是新生成的excel文件打不开,路径出现了问题。路劲中一直有感叹号。我本来的思路想再Reource目录下面建一个缓存文件的目录,用于临时文件的读写。但是路径一直有问题。
/xxx.jar!/BOOT-INF/classes!/
问题报错的内容就像这样了。这是其中路径提示有问题的那一部分内容。
最后在网上找了挺多博客,写的都是这种套路,获取资源是ok的,但是往里写入就有问题。后来也是偷师了前公司的项目里的暂存用的,我看了一下直接想扇自己耳光,感觉太简单了,但是自己又想不到,就用了一个空的 new File("");