『壹』 java中的」斷點「是什麼意思
這個不太難吧?
假設a給b傳文件f(1024位元組)。第一次b接收了512位元組,那麼第二次連接a就應該從513位元組開始傳輸。
也就是說,在第二次傳輸時,b要提供「我要從513位元組開始傳送文件f」的信息,然後a使用fileinputstream構建輸入流讀取本地文件,使用skip(512)方法跳過文件f的前512位元組再傳送文件,之後b將數據追加(append)到先前接收的文件末尾即可。
進一步考慮,如果要實現多線程傳送,即分塊傳輸,也同樣的道理。假如b要求分作兩塊同時傳輸,那麼a啟動兩個線程,一個從513位元組讀到768位元組(工256位元組),第二個線程從769位元組到1024位元組即可。
如果你要從網路上下載文件,就是說a方不是你實現的,那麼你要先確認a方支不支持斷電續傳功能(http1.1),然後你查閱下http1.1協議,在http1.1版本里,可以通過設置請求包頭某個欄位的信息(使用urlconnection創建連接並使用setrequestproperty(stringkey,stringvalue)方法設置)從而精確讀取文件的某一段數據的。注意,基於http斷點續傳的關鍵是1.1版本,1.0版本是不支持的。
補充:
嗯,查到了,是設置range屬性,即setrequestproperty("range","bytes=513-1024").你可以使用迅雷下載某個文件,然後從」線程信息「中就可以看到這個http1.1斷點續傳的所有行為信息了。
『貳』 java 函數設置一個斷點,調試時結果一直等待進不去
一、在瀏覽器中F12打開調試,進入NetWork選項下,如果你請求能夠發送成功則,有請求的顯示,如果請求失敗則該調試中不會有請求展示出來。如圖:
二、看你後台打的斷點,如果斷點是一個小圓點則標示請求未過去,仔細檢查你的請求路徑、請求代碼寫的是不是有問題吧。如果斷點是一個帶尾巴的圓點,表示請求能進去,重新編譯項目順便清一下Tomcat下項目緩存吧
最後這種小問題不建議你一直浪費時間,還不如重新寫一遍快呢
『叄』 java ftp上傳時斷網,文件損壞
以二進制流上傳,然後實現斷點續傳。
/**
* 上傳文件到FTP伺服器,支持斷點續傳
* @param local 本地文件名稱,絕對路徑
* @param remote 遠程文件路徑,使用/home/directory1/subdirectory/file.ext 按照Linux上的路徑指定方式,支持多級目錄嵌套,支持遞歸創建不存在的目錄結構
* @return 上傳結果
* @throws IOException
*/
public UploadStatus upload(String local,String remote) throws IOException{
FTPClient ftpClient = new FTPClient();
//設置PassiveMode傳輸
ftpClient.enterLocalPassiveMode();
//設置以二進制流的方式傳輸
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
UploadStatus result;
//對遠程目錄的處理
String remoteFileName = remote;
if(remote.contains("/")){
remoteFileName = remote.substring(remote.lastIndexOf("/")+1);
String directory = remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){
//如果遠程目錄不存在,則遞歸創建遠程伺服器目錄
int start=0;
int end = 0;
if(directory.startsWith("/")){
start = 1;
}else{
start = 0;
}
end = directory.indexOf("/",start);
while(true){
String subDirectory = remote.substring(start,end);
if(!ftpClient.changeWorkingDirectory(subDirectory)){
if(ftpClient.makeDirectory(subDirectory)){
ftpClient.changeWorkingDirectory(subDirectory);
}else {
System.out.println("創建目錄失敗");
return UploadStatus.Create_Directory_Fail;
}
}
start = end + 1;
end = directory.indexOf("/",start);
//檢查所有目錄是否創建完畢
if(end <= start){
break;
}
}
}
}
//檢查遠程是否存在文件
FTPFile[] files = ftpClient.listFiles(remoteFileName);
if(files.length == 1){
long remoteSize = files[0].getSize();
File f = new File(local);
long localSize = f.length();
if(remoteSize==localSize){
return UploadStatus.File_Exits;
}else if(remoteSize > localSize){
return UploadStatus.Remote_Bigger_Local;
}
//嘗試移動文件內讀取指針,實現斷點續傳
InputStream is = new FileInputStream(f);
if(is.skip(remoteSize)==remoteSize){
ftpClient.setRestartOffset(remoteSize);
if(ftpClient.storeFile(remote, is)){
return UploadStatus.Upload_From_Break_Success;
}
}
//如果斷點續傳沒有成功,則刪除伺服器上文件,重新上傳
if(!ftpClient.deleteFile(remoteFileName)){
return UploadStatus.Delete_Remote_Faild;
}
is = new FileInputStream(f);
if(ftpClient.storeFile(remote, is)){
result = UploadStatus.Upload_New_File_Success;
}else{
result = UploadStatus.Upload_New_File_Failed;
}
is.close();
}else {
InputStream is = new FileInputStream(local);
if(ftpClient.storeFile(remoteFileName, is)){
result = UploadStatus.Upload_New_File_Success;
}else{
result = UploadStatus.Upload_New_File_Failed;
}
is.close();
}
return result;
}