linux下java实现ftp下载,ftpClient.listFiles();返回的数组长度一直是0

linux下java实现ftp下载,ftpClient.listFiles();返回的数组长度一直是0,第1张

如果你加了ftpCliententerRemotePassiveMode();还是不行,那么就可能是你commons-net 的jia包版本太低,你可以试着引入 commons-net-33jar以及以上版本的jar应该就可以了。

拿去用吧。

package comweixinutil;

import javaioFile;

import javaioFileOutputStream;

import javaioIOException;

import javaioInputStream;

import javaioOutputStream;

import javaioPrintWriter;

import javaioRandomAccessFile;

import orgapachecommonsnetPrintCommandListener;

import orgapachecommonsnetftpFTP;

import orgapachecommonsnetftpFTPClient;

import orgapachecommonsnetftpFTPFile;

import orgapachecommonsnetftpFTPReply;

import comweixinconstantDownloadStatus;

import comweixinconstantUploadStatus;

/

  支持断点续传的FTP实用类

  @version 01 实现基本断点上传下载

  @version 02 实现上传下载进度汇报

  @version 03 实现中文目录创建及中文文件创建,添加对于中文的支持

 /

public class ContinueFTP {

public FTPClient ftpClient = new FTPClient();

public ContinueFTP(){

//设置将过程中使用到的命令输出到控制台

thisftpClientaddProtocolCommandListener(new PrintCommandListener(new PrintWriter(Systemout)));

}

/

  连接到FTP服务器

  @param hostname 主机名

  @param port 端口

  @param username 用户名

  @param password 密码

  @return 是否连接成功

  @throws IOException

 /

public boolean connect(String hostname,int port,String username,String password) throws IOException{

ftpClientconnect(hostname, port);

ftpClientsetControlEncoding("GBK");

if(FTPReplyisPositiveCompletion(ftpClientgetReplyCode())){

if(ftpClientlogin(username, password)){

return true;

}

}

disconnect();

return false;

}

/

  从FTP服务器上下载文件,支持断点续传,上传百分比汇报

  @param remote 远程文件路径

  @param local 本地文件路径

  @return 上传的状态

  @throws IOException

 /

public DownloadStatus download(String remote,String local) throws IOException{

//设置被动模式

ftpCliententerLocalPassiveMode();

//设置以二进制方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

DownloadStatus result;

//检查远程文件是否存在

FTPFile[] files = ftpClientlistFiles(new String(remotegetBytes("GBK"),"iso-8859-1"));

if(fileslength != 1){

Systemoutprintln("远程文件不存在");

return DownloadStatusRemote_File_Noexist;

}

long lRemoteSize = files[0]getSize();

File f = new File(local);

//本地存在文件,进行断点下载

if(fexists()){

long localSize = flength();

//判断本地文件大小是否大于远程文件大小

if(localSize >= lRemoteSize){

Systemoutprintln("本地文件大于远程文件,下载中止");

return DownloadStatusLocal_Bigger_Remote;

}

//进行断点续传,并记录状态

FileOutputStream out = new FileOutputStream(f,true);

ftpClientsetRestartOffset(localSize);

InputStream in = ftpClientretrieveFileStream(new String(remotegetBytes("GBK"),"iso-8859-1"));

byte[] bytes = new byte[1024];

long step = lRemoteSize /100;

long process=localSize /step;

int c;

while((c = inread(bytes))!= -1){

outwrite(bytes,0,c);

localSize+=c;

long nowProcess = localSize /step;

if(nowProcess > process){

process = nowProcess;

if(process % 10 == 0)

Systemoutprintln("下载进度:"+process);

//TODO 更新文件下载进度,值存放在process变量中

}

}

inclose();

outclose();

boolean isDo = ftpClientcompletePendingCommand();

if(isDo){

result = DownloadStatusDownload_From_Break_Success;

}else {

result = DownloadStatusDownload_From_Break_Failed;

}

}else {

OutputStream out = new FileOutputStream(f);

InputStream in= ftpClientretrieveFileStream(new String(remotegetBytes("GBK"),"iso-8859-1"));

byte[] bytes = new byte[1024];

long step = lRemoteSize /100;

long process=0;

long localSize = 0L;

int c;

while((c = inread(bytes))!= -1){

outwrite(bytes, 0, c);

localSize+=c;

long nowProcess = localSize /step;

if(nowProcess > process){

process = nowProcess;

if(process % 10 == 0)

Systemoutprintln("下载进度:"+process);

//TODO 更新文件下载进度,值存放在process变量中

}

}

inclose();

outclose();

boolean upNewStatus = ftpClientcompletePendingCommand();

if(upNewStatus){

result = DownloadStatusDownload_New_Success;

}else {

result = DownloadStatusDownload_New_Failed;

}

}

return result;

}

/

  上传文件到FTP服务器,支持断点续传

  @param local 本地文件名称,绝对路径

  @param remote 远程文件路径,使用/home/directory1/subdirectory/fileext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构

  @return 上传结果

  @throws IOException

 /

public UploadStatus upload(String local,String remote) throws IOException{

//设置PassiveMode传输

ftpCliententerLocalPassiveMode();

//设置以二进制流的方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

ftpClientsetControlEncoding("GBK");

UploadStatus result;

//对远程目录的处理

String remoteFileName = remote;

if(remotecontains("/")){

remoteFileName = remotesubstring(remotelastIndexOf("/")+1);

//创建服务器远程目录结构,创建失败直接返回

if(CreateDirecroty(remote, ftpClient)==UploadStatusCreate_Directory_Fail){

return UploadStatusCreate_Directory_Fail;

}

}

//检查远程是否存在文件

FTPFile[] files = ftpClientlistFiles(new String(remoteFileNamegetBytes("GBK"),"iso-8859-1"));

if(fileslength == 1){

long remoteSize = files[0]getSize();

File f = new File(local);

long localSize = flength();

if(remoteSize==localSize){

return UploadStatusFile_Exits;

}else if(remoteSize > localSize){

return UploadStatusRemote_Bigger_Local;

}

//尝试移动文件内读取指针,实现断点续传

result = uploadFile(remoteFileName, f, ftpClient, remoteSize);

//如果断点续传没有成功,则删除服务器上文件,重新上传

if(result == UploadStatusUpload_From_Break_Failed){

if(!ftpClientdeleteFile(remoteFileName)){

return UploadStatusDelete_Remote_Faild;

}

result = uploadFile(remoteFileName, f, ftpClient, 0);

}

}else {

result = uploadFile(remoteFileName, new File(local), ftpClient, 0);

}

return result;

}

/

  断开与远程服务器的连接

  @throws IOException

 /

public void disconnect() throws IOException{

if(ftpClientisConnected()){

ftpClientdisconnect();

}

}

/

  递归创建远程服务器目录

  @param remote 远程服务器文件绝对路径

  @param ftpClient FTPClient对象

  @return 目录创建是否成功

  @throws IOException

 /

public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{

UploadStatus status = UploadStatusCreate_Directory_Success;

String directory = remotesubstring(0,remotelastIndexOf("/")+1);

if(!directoryequalsIgnoreCase("/")&&!ftpClientchangeWorkingDirectory(new String(directorygetBytes("GBK"),"iso-8859-1"))){

//如果远程目录不存在,则递归创建远程服务器目录

int start=0;

int end = 0;

if(directorystartsWith("/")){

start = 1;

}else{

start = 0;

}

end = directoryindexOf("/",start);

while(true){

String subDirectory = new String(remotesubstring(start,end)getBytes("GBK"),"iso-8859-1");

if(!ftpClientchangeWorkingDirectory(subDirectory)){

if(ftpClientmakeDirectory(subDirectory)){

ftpClientchangeWorkingDirectory(subDirectory);

}else {

Systemoutprintln("创建目录失败");

return UploadStatusCreate_Directory_Fail;

}

}

start = end + 1;

end = directoryindexOf("/",start);

//检查所有目录是否创建完毕

if(end <= start){

break;

}

}

}

return status;

}

/

  上传文件到服务器,新上传和断点续传

  @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变

  @param localFile 本地文件File句柄,绝对路径

  @param processStep 需要显示的处理进度步进值

  @param ftpClient FTPClient引用

  @return

  @throws IOException

 /

public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{

UploadStatus status;

//显示进度的上传

long step = localFilelength() / 100;

long process = 0;

long localreadbytes = 0L;

RandomAccessFile raf = new RandomAccessFile(localFile,"r");

OutputStream out = ftpClientappendFileStream(new String(remoteFilegetBytes("GBK"),"iso-8859-1"));

//断点续传

if(remoteSize>0){

ftpClientsetRestartOffset(remoteSize);

process = remoteSize /step;

rafseek(remoteSize);

localreadbytes = remoteSize;

}

byte[] bytes = new byte[1024];

int c;

while((c = rafread(bytes))!= -1){

outwrite(bytes,0,c);

localreadbytes+=c;

if(localreadbytes / step != process){

process = localreadbytes / step;

Systemoutprintln("上传进度:" + process);

//TODO 汇报上传状态

}

}

outflush();

rafclose();

outclose();

boolean result =ftpClientcompletePendingCommand();

if(remoteSize > 0){

status = resultUploadStatusUpload_From_Break_Success:UploadStatusUpload_From_Break_Failed;

}else {

status = resultUploadStatusUpload_New_File_Success:UploadStatusUpload_New_File_Failed;

}

return status;

}

public static void main(String[] args) {

ContinueFTP myFtp = new ContinueFTP();

try {

Systemerrprintln(myFtpconnect("10106236", 21, "5", "jieyan"));

// myFtpftpClientmakeDirectory(new String("歌曲"getBytes("GBK"),"iso-8859-1"));

// myFtpftpClientchangeWorkingDirectory(new String("歌曲"getBytes("GBK"),"iso-8859-1"));

// myFtpftpClientmakeDirectory(new String("爱你等于爱自己"getBytes("GBK"),"iso-8859-1"));

// Systemoutprintln(myFtpupload("E:\\ywflv", "/ywflv",5));

// Systemoutprintln(myFtpupload("E:\\爱你等于爱自己mp4","/爱你等于爱自己mp4"));

//Systemoutprintln(myFtpdownload("/爱你等于爱自己mp4", "E:\\爱你等于爱自己mp4"));

myFtpdisconnect();

} catch (IOException e) {

Systemoutprintln("连接FTP出错:"+egetMessage());

}

}

}

文件名问题没遇到过。

文件大小的遇到过。。

我遇到的是下载小压缩包,压缩包小于 64k 时正常,大于64K 后只能解压出一部分约64K左右的数据。

后来发现是使用FTPClient 的时候配置参数中 WINDOWS 和LINUX 的问题。

你可以去尝试一下,从这个方面着手。

使用方法不对吧,你看看FTPClient这个类,提供了deleteFile方法,应该是用这个进行删除文件的

至于用命令的方式删除,你要看哈FTPCommand这个类里面的常量命令,有DELE和DELETE两个,我没用过命令的方式,不知道这两个的区别,需要你自己试了

这个是可以向服务器端发送文字的程序,就是在客户端发送一句hello在服务器也可以接受到hello,这个程序可以修改一下就可以了。具体修改方法是增加一个定时器,然后把字符流改成字节流,现在有点忙,你先研究啊,近两天帮你写写看。

服务器端:

import javanet;

import javaio;

public class DateServer {

public static void main(String[] args) {

ServerSocket server=null;

try{

server=new ServerSocket(6666);

Systemoutprintln(

"Server start on port 6666");

while(true){

Socket socket=serveraccept();

new SocketHandler(socket)start();

/

PrintWriter out=new PrintWriter(

new OutputStreamWriter(

socketgetOutputStream()

)

);

outprintln(new javautilDate()toLocaleString());

outclose();

/

}

}catch(Exception e){

eprintStackTrace();

}finally{

if(server!=null) {

try{

serverclose();

}catch(Exception ex){}

}

}

}

}

class SocketHandler extends Thread {

private Socket socket;

public SocketHandler(Socket socket) {

thissocket=socket;

}

public void run() {

try{

PrintWriter out=new PrintWriter(

new OutputStreamWriter(

socketgetOutputStream()

)

);

outprintln(

new javautilDate()

toLocaleString());

outclose();

}catch(Exception e){

eprintStackTrace();

}

}

}

客户端:

package combriup;

import javaio;

import javanet;

public class FtpClient {

public static void main(String[] args) {

if(argslength==0) {

Systemoutprintln("Usage:java FtpClient file_path");

Systemexit(0);

}

File file=new File(args[0]);

if(!fileexists()||!filecanRead()) {

Systemoutprintln(args[0]+" doesn't exist or can not read");

Systemexit(0);

}

Socket socket=null;

try{

socket=new Socket(args[1],IntegerparseInt(args[2]));

BufferedInputStream in=new BufferedInputStream(

new FileInputStream(file)

);

BufferedOutputStream out=new BufferedOutputStream(

socketgetOutputStream()

);

byte[] buffer=new byte[10248];

int i=-1;

while((i=inread(buffer))!=-1) {

outwrite(buffer,0,i);

}

Systemoutprintln(socketgetInetAddress()getHostAddress()+" send file over");

inclose();

outclose();

}catch(Exception e){

eprintStackTrace();

}finally{

if(socket!=null) {

try{

socketclose();

}catch(Exception ex){}

}

}

}

}

以上就是关于linux下java实现ftp下载,ftpClient.listFiles();返回的数组长度一直是0全部的内容,包括:linux下java实现ftp下载,ftpClient.listFiles();返回的数组长度一直是0、java 怎么从ftp获取文件路径、使用java程序到ftp抓取文件并保存到数据库中 若文件名包含英文像wea.png retrieveFileStream方法获取为空等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9602154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存