java ftp上传不稳定的问题 使用sun.net.ftp.FtpClient;类的客户端上传文件到FTP服务器如果执行运行程序,上传后的文件大小是0如果DEBUG程序,一步一步执行上传后的文件没有问题这是怎么回事呢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不大明白,给你一段代码看看有没有帮助//ftp建立连接 FtpClient ftpClient=new FtpClient(); ftpClient.openServer("ftp-ip",21); ftpClient.login("用户名","密码"); ftpClient.binary(); ftpClient.cd("/test");//进入根目录下的某一个目录 //删除 ftpClient.ascii(); ftpClient.sendServer("DELE test.xml \r\n"); ftpClient.readServerResponse(); ftpClient.binary(); //ftp上传本机文件 InputStream streamHtml = new BufferedInputStream(new FileInputStream(new File("D:/xxx.txt")), 10240); TelnetOutputStream tos = ftpClient.put("test.xml"); int readLength = 0; byte[] buf = new byte[1024]; while ((readLength = streamHtml.read(buf, 0, 1024)) != -1) { tos.write(buf, 0, readLength); } streamHtml.close(); tos.close(); //ftp下载 TelnetInputStream tis = ftpClient.get("tet.txt"); BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File("D:/test.txt"))); int readLength = 0; byte[] buf = new byte[1024]; while ((readLength = tis.read(buf, 0, 1024)) != -1) { os.write(buf, 0, readLength); } tis.close(); os.close(); //关闭ftp ftpClient.closeServer(); 应该不是的,因为我已经看到这个文件了,只是文件大小为0;另外我用相同的用户用FTP工具上传文件是可以的。 你可能对底层的socket通讯不是很了解。出现传输文件0字节的问题,有很多,简单说几个:比如:比如缓冲区,一个大文件文件要分段发送,分段接受。比如:文件长度设置有问题。服务器端接受到数据后和你的文件长度参数不符等等 这个是出错的代码 System.out.println("开始创建远程文件..."); TelnetOutputStream os = ftpClient.put(remotefilename); System.out.println("远程文件创建成功。"); File file_in = new java.io.File(localfilename); FileInputStream is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); os.flush();// try// {// Thread.currentThread().sleep(1000);// }// catch (InterruptedException e)// {// // TODO Auto-generated catch block// e.printStackTrace();// } } System.out.println("upload success"); if(is!=null) is.close(); if(os!=null) os.close();如果加上上面注释掉的sleep函数又可以了,去掉就不行了。 很好理解的嘛,你的flush是需要时间的,这个取决于你的网络传递速度。如果去掉了sleep,则很快进入下一次write了。你可以把flush放到while外面试试。另外,应该用一个缓冲流的。 把flush放到while外面还是不行,缓冲流是什么呢 你把flush那一行代码去掉试试 while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); os.flush(); } os.flush();这样不行 while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c);// os.flush(); } os.flush();这样有的可以,有的不行。 while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c);// os.flush(); }// os.flush();这样也是有的可以,有的不行。 不是网速的问题,是在局域网的。这个暂时解决了,在传完文件之后,在执行一个FTP的cd指令,切换目录到根目录,就没有问题了。感觉是和关闭连接和传输的时序有关。 Swing JTabbedPane 布局问题 写出如下代码的运行结果并给出解释 关于数据库连接池出错问题--DBPool_v4.8.3.jar java出错的问题? MySql是不是不支持中文呀? JAVA程序获得用户输入整型数据的问题---50分 SSL问题,请求援助! 如何去掉JFileChooser对话框中的“所有文件”过滤器 有点不明白 如何用java读、写串口? java 入门程序 一个小问题 split分割字符串
不大明白,给你一段代码看看有没有帮助//ftp建立连接
FtpClient ftpClient=new FtpClient();
ftpClient.openServer("ftp-ip",21);
ftpClient.login("用户名","密码");
ftpClient.binary();
ftpClient.cd("/test");//进入根目录下的某一个目录
//删除
ftpClient.ascii();
ftpClient.sendServer("DELE test.xml \r\n");
ftpClient.readServerResponse();
ftpClient.binary();
//ftp上传本机文件
InputStream streamHtml = new BufferedInputStream(new FileInputStream(new File("D:/xxx.txt")), 10240);
TelnetOutputStream tos = ftpClient.put("test.xml");
int readLength = 0;
byte[] buf = new byte[1024];
while ((readLength = streamHtml.read(buf, 0, 1024)) != -1) {
tos.write(buf, 0, readLength);
}
streamHtml.close();
tos.close();
//ftp下载
TelnetInputStream tis = ftpClient.get("tet.txt");
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File("D:/test.txt")));
int readLength = 0;
byte[] buf = new byte[1024];
while ((readLength = tis.read(buf, 0, 1024)) != -1) {
os.write(buf, 0, readLength);
}
tis.close();
os.close();
//关闭ftp
ftpClient.closeServer();
出现传输文件0字节的问题,有很多,简单说几个:
比如:比如缓冲区,一个大文件文件要分段发送,分段接受。
比如:文件长度设置有问题。服务器端接受到数据后和你的文件长度参数不符等等
System.out.println("开始创建远程文件...");
TelnetOutputStream os = ftpClient.put(remotefilename);
System.out.println("远程文件创建成功。");
File file_in = new java.io.File(localfilename);
FileInputStream is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1)
{
os.write(bytes, 0, c);
os.flush();
// try
// {
// Thread.currentThread().sleep(1000);
// }
// catch (InterruptedException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
System.out.println("upload success");
if(is!=null)
is.close();
if(os!=null)
os.close();
如果加上上面注释掉的sleep函数又可以了,去掉就不行了。
如果去掉了sleep,则很快进入下一次write了。
你可以把flush放到while外面试试。另外,应该用一个缓冲流的。
把flush放到while外面还是不行,缓冲流是什么呢
{
os.write(bytes, 0, c);
os.flush();
}
os.flush();
这样不行 while ((c = is.read(bytes)) != -1)
{
os.write(bytes, 0, c);
// os.flush();
}
os.flush();
这样有的可以,有的不行。 while ((c = is.read(bytes)) != -1)
{
os.write(bytes, 0, c);
// os.flush();
}
// os.flush();
这样也是有的可以,有的不行。
这个暂时解决了,在传完文件之后,在执行一个FTP的cd指令,切换目录到根目录,就没有问题了。
感觉是和关闭连接和传输的时序有关。