2015-04-07 21 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. 關閉文件。