2012-04-13 58 views
0

我的程序有一个从资源读取/写入文件的功能。这个功能我已经测试过了。例如,我写了一些文件,重新启动并重新加载,我可以再次读取这些数据。Java:部署后在资源中保存文件时出错

但是当我导出到jar文件后,我写文件时遇到了问题。这里是我的代码写入文件:

URL resourceUrl = getClass().getResource("/resource/data.sav"); 
File file = new File(resourceUrl.toURI()); 
FileOutputStream output = new FileOutputStream(file); 
ObjectOutputStream writer = new ObjectOutputStream(output); 

当这个代码运行,我在命令提示符通知错误: my error 所以,我的数据无法保存。 (我知道它,因为我重新启动应用程序后,没有什么改变!!!)

请帮我解决这个问题。

谢谢:)

+0

难道你不能复制该堆栈跟踪并粘贴为文本吗? – adarshr 2012-04-13 12:01:52

+0

我认为主要的问题是,在开发过程中,您正在写入一个真实的文件,而在“生产”过程中,所有内容都被打乱了,而您的资源是一个无法写入的jar文件。 – 2012-04-13 12:02:25

回答

2

你根本无法以这种方式将文件写入jar文件。您从getResource()获得的URI不是file:/// URI,它不能传递给java.io.File's构造函数。编写zip文件的唯一方法是使用java.util.zip中为此目的设计的类,这些类旨在让您编写整个jar文件,而不是将数据流式传输到一个文件中。在真实的安装中,无论如何,用户可能甚至没有权限写入jar文件。

您将需要通过使用首选项API将数据保存到文件系统上的实际文件中,或者如果足够小,可能会将其保存到文件系统中。

+0

你能告诉我更多关于java.util.zip的信息吗?你的意思是我解压缩文件并再次写入并解压缩? – hqt 2012-04-13 12:27:11

+0

嗯,我的意思是你放弃了更新jar文件的想法。正如我所说的,你的程序甚至可能没有适当的权限来执行此操作。其他地方保存你的数据! – 2012-04-13 12:35:42

-2

您需要读取/写入文件作为输入流以从jar文件读取。

public static String getValue(String key) 
    { 
     String _value = null; 
     try 
     { 
      InputStream loadedFile = ConfigReader.class.getClassLoader().getResourceAsStream(configFileName); 
      if(loadedFile == null) throw new Exception("Error: Could not load the file as a stream!"); 
      props.load(loadedFile); 
     } 
     catch(Exception ex){ 
      try { 
       System.out.println(ex.getMessage()); 
       props.load(new FileInputStream(configFileName)); 
      } catch (FileNotFoundException e) { 
       ExceptionWriter.LogException(e); 
      } catch (IOException e) { 
       ExceptionWriter.LogException(e); 
      } 
     } 
     _value = props.getProperty(key); 
     if(_value == null || _value.equals("")) System.out.println("Null value supplied for key: "+key); 
     return _value; 
    } 
+0

getResourceAsStream()将帮助读取文件,我同意 - 但他将无法写入文件,因此无论如何需要完全不同的方法 – 2012-04-13 12:06:38