将文件加载到java.util.Properties中的一行程序
我有许多包含凭证和其他配置的java属性文件,我正在寻找最紧凑的代码,以便在Nashorn的javascript和java中加载这些文件 到目前为止,我只剩下两行:将文件加载到java.util.Properties中的一行程序,java,nashorn,Java,Nashorn,我有许多包含凭证和其他配置的java属性文件,我正在寻找最紧凑的代码,以便在Nashorn的javascript和java中加载这些文件 到目前为止,我只剩下两行: credentials = new java.util.Properties(); credentials.load(new java.io.FileInputStream("credentials.properties")); 我尝试过这种明显的合并,但在纳肖恩不起作用: credentials = (new java.util
credentials = new java.util.Properties();
credentials.load(new java.io.FileInputStream("credentials.properties"));
我尝试过这种明显的合并,但在纳肖恩不起作用:
credentials = (new java.util.Properties()).load(new java.io.FileInputStream("credentials.properties"));
这些可以合并为一行吗?可读性是否受到严重影响并不重要。我认为它应该可以工作,至少在Java中是这样的:
(credentials = new java.util.Properties()).load(new java.io.FileInputStream("credentials.properties"));
最简单和最安全的解决方案是使用实用方法引入间接层:
public static Properties loadProperties(File file)
{
Properties props = new Properties();
try (FileInputStream fis = new FileInputStream(file))
{
props.load(fis);
}
catch (IOException ioex) { ioex.printStackTrace(); }
return props;
}
Properties credentials = loadProperties(new File("credentials.properties"));
JS等价物是(没有try/catch
):
通过添加
try
语句,您还可以轻松捕获I/O错误。如果您想以Java-8风格使用Optional
和lambdas,您可以尝试以下方法
Properties credentials=Optional.of(new Properties()).map(p->{try{p.load(new FileInputStream("credentials.properties"));}catch(IOException e){}return p;}).get();
(更长但可读性更强的版本,带有换行符)
更新:
如果没有try/catch,java将变成这样:
Properties credentials = Optional.of(new Properties()).map(p -> { p.load(new FileInputStream("credentials.properties")); return p; }).get();
对于Nashorn js:
var credentials = java.util.Optional.of(new java.util.Properties()).map(function(p) { p.load(new java.io.FileInputStream("credentials.properties")); return p;}).get();
这仍然是一个两行程序,因为您必须保留变量声明。是的,但是声明不在原始的两行程序中。我保持代码简单以避免混淆。在js中,最初的第一行是“var credentials=new java.util.Properties();”。我试过你的代码,但在js中,我无法让它与“(var credentials=…”一起工作。因此,在java中可能是1行,但在js中可能是2行。这是1.5行:-)可能有一些js技巧可以做到这一点(操纵原型?)但我对这方面不太了解javascript@bwt使用prototype会使js和java代码分歧过大。lambdas最合适。谢谢你的1.5班轮。我对它进行了升级,如果代码中预定义了变量,我将使用它。Nashorn javascript可以使用try/catch/finally。我真的在寻找一个对js和java都有效的单行程序。我没有选择函数/干法,否则我不会问这个问题。如果这个和@bwt的解决方案都不适合你,那么我恐怕你就走运了。在Java中,无法同时声明变量并调用其上的
void
函数。我还没有探索lambda方法。我只是尝试了一下,lambda方法是有问题的,因为load
会抛出IOException
。否则,这就是它作为Lambda的样子,带有optional(类似于derpy):Properties=optional.of(newproperties()).map(p->{p.load(newfileinputstream(“credentials.Properties”);return p;}.get()代码>我喜欢这个解决方案。略重于预期,但稍作修改(我编辑了您的答案),它适用于两种语言。谢谢我们怎样才能用它来关闭小溪?据我所知,propertes.load在加载后不会关闭流。我希望我没有错过什么
Properties credentials = Optional.of(new Properties()).map(p -> { p.load(new FileInputStream("credentials.properties")); return p; }).get();
var credentials = java.util.Optional.of(new java.util.Properties()).map(function(p) { p.load(new java.io.FileInputStream("credentials.properties")); return p;}).get();