java ftp上传不稳定的问题

zhongyj2004 2010-05-19 02:02:55
使用sun.net.ftp.FtpClient;类的客户端上传文件到FTP服务器
如果执行运行程序,上传后的文件大小是0
如果DEBUG程序,一步一步执行上传后的文件没有问题
这是怎么回事呢。
...全文
451 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongyj2004 2010-05-20
  • 打赏
  • 举报
回复
不是网速的问题,是在局域网的。
这个暂时解决了,在传完文件之后,在执行一个FTP的cd指令,切换目录到根目录,就没有问题了。
感觉是和关闭连接和传输的时序有关。
bayougeng 2010-05-20
  • 打赏
  • 举报
回复
也许你可以试一试大文件和小文件,如果小文件都没问题,而大文件有问题的话,那我觉得还是网速的问题。
zhongyj2004 2010-05-20
  • 打赏
  • 举报
回复
			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();

这样也是有的可以,有的不行。


zhuxibang 2010-05-20
  • 打赏
  • 举报
回复
你把flush那一行代码去掉试试
zhongyj2004 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bayougeng 的回复:]
很好理解的嘛,你的flush是需要时间的,这个取决于你的网络传递速度。
如果去掉了sleep,则很快进入下一次write了。
你可以把flush放到while外面试试。另外,应该用一个缓冲流的。
[/Quote]

把flush放到while外面还是不行,缓冲流是什么呢
bayougeng 2010-05-20
  • 打赏
  • 举报
回复
很好理解的嘛,你的flush是需要时间的,这个取决于你的网络传递速度。
如果去掉了sleep,则很快进入下一次write了。
你可以把flush放到while外面试试。另外,应该用一个缓冲流的。
zhongyj2004 2010-05-20
  • 打赏
  • 举报
回复
这个是出错的代码
			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函数又可以了,去掉就不行了。
stormagic 2010-05-19
  • 打赏
  • 举报
回复
你可能对底层的socket通讯不是很了解。
出现传输文件0字节的问题,有很多,简单说几个:
比如:比如缓冲区,一个大文件文件要分段发送,分段接受。
比如:文件长度设置有问题。服务器端接受到数据后和你的文件长度参数不符

等等
xccyg 2010-05-19
  • 打赏
  • 举报
回复
上点相关代码看看吧。
bayougeng 2010-05-19
  • 打赏
  • 举报
回复
可能是因为缓冲的关系。
上代码看看
zhongyj2004 2010-05-19
  • 打赏
  • 举报
回复
应该不是的,因为我已经看到这个文件了,只是文件大小为0;另外我用相同的用户用FTP工具上传文件是可以的。
[Quote=引用 2 楼 struggle1984 的回复:]
这种一般是权限问题了 看看你服务器权限的设置
[/Quote]
struggle1984 2010-05-19
  • 打赏
  • 举报
回复
这种一般是权限问题了 看看你服务器权限的设置
zhuxibang 2010-05-19
  • 打赏
  • 举报
回复

不大明白,给你一段代码看看有没有帮助

//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();

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧