在 jdk 6 与 jdk 8 中创建临时目录
Creating a temporary directory in jdk 6 vs jdk 8
我在开发域中遇到了一个奇怪的问题。所以基本上我们的 java 应用目前在 jdk1.6 上运行,我们计划将其升级到 1.8。所以目前以下代码在 1.6 中工作正常但 returns 一个例外
java.io.IOException: Unable to create temporary file, C:\Users\xxxxx\xxxxx\Local\Temp\XYZDirectory
at java.io.File$TempDirectory.generateFile(File.java:1921)
at java.io.File.createTempFile(File.java:2010)
at java.io.File.createTempFile(File.java:2070)
在 1.8 中。
代码如下-
File file = null;
try {
file =
File.createTempFile("XYZ", "Directory" + System.getProperty("file.separator"));
file.delete();
file.mkdirs();
} catch (final IOException e) {
e.printStackTrace();
}
return file;
我们希望我们的产品与 1.6 和 1.8 兼容。
经过一番研究,我发现我可能必须使用以下方法 Files
class
public static Path createTempDirectory(Path dir,
String prefix,
FileAttribute<?>... attrs)
throws IOException
所以我有以下疑问 -
1) 为什么 File.createTempFile
在 1.8 中抛出异常?
2) 这两种方法在概念上有什么区别?
3) 如果不再支持 File.createTempFile
,为什么不弃用它呢?
4) 解决这个问题的合适方法是什么?换句话说,我可以根据安装在 VM 中的 jdk 版本进行编程检查以使用适当的方法,然后继续创建临时目录,但这是解决此问题的最佳方法吗?
这对两者都有效:
File file = null;
try {
file = File.createTempFile("XYZ", "Directory");
file.delete();
file.mkdirs();
System.out.println(file);
} catch (final IOException e) {
e.printStackTrace();
}
return file;
我不确定为什么连接文件分隔符失败,但这是异常的原因。我的猜测是分隔符是由文件 class 以编程方式插入的,而您手动添加分隔符会导致失败。
话虽如此,这里推荐Java7引入的NIO版本:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class TempStackTest {
public Path getTempFilePath() {
Path path = null;
try {
path = Files.createTempFile("XYZ", "Directory");
path.toFile().delete();
} catch (final IOException e) {
e.printStackTrace();
}
return path;
}
}
我在开发域中遇到了一个奇怪的问题。所以基本上我们的 java 应用目前在 jdk1.6 上运行,我们计划将其升级到 1.8。所以目前以下代码在 1.6 中工作正常但 returns 一个例外
java.io.IOException: Unable to create temporary file, C:\Users\xxxxx\xxxxx\Local\Temp\XYZDirectory
at java.io.File$TempDirectory.generateFile(File.java:1921)
at java.io.File.createTempFile(File.java:2010)
at java.io.File.createTempFile(File.java:2070)
在 1.8 中。 代码如下-
File file = null;
try {
file =
File.createTempFile("XYZ", "Directory" + System.getProperty("file.separator"));
file.delete();
file.mkdirs();
} catch (final IOException e) {
e.printStackTrace();
}
return file;
我们希望我们的产品与 1.6 和 1.8 兼容。
经过一番研究,我发现我可能必须使用以下方法 Files
class
public static Path createTempDirectory(Path dir,
String prefix,
FileAttribute<?>... attrs)
throws IOException
所以我有以下疑问 -
1) 为什么 File.createTempFile
在 1.8 中抛出异常?
2) 这两种方法在概念上有什么区别?
3) 如果不再支持 File.createTempFile
,为什么不弃用它呢?
4) 解决这个问题的合适方法是什么?换句话说,我可以根据安装在 VM 中的 jdk 版本进行编程检查以使用适当的方法,然后继续创建临时目录,但这是解决此问题的最佳方法吗?
这对两者都有效:
File file = null;
try {
file = File.createTempFile("XYZ", "Directory");
file.delete();
file.mkdirs();
System.out.println(file);
} catch (final IOException e) {
e.printStackTrace();
}
return file;
我不确定为什么连接文件分隔符失败,但这是异常的原因。我的猜测是分隔符是由文件 class 以编程方式插入的,而您手动添加分隔符会导致失败。
话虽如此,这里推荐Java7引入的NIO版本:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class TempStackTest {
public Path getTempFilePath() {
Path path = null;
try {
path = Files.createTempFile("XYZ", "Directory");
path.toFile().delete();
} catch (final IOException e) {
e.printStackTrace();
}
return path;
}
}