小编kar*_*rts的帖子

Java HashMap的keySet()迭代顺序是否一致?

我知道从M​​ap的keySet()方法返回的Set不保证任何特定的顺序.

我的问题是,它是否保证多次迭代的相同顺序.例如

Map<K,V> map = getMap();

for( K k : map.keySet() )
{
}

...

for( K k : map.keySet() )
{
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,假设映射修改,将迭代在按键组处于相同的顺序.使用Sun的jdk15它以相同的顺序迭代,但在我依赖于这种行为之前,我想知道所有JDK是否都会这样做.

编辑

我从答案中看到我不能依赖它.太糟糕了.我希望不必为了保证我的订购而建立一些新的收藏品.我的代码需要迭代,执行一些逻辑,然后使用相同的顺序再次迭代.我将从keySet创建一个新的ArrayList,这将保证顺序.

java iteration hashmap hashset

71
推荐指数
5
解决办法
6万
查看次数

ant error无法将旧文件重命名为临时文件

我正在使用ant 1.8.0和java 1.6.0.17而且我遇到了一个奇怪的问题.

在我的build.xml中,我有一个编译代码的简单任务

<javac destdir="${dir.build.classes}" debug="on">
    <classpath refid="classpath"/>
    <src path="${dir.src.java}"/>
</javac>
Run Code Online (Sandbox Code Playgroud)

在"classpath"中是一个jar,称之为 library.jar

在以后的任务中,我需要添加一些类library.jar,我喜欢这样

<jar destfile="library.jar" update="true" duplicate="fail">
    <fileset dir="${dir.build.classes}">
        <include name="some/class/files"/>
    </fileset>
</jar>
Run Code Online (Sandbox Code Playgroud)

这将失败并显示错误 Unable to rename old file (library.jar) to temporary file

我在javac调用之前和之后调用了handle.exe,我可以确认运行ant的java进程在javac调用期间抓取了一个文件句柄到library.jar,并且它没有放弃它.这导致我后来尝试更新jar失败.

为什么即使在javac任务完成后,ant也会在类路径中保持jar的句柄?

ant jar javac filehandle

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

使用base64编码器和InputStreamReader的问题

我在数据库中有一些CLOB列,我需要将Base64编码的二进制文件放入.这些文件可能很大,所以我需要流式传输它们,我无法立即读取整个内容.

我正在使用org.apache.commons.codec.binary.Base64InputStream编码,我遇到了问题.我的代码基本上就是这个

FileInputStream fis = new FileInputStream(file);
Base64InputStream b64is = new Base64InputStream(fis, true, -1, null);
BufferedReader reader = new BufferedReader(new InputStreamReader(b64is));

preparedStatement.setCharacterStream(1, reader);
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我在执行更新期间得到其中一个代码, java.io.IOException: Underlying input stream returned zero bytes它在InputStreamReader代码中被深深抛出.

为什么这不起作用?在我看来,它reader会尝试从基本的64流中读取,这将从文件流中读取,并且一切都应该是快乐的.

java base64 encoding jdbc inputstreamreader

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