JAVA: FileInputStream and FileOutputStream

6
我对输入输出流有一个奇怪的问题,却一直无法理解。 我使用InputStream从资源文件中读取属性文件,代码如下:
Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream( "/resources/SQL.properties" );
rop.load(in);
return prop;

它成功找到并读取了我的文件。我尝试像这样写入修改后的设置:
prop.store(new FileOutputStream( "/resources/SQL.properties" ), null);

我遇到了一个存储时的奇怪错误:

java.io.FileNotFoundException: \resources\SQL.properties (The system cannot find the path specified)

那么为什么属性路径会改变?如何修复这个问题? 我正在使用Windows上的Netbeans


1
欢迎来到SO。对于一个措辞得当且包含所有必要信息的问题,我给予+1的支持。 - Jim Garrison
3个回答

6
问题在于 getResourceAsStream() 解析您提供的路径相对于类路径,而 new FileOutputStream() 直接在文件系统中创建文件。 它们具有不同的路径起点。
一般情况下,您不能将资源加载回其源位置进行写入,因为它可能根本不存在于文件系统中。 例如,它可能位于 jar 文件中,JVM 不会更新 jar 文件。

1
你能给我一个正确书写的例子吗? - gedO
你不能正确地编写它。通常情况下,你不能将内容写入从资源加载的位置。因为该位置可能不存在可写入的位置。 - Jim Garrison

3
也许它可以正常工作。
try
{
java.net.URL url = this.getClass().getResource("/resources/SQL.properties");

java.io.FileInputStream pin = new java.io.FileInputStream(url.getFile());

java.util.Properties props = new java.util.Properties();

props.load(pin);
}
catch(Exception ex)
{
ex.printStackTrace();
}

请查看下面的链接:

getResourceAsStream()与FileInputStream的区别


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接