2012-11-30 206 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

谢谢,我也有这个想法,但似乎比使用布尔值更多的性能 –