java - Xodus VFS 无法持久化字节
问题描述
下面代码的问题是 VFS 似乎无法持久化字节数组。当 Xodus VFS 写入零字节时:
@Override
public FileModel put(
String appId, String namespace, String name, InputStream is) {
final FileModel[] createdFile = {null};
final Environment env = manager.getEnvironment(xodusRoot, appId);
final VirtualFileSystem vfs = new VirtualFileSystem(env);
env.executeInTransaction(
new TransactionalExecutable() {
@Override
public void execute(@NotNull final Transaction txn) {
final File file = vfs.openFile(txn, name, true);;
try {
byte[] ba = ByteStreams.toByteArray(is);
LOG.info("Byte array size: " + ba.length); // Size: 3466
vfs.writeFile(txn, file).write(ba, 0, ba.length);
} catch (IOException e) {
e.printStackTrace();
}
long fileSize = vfs.getFileLength(txn, file);
LOG.info("File Size: " + fileSize); // Size: 0 <----
createdFile[0] = new FileModel();
createdFile[0].setDescriptor(file.getDescriptor());
createdFile[0].setName(name);
createdFile[0].setCreated(file.getCreated());
createdFile[0].setModified(file.getLastModified());
}
});
vfs.shutdown();
return createdFile[0];
}
这是日志:
[qtp1007568224-16] WARN jetbrains.exodus.io.FileDataWriter - Can't open directory channel. Log directory fsync won't be performed.
[qtp1007568224-16] WARN jetbrains.exodus.io.FileDataWriter - Can't open directory channel. Log directory fsync won't be performed.
[qtp1007568224-16] INFO jetbrains.exodus.env.EnvironmentImpl - Exodus environment created: \tmp\xodus\master
[qtp1007568224-16] WARN jetbrains.exodus.io.FileDataWriter - Can't open directory channel. Log directory fsync won't be performed.
[qtp1007568224-16] INFO jetbrains.exodus.env.EnvironmentImpl - Exodus environment created: \tmp\xodus\ab5b92099ad443259b4deaf8df6facc4
[qtp1007568224-16] INFO com.backend.repository.jee.JeeXodusVFSRepository - Byte array size: 3466
[qtp1007568224-16] INFO com.backend.repository.jee.JeeXodusVFSRepository - File Size: 0
[qtp1007568224-16] INFO com.backend.resource.jee.JeeFileServerResource - File size=3466; File.created=1575274836678; File.name="index.html"; File.modified=1575274836678; File.etag=<null>; File.descriptor=261; File.url=<null>
解决方案
该方法vfs.writeFile(txn, file)
返回一个OutputStream
应关闭以保存写入数据的实例。
推荐阅读
- php - 使用什么内置异常来要求调用方法?
- pointers - 0xc00000005:访问冲突读取位置0x00000008
- php - 为什么我会收到警告:在 C:\xampp\htdocs\oop_ph\function.php 中遇到的非数字值?
- python - 脚本交互模式
- android - 将颤振的 CameraImage 转换为文件
- algorithm - 算法将三角形拟合到盒子中
- visual-studio - SSRS 报告 - 总和标题 - 不在组中
- python - matplotlib 的视网膜显示模式是什么?
- parsing - Verilog if else 结构
- javascript - NextJS:如何使用加载组件而不是 nprogress?