linux下Java文件操作、Ftp上传文件不完整问题-【急急急急急急急急急急急急】

sManAllen 2014-01-10 03:36:46
我需要实现以下功能:
1、现有原文件A,创建临时文件B,将A文件中的部分内容拷贝到B中;
2、将文件B上送到目标Ftp服务器。
注:Ftp实现使用的是Apache的commons-net-3.1.jar;

File fileSendSrc = null;
File fileSendTemp = null;
File fileTrans = null;

BufferedInputStream bisSendSrc = null;
BufferedOutputStream bosSendTemp = null;
FileInputStream fileInputStreamTrans = null;

try {
fileSendSrc = new File(AFilePath); // 原文件A
fileSendTemp = new File(BFilePath); // 临时文件B

if (!fileSendTemp.exists()) {
fileSendTemp.createNewFile();
}

// 将原文件部分内容拷贝到临时文件
bisSendSrc = new BufferedInputStream(new FileInputStream(fileSendSrc));
bosSendTemp = new BufferedOutputStream(new FileOutputStream(fileSendTemp));
byte[] db = new byte[newfileLength];
bisSendSrc.read(db, 0, newfileLength); //读取文件A的部分内容到缓冲区db
bosSendTemp.write(db); //将缓冲区db中的内容写入到文件B
Application.closeStream(bosSendTemp); // 关闭流
bosSendTemp = null;
Application.closeStream(bisSendSrc); // 关闭流
bisSendSrc = null;

// 2.将临时文件上传FTP
// 切换远方Ftp服务器路径
m_FtpClient.changeWorkingDirectory(uploadInfo.romotepath);

fileTrans = new File(tmpfilepath);
fileInputStreamTrans = new FileInputStream(fileTrans);
if (m_FtpClient.storeFile(currentFileName, fileInputStreamTrans)) {
// 如果文件上传成功
bUploadSuccess = true;
} else {
bUploadSuccess = false;
}
Application.ThreadSleep(1000);
} catch (Exception e) {
bUploadSuccess = false;
} finally {
// 关闭流
Application.closeStream(bisSendSrc);
bisSendSrc= null;
Application.closeStream(bosSendTemp);
bosSendTemp = null;
Application.closeStream(fileInputStreamTrans);
fileInputStreamTrans = null;
}

但是现在出现一个奇怪的现象:Ftp服务器有时接收到的文件内容不全,例如临时文件B本来是1000K,但Ftp服务器接收到的文件只有200K。该问题出现几率在1%左右。然后通过网络抓包工具发现,导致文件内容不全的原因是在执行代码:
m_FtpClient.storeFile(currentFileName,fileInputStreamTrans))
的时候,临时文件B的内容没有完全写入,就是只有200K,所以上送到Ftp服务端的文件就只有200K!等之后再去查看本地临时文件B,其内容却是完整的1000K!
问题就来了:
1、按照我之前的理解,执行该语句bosSendTemp.write(db)之后,应该是完整的将所有内容写入文件中该语句才返回的,但是好像事实并非如此。难道在执行该语句的时候,文件是异步写入的?但是我查看Java源代码,又找不到异步写入的痕迹(貌似最后文件的写入是调用了本地方法)。
2、Windows和Linux文件操作有很大差别,是否是这些差异引起的?

现在正急于解决该问题,不知道有没有人遇到这个问题~望不吝赐教~万分感激。
...全文
1665 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

我也是出现相同的问题,FTP上传图片时,在liunx环境下个别张的图片上传之后图片显示不全大小不同。然而再Windows服务器上就没出现过这个问题。代码如下:

teemai 2014-01-13
  • 打赏
  • 举报
回复
bosSendTemp.write(db); 之后flush下,再关闭流
  • 打赏
  • 举报
回复
看看是不是没有flush和close
johnlimn 2014-01-13
  • 打赏
  • 举报
回复
byte[] db = new byte[newfileLength]; bisSendSrc.read(db, 0, newfileLength); bosSendTemp.write(db); 应该循环的吧 while ((c = bisSendSrc.read(bytes)) != -1) { bosSendTemp.write(bytes, 0, c); }
fearlessMore 2014-01-13
  • 打赏
  • 举报
回复
引用 5 楼 u011764356 的回复:
[quote=引用 2 楼 fangmingshijie 的回复:] 看看是不是没有flush和close
需要我自己调用flush()函数吗,因为我看FilterOutputStream类close()中已经调用了flush()函数啊。Java代码如下:
public void close() throws IOException {
	try {
	  flush();
	} catch (IOException ignored) {
	}
	out.close();
    }
[/quote]out.close();也会抛出Exception的
sManAllen 2014-01-13
  • 打赏
  • 举报
回复
引用 2 楼 fangmingshijie 的回复:
看看是不是没有flush和close
需要我自己调用flush()函数吗,因为我看FilterOutputStream类close()中已经调用了flush()函数啊。Java代码如下:
public void close() throws IOException {
	try {
	  flush();
	} catch (IOException ignored) {
	}
	out.close();
    }
sManAllen 2014-01-13
  • 打赏
  • 举报
回复
引用 2 楼 fangmingshijie 的回复:
看看是不是没有flush和close
调用了close(),没有调用flush(),因为我看FilterOutputStream类的close()函数中已经调用了flush()函数,代码如下:
public void close() throws IOException {
	try {
	  flush();
	} catch (IOException ignored) {
	}
	out.close();
    }

62,628

社区成员

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

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