标签: java-7

调整 Java 7 中默认文件系统的行为

Java 7 引入了一个很棒的 AP​​I 来编写自定义文件系统。考虑一个用例,我不想实现一个新的文件系统,我只想调整现有文件系统的行为。例如,翻转从它写入/读取的每一位。

在我看来,当前的 jdk 没有为此提供适当的设施。AbstractFileSystemProvider,WindowsFileSystemProvider 扩展的提供程序是包私有的,所以我不能重用它。我什至没有找到 Linux 的具体实现。

问题#1:当前文件系统没有用于扩展的有用抽象。

假设我只为 Windows 扩展。WindowsFileSystemProvider 是公开的,所以我实际上可以轻松地覆盖 newByteChannel 并完成它。可惜!

问题#2:WindowsFileSystem不是公开的,所以我实际上必须编写一个全新的 FileSystem 来引入一个新的 Provider。

我是不是遗漏了什么,或者这个功能是完全原始的,还没有准备好供应用程序编写者使用?

java filesystems io java-7

5
推荐指数
1
解决办法
374
查看次数

AsynchronousFileChannel如何读取大文件?

  Path file = Paths.get("c:/large.log");
  AsynchronousFileChannel channel = AsynchronousFileChannel.open(file);
  final ByteBuffer buffer = ByteBuffer.allocate(1000);
  channel.read(buffer, 0, buffer,
      new CompletionHandler<Integer, ByteBuffer>() {
        public void completed(Integer result, ByteBuffer attachment) {
          System.out.println(new String(buffer.array()));
        }
  }); 
Run Code Online (Sandbox Code Playgroud)

这样,我就可以从large.log中读取前1000字节。如果我不想分配更大的字节数组,如 ByteBuffer.allocate(1000*1000),我如何读取以下日志。因为我认为这会导致OutOfMemory。

有人可以给我示例代码吗? 谢谢。

ps:我可以用JIO循环读取大文件,因为我可以检查java.io.BufferedReader.read()的返回值。但我不知道NIO2怎么办。

io java-7 nio2

5
推荐指数
2
解决办法
6696
查看次数

使用 EclipseLink 和 Hibernate (JPA2.1) 生成架构 - @ForeignKey 被忽略

我正在测试 JPA2.1 和新的“模式生成”功能。为此,我在 HyperSQL 数据库下测试了两种实现:

  • EclipseLink 2.5.2-M1 是参考实现。
  • 休眠4.3

我对实现没有任何偏好(甚至对性能也没有偏好)。我测试了 EclipseLink,因为它是第一个可用的 JPA2.1 实现,但现在,Hibernate 4.3 已经出现并且兼容 JPA2.1。我唯一想要的就是获得独立于 JPA 提供程序的东西 - 除了配置(如缓存、日志记录、静态编织等)。

至于模式生成,我对几个方面感兴趣:

  • 我对 EclipseLink 的默认命名策略不满意:实体类名称或字段/属性名称大写,使其不可读。而且我不扩展会话定制器(我尝试过一次,我认为添加注释更容易,危险更小......)。
  • 我不喜欢在查询中使用大写;好吧,这是个人喜好,但我在 Linux 上使用 mySQL 也遇到了问题,因为它们不遵循标识符,并且关键字不区分大小写,除非您双引号它们SQL 习惯用法。
  • 默认情况下,Hibernate 并没有好多少,但可以使用ImprovedNamingStrategy. 遗憾的是,它没有使用显式名称来命名外键:FK_8gc2pk9u5bsbhpi91x93c77o不是显式的,而是fk_foobar_sample显式的。

因此,我添加了@Table,@JoinColumn和@Column注释来强制我的命名策略,现在我被外键生成阻止了,它的支持似乎很差(当遵守 JPA2.1 时):

  • Hibernate 希望我使用@org.hibernate.annotations.ForeignKey,为此我需要注释字段或属性。但它是一个 hibernate 注释,因此它不符合 JPA2.1。
  • EclipseLink 永远不会生成外键约束,除非我将 a@JoinColumn和 aforeignKey与@ForeignKey(name="..."). 但是,当它生成外键时,定义丢失了(即:),ALTER TABLE foobar ADD CONSTRAINT fk_foobar_zorg FOREIGN KEY () REFERENCES …

hibernate eclipselink java-7 jpa-2.1

5
推荐指数
1
解决办法
2098
查看次数

Glassfish 4 Grizzly 线程 CPU 使用率高

我有一个在 Glassfish 4(4.1 版本 13)、JDK 1.7 更新 67 和 AWS Linux AMI 上运行的 Jersey 应用程序,我注意到在运行它几个小时后,CPU 使用率上升并保持不变,即使客户端停止。

运行“top -H”可识别 2 个具有高 CPU 使用率的 http-listener-1-kernel 线程(总共 16 个)。然后我进行了一个线程转储来检查这两个线程:

"http-listener-1-kernel(3) SelectorRunner" daemon prio=10 tid=0x00007fbc68251000 nid=0xaee runnable [0x00007fbcb55ce000]
    java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
        at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
        at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
        - locked <0x000000060263ad88> (a sun.nio.ch.Util$2)
        - locked <0x000000060263ad78> (a java.util.Collections$UnmodifiableSet)
        - locked <0x00000006025fb068> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.selectNow(SelectorImpl.java:106)
        at org.glassfish.grizzly.nio.DefaultSelectorHandler.select(DefaultSelectorHandler.java:114)
        at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:338)
        at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:278)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
        at java.lang.Thread.run(Thread.java:745)


"http-listener-1-kernel(8) SelectorRunner" daemon prio=10 tid=0x00007fbc6825b800 nid=0xaf3 …
Run Code Online (Sandbox Code Playgroud)

java glassfish grizzly java-7 glassfish-4

5
推荐指数
1
解决办法
3535
查看次数

Java JRE (7, 8) 的 Windows tar.gz 文件是什么?

从我在上一小时所做的测试中可以看出,Oracle 最后(*)为 Windows 上的 Java JRE 包含了“xcopy 样式”包——即使是非服务器版本。

是的,我知道 gzip 压缩的 tar 文件是什么。这只是没有这些文件的完整性-与用于Windows可执行安装程序被记录在案。

查看当前非服务器 JRE 的Java 7或8 下载页面,我看到:

  • Windows x86 Online jre-7u67-windows-i586-iftw.exe
  • Windows x86 脱机 jre-7u67-windows-i586.exe
  • 视窗 x86 jre-7u67-windows-i586.tar.gz
  • Windows x64 jre-7u67-windows-x64.exe
  • Windows x64 jre-7u67-windows-x64.tar.gz

这些压缩文件似乎没有在我可以谷歌搜索的任何文档中提到,但它们的目的似乎是不必运行任何安装程序,只需将它们复制到机器上,正确设置路径,然后运行他们。(并运行它,我测试过)。

尽管如此,根本没有提及或文档似乎很奇怪。那么有没有官方提到这些tar.gz文件适用于Windows?据我从历史下载中可以看出,它们是在J7u9中引入的- 并且对于 Java 8 显然是 8u20。


(*) “终于”是相对的... J7u9 是 2012-10-16 的,所以它真的不是最近的,但我现在才开始研究让 J6 的东西在 J7/J8 上运行,所以很高兴看到那些现在。

java windows java-7

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

Linux 上的 Java Paths.get() 奇怪行为

我目前正在编写一些代码,我经常在其中处理文件。我使用 Java 7 nio 类 Paths 和 Path 实现了所有文件路径处理(连接、规范化等)。在 Windows 上,一切都按预期工作,但是在 Linux 上,Paths 类的行为似乎被破坏了。

例如下面的代码:

    System.out.println(File.separator);
    System.out.println(FileSystems.getDefault());
    Path path = Paths.get("../dir1/", "\\dir2\\file1").toAbsolutePath().normalize();
    System.out.println(path);
    if(path.toFile().exists()) {
        System.out.println(path + " exists");
    }
Run Code Online (Sandbox Code Playgroud)

在 Windows 上打印以下输出:

\
sun.nio.fs.WindowsFileSystem
D:\projects\dir1\dir2\file1
true
Run Code Online (Sandbox Code Playgroud)

但是在 Java 1.7.0_79(64 位)和 Java 1.8.0_60(64 位)上的 Linux Ubuntu 14.04 上的相同代码使路径未规范化:

/
sun.nio.fs.LinuxFileSystem
/home/semi/dir1/\dir2\file1
Run Code Online (Sandbox Code Playgroud)

此外,即使文件在路径中/home/semi/dir1/dir2/file1存在,它也会被报告为不存在path.toFile().exists()。

我查看了一下LinuxFileSystem.java和WindowsFileSystem.java,似乎在 Windows 上,路径被检查了/和\字符(在WindowsPathParser.isSlash(char c)方法中)。Linux 实现不应该这样做吗?

这是sun.nio.fs.LinuxFileSystem实现中的错误还是我做错了什么?

您还知道确保正确解析和规范化 Linux 路径的任何替代方法(无需手动进行所有解析)。

java linux windows path java-7

5
推荐指数
1
解决办法
3285
查看次数

java.lang.VerifyError: JVMVRFY012 堆栈形状不一致;

在 WAS 8.5.5 中部署 Maven 项目时出现以下错误。

我已经在 WAS 中安装了 JDK 1.6 和 1.7。

错误 500:org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常是 java.lang.VerifyError: JVMVRFY012 堆栈形状不一致;class=com/xyz/simtools/savings/jaxb/SavingsInput_JAXB_Deserialization_Stub,method=write(ILjava/lang/Object;)V,pc=356

我注意到的事情:

  1. 在Tomcat中,它工作正常
  2. 有一些修正,根据该在IBM JDK这个,但它仍然不是为我工作

我尝试过的事情:

  1. 在 WAS 中尝试了两个 JDK 版本。
  2. 阅读IBM 论坛中的此链接
  3. 在 1.5 和 1.7 中编译我的项目并尝试部署

我错过了什么吗?我需要注意的任何其他变化?

java websphere java-7 ibm-was

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

连接不可变列表

我有一个List<ImmutableList<T>>. 我想把它压平成一个单一的ImmutableList<T>,它是所有内部ImmutableLists. 这些列表可能很长,因此我不希望此操作执行所有元素的副本。ImmutableLists要展平的数量将相对较小,因此查找与 的数量呈线性关系是可以的ImmutableLists。我强烈希望串联将返回一个Immutable集合。我需要它返回一个List可以在随机位置访问的。

有没有办法在番石榴中做到这一点?

有Iterables.concat但返回一个Iterable. 将其ImmutableList再次转换为列表 IIUC 的大小将是线性的。

guava java-7

5
推荐指数
1
解决办法
3540
查看次数

为什么在 try with resources 子句中实例化时出现错误?

这是给出错误的代码 -

try(StringWriter stringWriter = new StringWriter()) {
Run Code Online (Sandbox Code Playgroud)

IDE 抱怨来自自动关闭资源的未处理异常:java.io.IOException 是否有必要在此处在构造函数中传递某些内容?

java java-7 java-8

5
推荐指数
2
解决办法
3002
查看次数

Java 外来标识符的状态

在查看Java 调用动态文档时,我看到了以下 Java 特性示例,称为“exotic identifiers”:

int #"strange variable name" = 42;
System.out.println(#"strange variable name");  // prints 42
Run Code Online (Sandbox Code Playgroud)

我无法让它在我的机器上的 openjdk8 上工作。进一步的谷歌搜索发现了一些与此功能相关的错误报告,但没有其他太多。特别是这个错误,以及这个其他错误。

这里的另一个错误表明此功能已在 jdk7 中删除/从未删除。

这是以前的 Java 功能,后来被删除了,还是从来没有正式的 Java 功能?这会被添加回来吗?

java jls language-lawyer java-7 java-8

5
推荐指数
1
解决办法
75
查看次数