0

我有一个可以保存一些文件的应用程序。当用户关闭应用程序时,如果用户尚未将文件保存为当前文件,我想要求保存。
如果我不够清楚,我想以某种方式检查文件是否已从上次保存中修改。
我考虑过创建一个Boolean变量,true如果文件被保存,然后在false每次以任何方式修改文件(写入或删除文件中的元素)时返回。
我的问题是是否有更简单的解决方案来做到这一点。在我看来,将变量设置为很多无用的工作true每次文件更改时(对我和机器都有效),我不希望这样,因为我有一个相当广泛和复杂的应用程序,并且文件更改可能经常发生。

回答后编辑:谢谢大家,这真的很有帮助。最终我意识到我需要一个在我对文件所做的大多数更改中都需要的函数,所以我不需要做太多工作。其他的变化不是很多,所以我只是对Boolean.
再次感谢

4

6 回答 6

4

如果更改不太可能经常发生,那么设置布尔变量的每次更改开销肯定也可以忽略不计。

理想情况下,您将在您的代码中有一个点,所有更改都必须经过(例如您处理撤消/重做的位置),并且您可以将布尔变量更新代码放在那里。

于 2012-11-30T14:03:15.767 回答
2

另一种方法是读取文件并根据程序的内容检查它的内容,这似乎会产生不必要的开销。或者节省保存某些内容的时间,并检查此后是否进行了更改。

考虑到我认为您的布尔解决方案是迄今为止最有效的。

于 2012-11-30T14:06:13.540 回答
1

我的建议是让FileWriter类记住文件的状态(已保存/已更改),因此您只需要使用此编写器,而无需在每次写入文件时处理布尔操作。

于 2012-11-30T14:06:00.307 回答
0

如果文档不是很大,您可以在后台将其副本与用户可以编辑的副本分开,然后在应用程序关闭之前比较两者。

于 2012-11-30T14:04:38.090 回答
0

布尔变量是最好的主意。

boolean isDataChanged

很好读,不会混淆代码。

于 2012-11-30T14:07:58.170 回答
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

当您想保存文件并将其与您现有的文件进行比较时,您只需创建当前文件的文件对象;)

于 2012-11-30T14:21:46.853 回答