首页 > 解决方案 > 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>

标签: javaxodus

解决方案


该方法vfs.writeFile(txn, file)返回一个OutputStream应关闭以保存写入数据的实例。


推荐阅读