2013-04-15 31 views
0

好吧,我從網絡下面的代碼,它確實工作:的Java啪文件傳輸

@Override 
public void fileTransferRequest(FileTransferRequest request) { 
    // Check to see if the request should be accepted 

    final IncomingFileTransfer transfer = request.accept(); 
    runnningFileTransfer = transfer; 
    try 
    { 
     final File file = new File("/Users/Akku/Downloads/in2" + request.getFileName()); 
     transfer.recieveFile(file); 
     t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       transfer.recieveFile(file); 
       System.out.println("DONE?"); 
      } catch (XMPPException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     }); 
     t.run(); 

此代碼運行,並在我的10MB測試文件的情況下,它需要相當多的時間。可悲的是,我需要知道轉讓是否完成或進展如何。有趣地,我也有這部分(這只是睡覺,進取檢查)從網頁,當我將其追加,文件傳輸不起作用了:

 while(!transfer.isDone()) 
     { 
      if(transfer.getStatus().equals(Status.error)) 
      { 
       System.out.println("ERROR"+transfer.getError() + " EX: " + transfer.getException()); 
      } 
      else 
      { 
       System.out.println("Written: "+transfer.getAmountWritten()); 
       System.out.println("STATUS"+transfer.getStatus()); 
       System.out.println("PROGRESS"+transfer.getProgress()); 
      } 
     try 
     { 
       Thread.sleep(10000); 
       System.out.println("Waiting..."); 
      } 
      catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 
     } 

任何暗示爲什麼會發生?我想這是Java的東西,因爲上面的代碼片段完美無瑕。

回答

0

工程案件應該拋出異常。您在傳輸對象上調用兩次接收。第二次調用在嘗試再次創建文件時應產生異常。第二次調用和線程創建在這種情況下不是必需的,因爲transfer()方法是異步的並且具有它自己的內部線程。

很難說爲什麼它不適用於你的狀態檢查,因爲你沒有顯示你在做什麼檢查。我懷疑是你在讀線程上調用它,從而阻塞了新數據包的讀取。檢查傳輸狀態的循環應該在其自己的線程中運行。