文件的位置:(该地址其实并未存在文件,fileName为xxxx.zip)
String filePath = "temporaryDir/file/"+fileName;
File file = new File(filePath);
为了能够直接创建文件,而不需要收到前面父级目录影响,我先执行了创建父级目录的代码。
public void mkTemporaryDirs(){
File file = new File("temporaryDir/file");
if(!file .exists()){
file .mkdirs();
LOGGER.info("file 目录创建成功!");
}
}
IO流输出到改文件:(注意,此时本地真实的磁盘里有了temporaryDir/file父级目录,但并未有XXX.zip文件)
public static void inputStreamToFile(MultipartFile multipartfile, File file) {
try {
ins = multipartfile.getInputStream();
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
重点是,执行了上面inputStreamToFile代码后,文件随着输出流OutputStream,会有XXX.zip文件产生,也就是说本地目录有真实的xxx.zip文件。
但是,把项目部署到linux服务器上后发现,没有xxx.zip文件产生,一开始以为是权限的问题,当我把用户改为root后也创建失败了。
最后经过测试,确定了linux上,java代码创建文件必须以以下的形式:(其实以前的jdk好像也不支持输出流直接输出后生成文件,会报异常,我用的jdk是1.8版本,开发工具是idea,可能有一定的关系,反正以后io流使用中,一定要先创建文件,和其完整的父级目录)
String filePath = "temporaryDir/file/"+fileName;
File file = new File(filePath);
if (!file .getParentFile().exists()) {
file .getParentFile().mkdirs()
}
if(!file .exists()) {
file .createNewFile();
}