2012-11-30 254 views
0

我有一個可以保存一些文件的應用程序。當用戶關閉應用程序時,我想要求保存如果用戶還沒有保存文件,因爲它是當前。
如果我不夠清楚,我不知何故想檢查文件是否已從上次保存修改。
我曾考慮製作一個Boolean變量,如果文件被保存,則變爲true,然後在每次以任何方式修改文件(寫入或刪除文件中的元素)時都會回到false
我的問題是如果有更簡單的解決方案來做到這一點。在我看來,每次文件更改時都會將變量設置爲true(對於我和機器都是一樣的),我做了很多無用的工作,並且我不想要這樣,因爲我有一個相當寬泛和複雜的應用程序,文件可能經常發生。檢查文件是否已保存java

編輯答案後: 謝謝大家,這真的很有幫助。最終我意識到我需要一個在我對文件進行的大多數修改中都需要的功能,所以我不需要太多工作。其他變化不是很多,所以我只是對Boolean進行了更改。
再次感謝

+1

對我來說,似乎是一個布爾值是最好的解決方案。事實上,你有一個廣泛和複雜的應用程序,也許有些事情你可以做(​​重構代碼)來簡化它? –

+0

這是一個3d應用程序,所以它是合法的,有一個相當廣泛和複雜的應用程序 –

+0

是的的確,但添加一個簡單的布爾值不應該太難。即使你有一個複雜的應用程序,你仍然可以擁有乾淨的代碼。 –

回答

4

如果更改不可能經常發生,那麼設置布爾變量的每更改開銷也可以忽略不計。

理想情況下,您需要在代碼中指出所有更改都必須經過(例如,處理撤銷/重做時),並且可以將布爾變量更新代碼放在那裏。

+0

它很可能經常發生更改,至少1次改變/ 10秒。我的觀點是對我來說這也是一項長期工作,因爲可能出現很多不同的可能變化 –

+0

每10秒設置一次布爾值對性能幾乎沒有影響。正如我所說的,您應該有一個核心代碼片段來控制您對內容的所有更改。無論如何,您都需要它來進行撤銷/重做/內容驗證,因此重新分解代碼的投資一定會得到回報。 – biziclop

+0

此外,擁有這個布爾狀態變量將允許您顯示用戶希望查看文件是否已更改的文件名旁邊常見的'* *。 – biziclop

0

如果文檔不是很大,可以將其副本保留在與用戶可以編輯的場景不同的場景中,然後在應用程序關閉之前比較兩者。

+0

可能是相當大的文件,它會存儲3d對象 –

1

我的建議是讓FileWriter類記住文件的狀態(保存/更改),所以你只需要使用這個編寫器,並且每次寫入文件時都不需要處理布爾操作。

+0

我喜歡這個想法,我想我會試試 –

2

另一種方法是讀取文件並根據程序內容檢查它的內容,這似乎會產生不必要的開銷。或者保存已保存內容的時間,並檢查是否有更改。

考慮到我認爲您的布爾解決方案迄今爲止效率最高。

+0

它將+1保存時間檢查,但-1 downvote文件內容檢查,所以它停留中性。 – AlexWien

0

布爾變量是最好的想法。

boolean isDataChanged 

很高興閱讀,而且不會混淆代碼。

0

我剛剛發現這一點位二進制你對谷歌比較法,沒有答應,如果它的工作原理;)

/** 
* Compare binary files. Both files must be files (not directories) and exist. 
* 
* @param first - first file 
* @param second - second file 
* @return boolean - true if files are binery equal 
* @throws IOException - error in function 
*/ 
public boolean isFileBinaryEqual(
    File first, 
    File second 
) throws IOException 
{ 
    // TODO: Test: Missing test 
    boolean retval = false; 

    if ((first.exists()) && (second.exists()) 
    && (first.isFile()) && (second.isFile())) 
    { 
    if (first.getCanonicalPath().equals(second.getCanonicalPath())) 
    { 
     retval = true; 
    } 
    else 
    { 
     FileInputStream firstInput = null; 
     FileInputStream secondInput = null; 
     BufferedInputStream bufFirstInput = null; 
     BufferedInputStream bufSecondInput = null; 

     try 
     {    
      firstInput = new FileInputStream(first); 
      secondInput = new FileInputStream(second); 
      bufFirstInput = new BufferedInputStream(firstInput, BUFFER_SIZE); 
      bufSecondInput = new BufferedInputStream(secondInput, BUFFER_SIZE); 

      int firstByte; 
      int secondByte; 

      while (true) 
      { 
       firstByte = bufFirstInput.read(); 
       secondByte = bufSecondInput.read(); 
       if (firstByte != secondByte) 
       { 
       break; 
       } 
       if ((firstByte < 0) && (secondByte < 0)) 
       { 
       retval = true; 
       break; 
       } 
      } 
     } 
     finally 
     { 
      try 
      { 
       if (bufFirstInput != null) 
       { 
       bufFirstInput.close(); 
       } 
      } 
      finally 
      { 
       if (bufSecondInput != null) 
       { 
       bufSecondInput.close(); 
       } 
      } 
     } 
    } 
    } 

    return retval; 
} 

來源:http://www.java2s.com/Code/Java/File-Input-Output/Comparebinaryfiles.htm

你只需要創建currentFile的File對象,當你想保存你的文件,並將它與你現有的文件進行比較;)

+0

謝謝,我也有這個想法,但似乎比使用布爾值更多的性能 –