以下代码的问题是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>
答案 0 :(得分:1)
方法vfs.writeFile(txn, file)
返回一个OutputStream
实例,应将其关闭以保存写入的数据。