`
sisi1984117
  • 浏览: 156202 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

【转】VFS&&SFTP相关

阅读更多

第一部分

Commons Virtual File System

文章分类:Java编程

VFS

Commons Virtual File System (VFS)提供了一种能够统一访问不同文件系统的抽象层。这个组件能够配置为同时连接一个或多个的文件系统。在Linux操作系统下也是比较容易的。

VFS支持下列文件系统:

  • Local files – 本地文件和文件夹(file://)
  • Zip, jar, tar, tgz, tbz2, gzip, bzip2 – 不同的压缩格式(zip://, jar://, etc.)
  • CIFS – Samba服务或Windows共享(smb://)
  • FTP – FTP服务器(ftp://)
  • HTTP和HTTPS (http://)
  • SFTP – SSH或SCP服务器(sftp://)
  • Temporary files (tmp://)
  • WebDAV – Web-based Distributed Authoring and Versioning (webdav://)
  • Resource from class loader – 使用ClassLoader获取类或其他资源(res://)

        这个组件对那些需要访问不同类型的文件系统的应用程序来说十分有用。举例来说:一个桌面搜索工具同这个框架非常类似。它提供用户搜索文件或文件的内容。另外一个例子就是集成Windows IE浏览器类似的功能到Java应用程序。

        范例应用程序是一个工具,它使用Commons VFS来在文件夹中查询Zip和Jar文件。应用程序没有提供用户界面,但是提供了一个测试用例来证明它能良好的工作。可以在in.co.narayanan.commons.vfs 找到范例和测试代码。按顺序运行范例应用程序,下载源码压缩包,运行Ant构建脚本来创建Commons VFS库。Ant脚本会自动下载其他依赖的库文件。最后通过JUnit测试来启动范例应用程序。[in.co.narayanan.commons.vfs.TestSearchBuddy ]

        最初的使用Commons VFS的想法是创建一个提供支持每种文件类型并能够由DefautFileSystemManager引用的Manager实例。为深层次的操作,需要通过manager的resolveFile方法获取FileObject实例。Manager和FileObject提供了不同的方法,可以在 JavaDoc中找到他们的详细说明。下一段文字描述在搜索工具中如何使用Commons VFS API。

        清单6通过in.co.narayanan.commons.vfs.SearchBuddy类中初始化DefaultFileSystemManager类的代码片断。
 
清单6.初始化文件系统管理器
/**
 * Initialize the DefaultFileSystemManager to support
 * file, zip and jar providers. A virtual file system
 * is created and passed to the SearchableVirtualFileSystem
 * decorator class.
 *
 * @throws SearchException Error in initializing the file
 *       FileSystemManager
 */
private void init() throws SearchException {
 defFileSysMgr = new DefaultFileSystemManager();
 
 try {
 
  defFileSysMgr.addProvider("file", new DefaultLocalFileProvider());
  defFileSysMgr.addProvider("zip", new ZipFileProvider());
  defFileSysMgr.addProvider("jar", new JarFileProvider());
  defFileSysMgr.init();
 
  // 创建虚拟文件系统
  VirtualFileSystem vfs =
  (VirtualFileSystem)defFileSysMgr.createVirtualFileSystem("vfs://").getFileSystem();
 
  searchableVfs = new SearchableVirtualFileSystem(vfs);
   
 } catch (FileSystemException e) {
  throw new SearchException("Unable to initialize the FileSystemManager.", e);
 }
}
        高亮代码行为在文件系统中查询本地普通文件、zip文件、jar文件增加providers。这段代码创建一个VirtualFileSystem类的实例,这个类可以用来装备其它的文件系统。

        清单7时测试用例类TestSearchBuddy的代码片断,它说明范例应用程序如合查找文件。


 
清单7. 使用查询工具
/**
 * Adds the folder, zip, and a jar file to search
 *
 * @throws Exception Error in the test.
 */
public void testSearchInZips() throws Exception {
 SearchBuddy searchTool = new SearchBuddy();
 searchTool.addSearchableZip("testroot.zip");
 searchTool.addSearchableJar("testjar.jar");
 searchTool.addSearchableFolder(".");
  
 System.out.println("Searching for news.txt");
 searchTool.search("news", "txt");
  
 System.out.println("Searching for Range.class");
 searchTool.search("range", "class");
  
 System.out.println("Searching for test.xml");
 searchTool.search("test", "xml");
 
 System.out.println("Searching for *.properties");
 searchTool.search(null, "properties");
 searchTool.close();

}
转自:http://yangzb.iteye.com/blog/600636

 

第二部分Java sftp 实现例子

package net.xwolf.ultility;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class FtpImpl{
    
    private String host = "127.0.0.1";
    private String username="MingMac";
    private String password="×××";
    private int port = 22;
    private ChannelSftp sftp = null;
    private String localPath = "/Users/MingMac/Documents";
    private String remotePath = "/Users/MingMac/MyDocuments";
    private String fileListPath = "/Users/MingMac/Documents/Java/workspace/MyTools/conf/file.txt";
    private final String seperator = "/";
    
    /**
     * connect server via sftp
     */
    public void connect() {
        try {
            if(sftp != null){
                System.out.println("sftp is not null");
            }
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            Session sshSession = jsch.getSession(username, host, port);
            System.out.println("Session created.");
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            System.out.println("Session connected.");
            System.out.println("Opening Channel.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            System.out.println("Connected to " + host + ".");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * Disconnect with server
     */
    public void disconnect() {
        if(this.sftp != null){
            if(this.sftp.isConnected()){
                this.sftp.disconnect();
            }else if(this.sftp.isClosed()){
                System.out.println("sftp is closed already");
            }
        }

    }

    public void download() {
        // TODO Auto-generated method stub
        

    }
    
    
    private void download(String directory, String downloadFile,String saveFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            File file = new File(saveFile);
            sftp.get(downloadFile, new FileOutputStream(file));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * upload all the files to the server
     */
    public void upload() {
        List<String> fileList = this.getFileEntryList(fileListPath);
        try {
            if(fileList != null){
                for (String filepath : fileList) {
                    String localFile = this.localPath + this.seperator+ filepath;
                    File file = new File(localFile);
                    
                    if(file.isFile()){
                        System.out.println("localFile : " + file.getAbsolutePath());
                        String remoteFile = this.remotePath + this.seperator + filepath;
                        System.out.println("remotePath:" + remoteFile);
                        File rfile = new File(remoteFile);
                        String rpath = rfile.getParent();
                        try {
                            createDir(rpath, sftp);
                        } catch (Exception e) {
                            System.out.println("*******create path failed" + rpath);
                        }

                        this.sftp.put(new FileInputStream(file), file.getName());
                        System.out.println("=========upload down for " + localFile);
                    }
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    /**
     * create Directory
     * @param filepath
     * @param sftp
     */
    private void createDir(String filepath, ChannelSftp sftp){
        boolean bcreated = false;
        boolean bparent = false;
        File file = new File(filepath);
        String ppath = file.getParent();
        try {
            this.sftp.cd(ppath);
            bparent = true;
        } catch (SftpException e1) {
            bparent = false;
        }
        try {
            if(bparent){
                try {
                    this.sftp.cd(filepath);
                    bcreated = true;
                } catch (Exception e) {
                    bcreated = false;
                }
                if(!bcreated){
                    this.sftp.mkdir(filepath);
                    bcreated = true;
                }
                return;
            }else{
                createDir(ppath,sftp);
                this.sftp.cd(ppath);
                this.sftp.mkdir(filepath);
            }
        } catch (SftpException e) {
            System.out.println("mkdir failed :" + filepath);
            e.printStackTrace();
        }
        
        try {
            this.sftp.cd(filepath);
        } catch (SftpException e) {
            e.printStackTrace();
            System.out.println("can not cd into :" + filepath);
        }
        
    }
    /**
     * get all the files need to be upload or download
     * @param file
     * @return
     */
    private List<String> getFileEntryList(String file){
        ArrayList<String> fileList = new ArrayList<String>();
        InputStream in = null;
        try {
            
            in = new FileInputStream(file);
            InputStreamReader inreader = new InputStreamReader(in);
            
            LineNumberReader linreader = new LineNumberReader(inreader);
            String filepath = linreader.readLine();
            while(filepath != null){
                fileList.add(filepath);
                filepath = linreader.readLine();
            }
            in.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(in != null){
                in = null;
            }
        }

        return fileList;
    }

    /**
     * @return the host
     */
    public String getHost() {
        return host;
    }

    /**
     * @param host the host to set
     */
    public void setHost(String host) {
        this.host = host;
    }

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the port
     */
    public int getPort() {
        return port;
    }

    /**
     * @param port the port to set
     */
    public void setPort(int port) {
        this.port = port;
    }

    /**
     * @return the sftp
     */
    public ChannelSftp getSftp() {
        return sftp;
    }

    /**
     * @param sftp the sftp to set
     */
    public void setSftp(ChannelSftp sftp) {
        this.sftp = sftp;
    }

    /**
     * @return the localPath
     */
    public String getLocalPath() {
        return localPath;
    }

    /**
     * @param localPath the localPath to set
     */
    public void setLocalPath(String localPath) {
        this.localPath = localPath;
    }

    /**
     * @return the remotePath
     */
    public String getRemotePath() {
        return remotePath;
    }

    /**
     * @param remotePath the remotePath to set
     */
    public void setRemotePath(String remotePath) {
        this.remotePath = remotePath;
    }

    /**
     * @return the fileListPath
     */
    public String getFileListPath() {
        return fileListPath;
    }

    /**
     * @param fileListPath the fileListPath to set
     */
    public void setFileListPath(String fileListPath) {
        this.fileListPath = fileListPath;
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FtpImpl ftp= new FtpImpl();
        ftp.connect();
        ftp.upload();
        ftp.disconnect();
        System.exit(0);
    }


}

 

转自:http://topic.csdn.net/u/20091115/21/09c41943-fb8b-4189-af52-0e7a47152afd.html

最近写的一个JAVA实现SFTP的实例:

/*
* Created on 2009-9-14
* Copyright 2009 by www.xfok.net. All Rights Reserved
*
*/

package net.xfok.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

/**
* @author YangHua
* 转载请注明出处:http://www.xfok.net/2009/10/124485.html
*/
public class MySFTP {

/**
* 连接sftp服务器
* @param host 主机
* @param port 端口
* @param username 用户名
* @param password 密码
* @return
*/
public ChannelSftp connect(String host, int port, String username,
String password) {
ChannelSftp sftp = null;
try {
JSch jsch = new JSch();
jsch.getSession(username, host, port);
Session sshSession = jsch.getSession(username, host, port);
System.out.println("Session created.");
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
System.out.println("Session connected.");
System.out.println("Opening Channel.");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
System.out.println("Connected to " + host + ".");
} catch (Exception e) {

}
return sftp;
}

/**
* 上传文件
* @param directory 上传的目录
* @param uploadFile 要上传的文件
* @param sftp
*/
public void upload(String directory, String uploadFile, ChannelSftp sftp) {
try {
sftp.cd(directory);
File file=new File(uploadFile);
sftp.put(new FileInputStream(file), file.getName());
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 下载文件
* @param directory 下载目录
* @param downloadFile 下载的文件
* @param saveFile 存在本地的路径
* @param sftp
*/
public void download(String directory, String downloadFile,String saveFile, ChannelSftp sftp) {
try {
sftp.cd(directory);
File file=new File(saveFile);
sftp.get(downloadFile, new FileOutputStream(file));
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 删除文件
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @param sftp
*/
public void delete(String directory, String deleteFile, ChannelSftp sftp) {
try {
sftp.cd(directory);
sftp.rm(deleteFile);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 列出目录下的文件
* @param directory 要列出的目录
* @param sftp
* @return
* @throws SftpException
*/
public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException{
return sftp.ls(directory);
}

public static void main(String[] args) {
MySFTP sf = new MySFTP();
String host = "192.168.0.1";
int port = 22;
String username = "root";
String password = "root";
String directory = "/home/httpd/test/";
String uploadFile = "D:\\tmp\\upload.txt";
String downloadFile = "upload.txt";
String saveFile = "D:\\tmp\\download.txt";
String deleteFile = "delete.txt";
ChannelSftp sftp=sf.connect(host, port, username, password);
sf.upload(directory, uploadFile, sftp);
sf.download(directory, downloadFile, saveFile, sftp);
sf.delete(directory, deleteFile, sftp);
try{
sftp.cd(directory);
sftp.mkdir("ss");
System.out.println("finished");
}catch(Exception e){
e.printStackTrace();
}
}
}

<script type="text/javascript"></script>

第五部分使用VFS进行SFTP网络传输
分享到:
评论

相关推荐

    commons-vfs-2.1源码

    7. **扩展性**:Apache Commons VFS的设计允许添加新的文件系统提供者,开发者可以通过实现相关的接口和类,轻松地扩展其功能以支持新的文件系统类型。 8. **线程安全**:由于VFS可能在多线程环境中使用,因此它的...

    commons-vfs-2.0.zip

    2. **多种文件系统支持**:VFS可以处理多种类型的文件系统,包括本地文件系统、远程文件系统(如FTP、SFTP)、网络文件系统(如WebDAV)以及存档文件系统(如ZIP、JAR)。 3. **URL解析**:VFS使用URL来表示文件...

    kettle必须的包

    在Kettle中,如果需要与远程服务器通过SFTP进行数据交互,就需要相关的库支持。 解决这个问题的关键在于添加正确的jar包到Java类路径中。在压缩包文件列表中,可能包含了处理SFTP连接的库,如JSch(Java Secure ...

    commons-logging-1.2.jar commons-vfs-2.2.jar

    使用Apache Commons VFS的SFTP模块,开发者可以轻松地在代码中实现对远程SFTP服务器的文件操作,例如上传、下载、列出目录内容、重命名或删除文件等,而无需关心具体的文件系统细节。Apache Commons Logging则负责...

    commons-vfs-1.0.zip

    Apache Commons VFS(Virtual File System)是Apache软件基金会的一个开源项目,它提供了一个统一的接口来处理各种不同的文件系统。这个接口使得开发者可以方便地在不同的文件系统之间切换,包括本地文件系统、网络...

    commons-logging-1.2.jar,commons-vfs2-2.2.jar,jxl.jar

    这里我们关注的是三个特定的Java库:`commons-logging-1.2.jar`,`commons-vfs2-2.2.jar`,以及`jxl.jar`。这些库分别在日志处理、虚拟文件系统操作和Excel数据处理方面扮演着重要角色。 首先,`commons-logging-...

    vfs-utils:VFS实用程序-开源

    Apache Commons VFS实用程序,例如到Apache Mina FTP服务器的桥接器,到Apache Mina SSHD / SCP / SFTP服务器的桥接器以及可脚本化的Java Shell /控制台,可提供带有VFS文件系统命令和操作的命令行界面。

    sftpLoad:使用 sftp 上传文件到远程服务器

    sftp加载 使用 sftp 上传文件到远程服务器 ... stpTransfer.java:在本地计算机和远程服务器之间传输文件:1) 使用 sftp 进行安全文件传输 2) 使用 Apache Commons VFS 提供单个 API 来访问文件系统(例如 SFTP)

    VFSManager - A Commons VFS GUI-开源

    2. **多文件系统支持**:VFSManager集成了Apache Commons VFS的多种文件系统驱动,用户可以通过单一的界面访问FTP服务器、SFTP(SSH文件传输协议)、SMB(服务器消息块,常用于Windows网络共享)、WebDAV(Web分布式...

    commons-vfs2-filters:已将Apache Commons IO文件过滤器移植到Commons虚拟文件系统(VFS)

    1. **遍历远程文件系统**:使用VFS2,开发者可以遍历FTP、SFTP、HTTP等远程文件系统,并通过过滤器只处理感兴趣的文件。 2. **自动化任务**:在构建系统或持续集成服务器中,可以使用VFS2和过滤器来确定哪些源代码...

    VFS-Resource-Adapter:VFS 入站资源适配器

    VFS-资源-适配器 VFS 入站资源适配器 该项目是在入站资源适配器中使用 commons vfs2 文件监视器的示例。 所有这些都在 TomEE web 项目中可用 信息 在 Web 模块中的 MDB 中配置 sftp 详细信息 构建父 pom mvn tomee...

    KETTLE工具的相关jar包 下载直接使用即可

    4. **文件系统操作库**:如`commons-vfs2.jar`,用于处理不同类型的文件系统,包括本地、FTP、SFTP等。 5. **XML解析库**:如`xercesImpl.jar`,`xml-apis.jar`,用于处理XML格式的数据。 6. **第三方工具库**:...

    ETL工具Kettle用户手册

    Kettle支持Apache VFS,这使得它可以处理各种类型的文件系统,包括FTP、SFTP、WebDAV等。 ##### 9.6 转换步骤类型 Kettle提供了丰富的转换步骤类型,涵盖了从数据读取到数据写入的各个方面。 - **9.6.1 文本文件...

    kettle7常用jar包

    9. **commons-vfs-1.0.jar**:Apache Commons VFS是一个虚拟文件系统库,允许Kettle通过统一的API访问各种类型的文件系统,包括本地文件、FTP、SFTP、HTTP等。 10. **log4j-1.2.12.jar**:Log4j是Apache的一个日志...

    Kettle初学者教程 自学版

    Kettle支持Apache VFS,这意味着它可以透明地处理各种文件系统协议,如FTP、SFTP、HTTP等。 **9.6 转换步骤类型** - **9.6.1 文本文件输入(TextInput)**:从文本文件中读取数据。 - **9.6.2 表输入(TableInput...

    Kettle学习总结材料

    Kettle 支持 Apache VFS,允许用户访问各种类型的文件系统,包括本地文件系统、FTP、SFTP 等。 **9.6 转换步骤类型** - **9.6.1 文本文件输入 (TextInput)** 用于读取文本文件中的数据。 - **9.6.2 表输入 (Table...

    java调用kettle需要的jar包

    6. `pentaho-vfs-browser.jar`: 文件系统抽象层,支持多种类型的文件系统访问,如FTP、SFTP等。 7. 可能还有其他的依赖库,如log4j、commons-lang、commons-codec等,这些是Kettle运行所必需的第三方库。 引入这些...

Global site tag (gtag.js) - Google Analytics