小编dir*_*ond的帖子

在Java中关闭嵌套流和编写器的正确方法

注意:这个问题及其大多数答案都发布在Java 7发布之前.Java 7提供了自动资源管理功能,可以轻松实现这一目标.如果您使用的是Java 7或更高版本,那么您应该转到Ross Johnson的答案.


什么被认为是在Java中关闭嵌套流的最佳,最全面的方法?例如,考虑设置:

FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
Run Code Online (Sandbox Code Playgroud)

我理解需要保证关闭操作(可能使用finally子句).我想知道的是,是否有必要明确确保嵌套流已关闭,或者只是确保关闭外部流(oos)?

我注意到的一件事,至少在处理这个具体的例子时,内部流似乎只是抛出FileNotFoundExceptions.这似乎意味着技术上不需要担心如果失败就关闭它们.

这是同事写的:


从技术上讲,如果实施得当,关闭最外层的流(oos)就足够了.但实施似乎有缺陷.

示例:BufferedOutputStream从FilterOutputStream继承close(),它将其定义为:

 155       public void close() throws IOException {
 156           try {
 157             flush();
 158           } catch (IOException ignored) {
 159           }
 160           out.close();
 161       }
Run Code Online (Sandbox Code Playgroud)

但是,如果flush()由于某种原因抛出运行时异常,则永远不会调用out.close().所以看起来"最安全"(但很丑陋)主要担心关闭FOS,即保持文件打开.


什么被认为是最好的,当你绝对需要确定,关闭嵌套流的方法?

是否有任何正式的Java/Sun文档可以详细解决这个问题?

java java-io

92
推荐指数
6
解决办法
4万
查看次数

如何使用带有iBatis(myBatis)的注释进行IN查询?

我们只想使用MyBatis的注释; 我们真的想避免使用xml.我们正在尝试使用"IN"子句:

@Select("SELECT * FROM blog WHERE id IN (#{ids})") 
List<Blog> selectBlogs(int[] ids); 
Run Code Online (Sandbox Code Playgroud)

MyBatis似乎无法选择整数数组并将其放入生成的查询中.它似乎"软弱地失败",我们没有得到任何结果.

看起来我们可以使用XML映射来实现这一点,但我们真的想避免这种情况.是否有正确的注释语法?

java annotations ibatis mybatis

28
推荐指数
4
解决办法
3万
查看次数

如何在Clojure中将lambda实现为一个名为"lambda"的函数?

我希望能够在Clojure中使用常见的Lisp语法定义lambdas.例如:

(lambda (myarg)
  (some-functions-that-refer-to myarg))
Run Code Online (Sandbox Code Playgroud)

这需要与以下相同:

#(some-functions-that-refer-to %)
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我知道我将永远只有一个arg,所以也许这简化了事情.(但它可以被称为任何东西 - "myarg"或其他什么.)

我怀疑一个可行的解决方案是"(defmacro lambda ......".如果是这样,我不确定最好的方法.如何干净地将arg名称翻译为%?以及如何最终得到正确的功能?

或者,是否有一个比编写我自己的宏更简单的解决方案,实际上重新实现了Clojure的...... lambda?

macros lambda clojure

16
推荐指数
1
解决办法
6584
查看次数

如何编写Clojure宏以从String创建正则表达式?

我正在创建一个便利宏.方便的一部分是可以使用String而不是#"re"表示法指定正则表达式.

我无法弄清楚的一个部分是如何让宏获取String并将其重写为Clojure正则表达式(例如,生成#"re"表示法).我认为这是一个语法/逃避问题.

我的第一次天真尝试(假装我只想要String-to-regex部分):

(defmacro mymac [mystr] `#~mystr)
Run Code Online (Sandbox Code Playgroud)

是否有可能做我想做的事情?或者,是否有一个实际的函数来获取String并生成一个正则表达式,而不是使用#reader宏?

或者我应该放入Java并使用java.util.regex.Pattern?

regex macros clojure

11
推荐指数
2
解决办法
2524
查看次数

如何使用Eclipse在Java代码中找到潜在的数字溢出?

有没有办法使用Eclipse IDE在Java代码中找到潜在的数字溢出?例如...

long aLong = X * Y * Z;
Run Code Online (Sandbox Code Playgroud)

...其中X,Y和Z是整数,结果可能会溢出Integer.MAX_VALUE.(注意,也许与直觉相反,如果此示例中的结果溢出Integer.MAX_VALUE,则将为aLong分配错误的溢出值).

我查看了Eclipse的警告设置,PMD规则和FindBugs规则,我找不到任何设置来帮助解决这个问题.一位同事指出,IntelliJ会对此发出警告......而且我不得不承认我不能对Eclipse做同样的事情.;-)


澄清1:我不是在找一些给出误报的东西......只是警告说"你这里可能有溢出问题".

澄清2:这是"开发时间"所希望的......这意味着,在Eclipse寻找未使用的进口的同一阶段,PMD正在检查其规则等.

java eclipse math warnings

7
推荐指数
1
解决办法
5186
查看次数

如何将表格数据格式化为Java中的文本?

我想从任意数据集对象模型生成格式良好的表格文本.在Java中有一个很好的库吗?

具体来说,我希望输出格式化为命令行数据管理工具,如CLI for mysql.例:

+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(100) | YES  |     | NULL    |       |
| release | year(4)      | YES  |     | NULL    |       |
| studio  | varchar(50)  | YES  |     | NULL    |       |
| review  | varchar(50)  | YES  |     | NULL    |       |
| gross   | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

一个主要的挑战是,在开始遍历数据之前,我不会自动知道最大列宽.此外,还有很多边缘情况,例如处理非常大的值长度和大量的行和列.

如果我必须自己构建它,我想我会使用String.format,并且我需要在开始输出之前预分析完整的数据集.虽然这是一个非常低级的编码,所以我很想找到一个已经解决了这个问题的好库.

java formatting text

6
推荐指数
1
解决办法
3826
查看次数

可扩展的API服务器,带有Restlet?

我们正在计划一个主要用于JSON响应的新API服务器,它具有RESTful接口.我们关注规模和可用性.我们是否使用Restlet with Jetty(或其他连接器)在正确的轨道上?

我们要问的一个问题是,Java世界中有什么像Phusion Passenger?例如,一个预先构建的解决方案,用于保持服务器实例正常运行?

java scalability restlet

3
推荐指数
1
解决办法
1949
查看次数