首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache VFS内存中

Apache VFS内存中
EN

Stack Overflow用户
提问于 2014-09-10 05:04:57
回答 2查看 2.8K关注 0票数 4

我只是找到了VFS作为访问sftp的一种方式。看起来不错,但是所有的示例都假设有一个本地文件;相反,我将数据放在内存中。我只看到一个方法copyFrom(FileObject),没有接受流或缓冲区的重载...因此,我尝试了ram,因为它听起来大致正确(一些文档不会有什么坏处,但我不能对任何文档进行改进),下面的测试成功了。复制到sftp FileObject中也可以。

有个问题。它给出以下输出: INFO:使用"C:\Users\myname\AppData\Local\Temp\vfs_cache“作为临时文件存储。

--它实际上是在写临时文件吗??这就是我试图避免的(由于运行该程序的Unix服务器上潜在的权限/并发问题)。如果是这样,我该如何完全在内存中完成呢?

代码语言:javascript
复制
// try to copy a string from memory into a FileObject
public class VFSTest {

    public static void main(String[] args) throws IOException {
        String hello = "Hello, World!";
        FileObject ram = VFS.getManager().resolveFile("ram:/tmp");
        OutputStream os = ram.getContent().getOutputStream();
        os.write(hello.getBytes());
        ram.getContent().close();

        FileObject local = VFS.getManager().resolveFile("C:\\foo.txt");
        local.copyFrom(ram, Selectors.SELECT_SELF);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-01-06 00:04:40

不能,日志消息是在设置文件系统管理器时生成的常规消息。它被用于所谓的复制器。您不会在示例中使用它。

是的,ram文件系统是在内存中存放文件的一种选择。另一方面,如果你有一个现有的数据源或字节缓冲区,你将需要抽取它:在VFS中没有任何函数可以从InputStream中读取数据(有一个函数可以将FileContent的内容写入OutputStream)。您通常会使用commons-io IOUtils#copy()来实现这一点。

是的,描述有点简短,但真的没有太多内容。唯一实际的配置是可能的maximum size。(我实际上注意到file system reference也谈到了用于过滤资源的谓词,但它没有实现,所以我从本页面的2.1版本中删除了它)。

票数 1
EN

Stack Overflow用户

发布于 2020-12-21 23:15:03

这是一个老问题,但我遇到了同样的问题,并且我能够在不假设本地文件的情况下解决它,所以这对于有相同问题的人来说可能很有用。基本上,我们可以直接将输入流复制到远程文件的输出流中。

代码是这样的:

代码语言:javascript
复制
InputStream is = ... // you only need an input stream, no local file
    
DefaultFileSystemManager fsmanager = (DefaultFileSystemManager) VFS.getManager();
        
FileSystemOptions opts = new FileSystemOptions();
FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
StaticUserAuthenticator auth = new StaticUserAuthenticator(host, username, password);
         
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
        
String ftpurl = "ftp://" + host + ":" + port + "/" + folder + "/" + filename;
FileObject remoteFile = fsmanager.resolveFile(ftpurl, opts);
        
try (OutputStream ostream = remoteFile.getContent().getOutputStream()) {
    // either copy input stream manually or with IOUtils.copy()
    IOUtils.copy(is, ostream);
}
        
boolean success = remoteFile.exists();
long size = remoteFile.getContent().getSize();
System.out.println(success ? "Successful, copied " + size + " bytes" : "Failed");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25753568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档