如何判斷ftp上傳檔案完畢
阿新 • • 發佈:2019-01-27
問題描述:ftp上傳檔案的時候總是先建立了檔案,然後再上傳。如果此時程式讀取檔案可能就讀取一部分不完成的資料。那麼怎麼解決才合理呢
方案1.上傳檔案的客戶端先建立一個臨時檔名稱,然後上傳完畢再重新命名。而重新命名是修改登錄檔所以不會產生過程中資料不一致的問題
方案2.在ftp客戶端上傳檔案不由我們控制的時候,不能實施第一方案怎麼辦呢。開啟檔案在檔案尾追加一個標識內容,關閉開啟檔案,然後在重新開啟檔案判斷追加寫入的內容時候成功,如果不成功,說明檔案還在被佔用,如果成功了就說明ftp上傳結束了。這裡感謝公司同事小蘇為此方案做出的貢獻。
這裡解釋一下,經過多次實驗得知ftp客戶端上傳檔案的時候,使用程式在此檔案上追加不上內容,而且java程式碼不報錯,所以才有了方案2.
java程式碼如下:
package com.ehl.tvc.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.apache.commons.io.IOUtils; public class FileUtil { private static String endTag = "end"; /** * 判斷檔案是否寫入內容完畢,如果完畢返回true,反之false * @param f * @return */ public static boolean checkIniTransfered(File f){ OutputStream output = null; try { output = new FileOutputStream(f, true); output.write((endTag+"\n").getBytes()); output.flush(); output.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { IOUtils.closeQuietly(output); } InputStream input =null; try { input = new FileInputStream(f); List<String> list = IOUtils.readLines(input); if(list.size()>0){ String endstr =list.get(list.size()-1); if(endTag.equals(endstr)){ return true; } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { IOUtils.closeQuietly(input); } return false; } }