欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA sftp服务器的连接、登出、单文件上传、下载和读取

程序员文章站 2022-06-13 22:25:31
...

 

一,需要用到的JAR包

JAVA sftp服务器的连接、登出、单文件上传、下载和读取

二,注意错误

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

一。连接SFTP

创建一个sftputil工具类,可以增加私钥验证的登陆方式。

	private ChannelSftp sftp;

	private Session session;
	/** SFTP 登录用户名 */
	private String username;
	/** SFTP 登录密码 */
	private String password;
	/** SFTP 服务器地址IP地址 */
	private String host;
	/** SFTP 端口 */
	private int port;

	/**
	 * 构造基于密码认证的sftp对象
	 */
	public SFTPUtil(String username, String password, String host, int port) {
		this.username = "****";
		this.password = "*********";
		this.host = "*********";
		this.port = **;
	}

连接SFTP的方法

	/**
	 * 连接sftp服务器
	 * 
	 * @throws Exception
	 */
	public boolean login() throws Exception {
		try {
			JSch jsch = new JSch();

			session = jsch.getSession(username, host, port);

			if (password != null) {
				session.setPassword(password);
			}
			Properties config = new Properties();
			config.put("StrictHostKeyChecking", "no");

			session.setConfig(config);
			session.connect();
			boolean sessionflag = session.isConnected();
			if (!sessionflag) {
				return false;
			}

			Channel channel = session.openChannel("sftp");
			channel.connect();
			boolean channelflag = channel.isConnected();
			if (!channelflag) {
				return false;
			} else {
				sftp = (ChannelSftp) channel;
				return true;
			}

		} catch (JSchException e) {
			throw new Exception("Sftp登陆异常! " + e);
		}
	}

关闭连接SFTP,可按需要增加布尔返回值

	/**
	 * 关闭连接 sftp
	 */
	public void logout() {
		if (sftp != null) {
			if (sftp.isConnected()) {
				sftp.disconnect();
			}
		}
		if (session != null) {
			if (session.isConnected()) {
				session.disconnect();
			}
		}
	}

上传文件

	/**
	 * 将输入流的数据上传到sftp作为文件。文件完整路径=根目录+上传制定的目录
	 * 
	 * @param basePath
	 *            根目录
	 * @param directory
	 *            上传到该目录
	 * @param sftpFileName
	 *            sftp端文件名
	 * @param input
	 *            输入流
	 */
	public void upload(String basePath, String directory, String sftpFileName,
			InputStream input) throws SftpException {
		try {
			sftp.cd(basePath);
			sftp.cd(directory);
		} catch (SftpException e) {
			// 目录不存在,则创建文件夹
			String[] dirs = directory.split("/");
			String tempPath = basePath;
			for (String dir : dirs) {
				if (null == dir || "".equals(dir))
					continue;
				tempPath += "/" + dir;
				try {
					sftp.cd(tempPath);
				} catch (SftpException ex) {
					// 创建目录
					sftp.mkdir(tempPath);
					sftp.cd(tempPath);
				}
			}
		}
		sftp.put(input, sftpFileName); // 上传文件
	}

d。下载文件的不同方法

	/**
	 * 下载文件。
	 * 
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件
	 * @param saveFile
	 *            存在本地的路径
	 * @throws IOException
	 */
	public boolean download(String directory, String downloadFile,
			String saveFile) throws SftpException, IOException {
		boolean flag = false;
		FileOutputStream outputfile = null;
		try {
			if (directory != null && !"".equals(directory)) {
				sftp.cd(directory);
			}
			// 不能操作文件夹,不然报错。
			String filepath = saveFile + downloadFile;
			File file = new File(filepath);
			outputfile = new FileOutputStream(file.getPath());
			sftp.get(downloadFile, outputfile);
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
			return flag;
		} finally {
			outputfile.close();
		}
		return flag;
	}

	/**
	 * 下载文件
	 * 
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件名
	 * @return 字节数组
	 */
	public byte[] download(String directory, String downloadFile)
			throws SftpException, IOException {
		if (directory != null && !"".equals(directory)) {
			sftp.cd(directory);
		}
		InputStream is = sftp.get(downloadFile);
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		try {
			byte[] buffer = new byte[1024];
			int num = is.read(buffer);
			while (num != -1) {
				output.write(buffer, 0, num);
				num = is.read(buffer);
			}
			output.flush();
		} finally {
			if (is != null) {
				is.close();
			}
		}
		return output.toByteArray();
	}

删除指定文件

	/**
	 * 删除文件
	 * 
	 * @param directory
	 *            要删除文件所在目录
	 * @param deleteFile
	 *            要删除的文件
	 */
	public boolean delete(String directory, String deleteFile)
			throws SftpException {
		boolean flag = false;
		try {
			// 完整路径即可或者当前目录下所包含的目录
			sftp.cd(directory);
			// 删除文件的完整带后缀的文件名
			sftp.rm(deleteFile);
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		return flag;
	}

F.列出目录下的所有文件,目录名

	/**
	 * 列出目录下的文件
	 * 
	 * @param directory
	 *            要列出的目录
	 * @param sftp
	 */
	public ArrayList<String> listFiles(String directory) throws SftpException {
		ArrayList<String> fileList = new ArrayList<String>();
		Vector<?> fileVector = sftp.ls(directory);
		for (Object object : fileVector) {
			ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry) object;
			String filename = lsEntry.getFilename();
			// 文件属性
			SftpATTRS attrs = lsEntry.getAttrs();
			System.out.println("文件或目录名:" + filename + " \r\n文件或目录属性:" + attrs);
			if (filename.indexOf(".") != 0) {
				fileList.add(filename);
			}
		}

		return fileList;
	}

注意LS方法返回一个动态数组,并且列出隐藏的配置文件,所以我通过截取字符串把(.***)的文件名过滤掉。

读取指定文件,通过流输出

	/**
	 * 
	 * @param fileName
	 *            读取的文件名
	 * @param filepath
	 *            读取文件的路径
	 * @return
	 * @throws SftpException
	 */
	public List<String> readFile(String fileName, String filepath)
			throws SftpException {
		InputStream ins = null;
		List<String> sftpList = new ArrayList<String>();

		try {
			// 从SFTP服务器上读取指定的文件
			ins = sftp.get(filepath + fileName);
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					ins, "GBK"));
			String line;
			byte[] arrs = null;

			while ((line = reader.readLine()) != null) {
				sftpList.add(line);
				arrs = line.getBytes("GBK");
				System.out.println(arrs.length + "---" + line);
			}
			reader.close();
			if (ins != null) {
				ins.close();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		return sftpList;
	}