解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個文件無法傳輸多個問題
被一個朋友問到一個關于sokcet文件傳輸?shù)膯栴}
他發(fā)現(xiàn)他寫的代碼只能發(fā)送一次文件,沒辦法發(fā)送第二次,或者說發(fā)送第二次的時候服務端就接收不到了。
部分代碼
// 開始接收文件
byte[] bytes = new byte[1024];
//byte[] bytes = new byte[dis.available()];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
System.out.println(bytes.length);
fos.write(bytes, 0, length);
fos.flush();
}
System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");我給他調試的時候發(fā)現(xiàn)確確實實發(fā)送第一次文件后就就一直阻塞在while循環(huán)里了,出不來。
本來傳輸完第一次的文件后應該有打印“======== 文件接收成功 [File。。。。。。”
這些信息,但是實際上沒有,而且也不報錯。
調試的時候打斷點也是走著走著斷點就不見了,要說他是阻塞也不像是阻塞,因為如果是阻塞的話起碼斷點是會存在的只是無法往下運行了而已,但是他這個調試就是直接斷點就消失了,我也懵了。
后來查資料才發(fā)現(xiàn)原來只要客戶端的DataOutputStream不close掉,那么服務端的DataInputStream read就永遠不等于-1。
即使文件的數(shù)據已經傳完了,DataInputStream依舊會等著客戶端DataOutputStream再傳數(shù)據過來。
最后只能通過判斷文件的的大小來確認文件是否已經傳輸完成。
解決代碼代碼
//dis就是DataInputStream
String fileName = dis.readUTF();//文件名字
long fileLength = dis.readLong();//文件長度
File directory = new File(savepath);
if(!directory.exists()) {
directory.mkdir();
}
File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
fos = new FileOutputStream(file);
// 開始接收文件
byte[] bytes = new byte[1024];
//byte[] bytes = new byte[dis.available()];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
System.out.println(bytes.length);
//fos就是FileOutputStream
fos.write(bytes, 0, length);
fos.flush();
//*************關鍵的一步**************//
if(fileLength == file.length()) break;
//***************************//
}
System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
JavaWeb實戰(zhàn)之開發(fā)網上購物系統(tǒng)(超詳細)
這篇文章主要介紹了JavaWeb實戰(zhàn)之開發(fā)網上購物系統(tǒng)(超詳細),文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
SpringBoot注解@MapperScan的實現(xiàn)
@MapperScan是MyBatis和MyBatis-Plus提供的SpringBoot注解,用于自動掃描并注冊?Mapper?接口,使其能夠被?Spring?容器管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-05-05

