Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SFTP上载后未删除本地文件_Java_File_Jsch - Fatal编程技术网

Java 使用SFTP上载后未删除本地文件

Java 使用SFTP上载后未删除本地文件,java,file,jsch,Java,File,Jsch,在通过SSH将文件从本地机器传输到远程ubuntu机器之后,我想删除本地机器上的文件。文件已成功发送,但文件未被删除。请帮忙 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch;

在通过SSH将文件从本地机器传输到远程ubuntu机器之后,我想删除本地机器上的文件。文件已成功发送,但文件未被删除。请帮忙

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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;

public class Scp {

    public Scp() {

    }

    public static void transfer() {
        String SFTPHOST = "ip address";
        int SFTPPORT = 22;
        String SFTPUSER = "username";
        String SFTPPASS = "password";
        String SFTPWORKINGDIR = "workingDirPath";

        Session session = null;
        Channel channel = null;
        ChannelSftp channelSftp = null;
        System.out.println("preparing the host information for sftp.");
        JSch jsch = new JSch();
        try {
            session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
            //session.connect(30000);
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        session.setPassword(SFTPPASS);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        try {
            session.connect();
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Host connected.");
        try {
            channel = session.openChannel("sftp");
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            channel.connect();
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("sftp channel opened and connected.");
        try {
            channelSftp = (ChannelSftp) channel;
            System.out.println(SFTPWORKINGDIR);
            channelSftp.cd(SFTPWORKINGDIR); 
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //String path = System.getProperty("user.home");
        File f = new File("C:/Users/khun/testFile.txt");
        try {

            channelSftp.put(new FileInputStream(f), f.getName());

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("File transfered successfully to host.");
        channelSftp.exit();
        System.out.println("sftp Channel exited.");
        channel.disconnect();
        System.out.println("Channel disconnected.");
        session.disconnect();
        System.out.println("Host Session disconnected.");

        f.getAbsolutePath();
        if(f.delete()) {
            System.out.println("File is deleted");
        }
    }

    public static void main(String[] args) {
        transfer();
    }
}

问题可能是流。小溪已经开了吗? 我不知道你是否已经退出了;通道断开();session.disconnect(); 把小溪也关上。(从未与Jsch合作过)

你能试着手动关闭它吗

例如:

File f = new File("test.txt");
f.createNewFile();
System.out.println(f.exists());
InputStream stream = new FileInputStream(f);
System.out.println(f.delete());
delete返回false

File f = new File("test.txt");
f.createNewFile();
System.out.println(f.exists());
InputStream stream = new FileInputStream(f);
stream.close();
System.out.println(f.delete());
delete返回true

File f = new File("C:/Users/khun/testFile.txt");
try {
    channelSftp.put(new FileInputStream(f), f.getName());
} catch ...
您正在打开一个从文件读取的FileInputStream,然后从未关闭它。Windows通常不允许删除当前打开的文件。当你打开一个文件时,你需要考虑确保它最终被关闭。使用try with resources语法,可以执行以下操作:

File f = new File("C:/Users/khun/testFile.txt");
try (FileInputStream stream = new FileInputStream(f)) {
    channelSftp.put(stream, f.getName());
} catch ...

使用此语法,当控件离开
try
块时,java将自动关闭流。

是否存在异常或其他情况?不幸的是,没有任何异常。。使用和相关类。谢谢,在我使用java.nio.file.Files之后,它现在可以工作了。