我正在开发一个网络应用程序(用于手机)。有一个 xhtml 页面,我想在其中显示一张图片,该图片本地存储在我的硬盘上(例如:D:\pictures\test.jpg)。由于浏览器在位于本地硬盘驱动器上时会阻止图像,所以我在我的 javabean 中编写了一个方法,当用户进入 xhtml 页面时,将存储在 localHD 上的图片复制到 webApp 目录。用户离开页面后,应删除 webapp 内的复制文件。因此,当我运行我的应用程序时,复制工作完美,图片显示正确。但是,当文件应该被删除时,我收到以下错误消息:
java.nio.file.FileSystemException: D:\WebAppPath\src\main\webapp\resources\pics\test.jpg:无法访问该进程,因为该文件正在被另一个进程使用。
奇怪的是,在停止并重新启动应用程序后,如果它仍在 webApp 目录中,我可以删除相同的图像。(但只有一次;重新复制后,我再次收到错误消息。)
此外,如果我想手动删除文件,通过使用 Windows 资源管理器,我会收到错误消息,指出文件无法删除,因为它由 Java(TM) Platform SE Binary 使用。
因此,要删除文件(手动或通过 bean),我必须等待应用程序重新启动,这当然不是最终用户可接受的解决方案。
我将 JSF2.0 与 Primefaces 和 Primefaces Mobile 组件一起使用。我的 IDE 是 Netbeans,我使用 Spring Webflow 框架在 xhtml 页面之间导航和触发操作/方法。
这是我的 JavaBean 中复制方法的代码:
public void copyFotoToLocalhost() {
if (fotoList.size() > 0) {
for (int i = 0; i < fotoList.size(); i++) {
Foto tempPic = fotoList.get(i);
String tempItemName = tempPic.getItemName();
String originalFile = "D:\\localFilepath\\" + tempItemName;
String tempFileName = "D:\\WebAppPath\\src\\main\\webapp\\resources\\pics\\" + tempItemName;
File existTest = new File(tempFileName);
if (existTest.exists() == false) {
try {
File orFile = new File(originalFile);
File tempFile = new File(tempFileName);
InputStream in = new FileInputStream(orFile);
OutputStream out = new FileOutputStream(tempFile);
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
tempFile.setWritable(true);
System.out.println("File copied.");
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage() + " in the specified directory.");
System.exit(0);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
这是删除方法的代码:
public void deleteFotos() {
if (fotoList.size() > 0) {
for (int i = 0; i < fotoList.size(); i++) {
Foto tempPic = fotoList.get(i);
String tempItemName = tempPic.getItemName();
Path tempLocation = Paths.get("D:\\webAppPath\\src\\main\\webapp\\resources\\pics\\" + tempItemName);
fotoList.remove(i);
i--;
try {
Files.deleteIfExists(tempLocation);
System.out.println("sucessfully deleted" + tempPic.getItemName());
} catch (IOException ex) {
Logger.getLogger(WundDokuBean.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Fail @ " + tempPic.getItemName());
}
}
fotoList.clear();
}
你有什么想法,如何解决这个问题?
我希望你能理解我的问题,如果没有,请告诉我你需要哪些信息,我会尽力提供。