2015-04-07 61 views
1

我正在处理由EOF字符未正确终止的文件导致的问题。确定文件是否以EOF字符正确结束

如何检测文件是否包含正确的EOF,并且正确如果在Java/Scala中不存在,请添加它?

+1

您必须尝试过某些东西。 – 2015-04-07 10:42:12

+3

通常情况下,文件不会以任何EOF字符结尾,实际上没有字符标记文件的结尾,您在这里遇到困惑。您可以用十六进制编辑器打开文件,看看是否有任何“EOF”字符;你会发现没有。 – m0skit0

+0

你不能只读该文件的最后一个字节,并检查它是什么?但是,我不认为文件使用EOF字符标记结束 - 这通常是控制台的东西。 – Dan

回答

0

我正在处理由EOF字符未正确终止的文件引起的问题。

其实,我怀疑那是真的。关于我的头顶,我想不出任何需要使用EOF字符终止文件的主流操作系统。 (This article解释了“EOF字符”的神话,以及为什么^ Z或^ D都不是EOF字符。是的,当通过控制台读取用户输入流时,某些shell将其中一个或另一个解释为EOF“标记”是一种特殊情况...并且您的应用程序在读取流时肯定不会看到^ Z或^ D)。

您可能已将代码编入期望某种EOF字符。如果你有,那么最好的解决方案可能是修复应用程序。 (我想不出设计应用程序以这种方式工作的好理由......)

这也有可能是你真正的问题是别的。例如,您可能有文件的最后一行不能以可识别的行尾序列结尾。这当然会导致一些经典的Linux/Unix工具出现问题。


为了完整起见,以下是您提出的问题的答案。

如何检测文件是否包含正确的EOF,并在Java/Scala中不存在时正确添加它?

判断文件是否不以特定字符(例如^ Z)结尾的方法是简单读取文件的最后一个字符并对其进行测试。例如,在Java(未测试):

import java.io.*; 

public class TestForArcaneEOF { 
    public static void main(String[] args) throws IOException { 
     Reader reader; 
     if (args.length == 0) { 
      reader = new InputStreamReader(System.in); 
     } else { 
      reader = new FileReader(args[0]); 
     } 
     reader = new BufferedReader(reader); 
     int last = 0; 
     int ch; 
     while ((ch = reader.read()) != -1) { 
      last = ch; 
     } 
     if (last == 0x1a) { 
      System.out.println("Ends with ^Z"); 
     } else { 
      System.out.println("Doesn't end with ^Z"); 
     } 
    } 
} 

添加在文件末尾的字符(例如^ Z)是更简单:

  1. 打开在 “追加” 模式的文件。
  2. 写下字符。
  3. 关闭文件。