Java 7 引入了一个很棒的 API 来编写自定义文件系统。考虑一个用例,我不想实现一个新的文件系统,我只想调整现有文件系统的行为。例如,翻转从它写入/读取的每一位。
在我看来,当前的 jdk 没有为此提供适当的设施。AbstractFileSystemProvider,WindowsFileSystemProvider 扩展的提供程序是包私有的,所以我不能重用它。我什至没有找到 Linux 的具体实现。
问题#1:当前文件系统没有用于扩展的有用抽象。
假设我只为 Windows 扩展。WindowsFileSystemProvider 是公开的,所以我实际上可以轻松地覆盖 newByteChannel 并完成它。可惜!
问题#2:WindowsFileSystem不是公开的,所以我实际上必须编写一个全新的 FileSystem 来引入一个新的 Provider。
我是不是遗漏了什么,或者这个功能是完全原始的,还没有准备好供应用程序编写者使用?
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怎么办。
我正在测试 JPA2.1 和新的“模式生成”功能。为此,我在 HyperSQL 数据库下测试了两种实现:
我对实现没有任何偏好(甚至对性能也没有偏好)。我测试了 EclipseLink,因为它是第一个可用的 JPA2.1 实现,但现在,Hibernate 4.3 已经出现并且兼容 JPA2.1。我唯一想要的就是获得独立于 JPA 提供程序的东西 - 除了配置(如缓存、日志记录、静态编织等)。
至于模式生成,我对几个方面感兴趣:
ImprovedNamingStrategy. 遗憾的是,它没有使用显式名称来命名外键:FK_8gc2pk9u5bsbhpi91x93c77o不是显式的,而是fk_foobar_sample显式的。因此,我添加了@Table,@JoinColumn和@Column注释来强制我的命名策略,现在我被外键生成阻止了,它的支持似乎很差(当遵守 JPA2.1 时):
@org.hibernate.annotations.ForeignKey,为此我需要注释字段或属性。但它是一个 hibernate 注释,因此它不符合 JPA2.1。@JoinColumn和 aforeignKey与@ForeignKey(name="..."). 但是,当它生成外键时,定义丢失了(即:),ALTER TABLE foobar ADD CONSTRAINT fk_foobar_zorg FOREIGN KEY () REFERENCES …我有一个在 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) 从我在上一小时所做的测试中可以看出,Oracle 最后(*)为 Windows 上的 Java JRE 包含了“xcopy 样式”包——即使是非服务器版本。
是的,我知道 gzip 压缩的 tar 文件是什么。这只是没有这些文件的完整性-与用于Windows可执行安装程序被记录在案。
查看当前非服务器 JRE 的Java 7或8 下载页面,我看到:
jre-7u67-windows-i586.tar.gz这些压缩文件似乎没有在我可以谷歌搜索的任何文档中提到,但它们的目的似乎是不必运行任何安装程序,只需将它们复制到机器上,正确设置路径,然后运行他们。(并运行它,我测试过)。
尽管如此,根本没有提及或文档似乎很奇怪。那么有没有官方提到这些tar.gz文件适用于Windows?据我从历史下载中可以看出,它们是在J7u9中引入的- 并且对于 Java 8 显然是 8u20。
(*) “终于”是相对的... J7u9 是 2012-10-16 的,所以它真的不是最近的,但我现在才开始研究让 J6 的东西在 J7/J8 上运行,所以很高兴看到那些现在。
我目前正在编写一些代码,我经常在其中处理文件。我使用 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 路径的任何替代方法(无需手动进行所有解析)。
在 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
我注意到的事情:
我尝试过的事情:
我错过了什么吗?我需要注意的任何其他变化?
我有一个List<ImmutableList<T>>. 我想把它压平成一个单一的ImmutableList<T>,它是所有内部ImmutableLists. 这些列表可能很长,因此我不希望此操作执行所有元素的副本。ImmutableLists要展平的数量将相对较小,因此查找与 的数量呈线性关系是可以的ImmutableLists。我强烈希望串联将返回一个Immutable集合。我需要它返回一个List可以在随机位置访问的。
有没有办法在番石榴中做到这一点?
有Iterables.concat但返回一个Iterable. 将其ImmutableList再次转换为列表 IIUC 的大小将是线性的。
这是给出错误的代码 -
try(StringWriter stringWriter = new StringWriter()) {
Run Code Online (Sandbox Code Playgroud)
IDE 抱怨来自自动关闭资源的未处理异常:java.io.IOException 是否有必要在此处在构造函数中传递某些内容?
在查看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 功能?这会被添加回来吗?