2016-07-25 84 views
1

我有一個.doc文件,其中包含頭部之前的ÐÏ,所以我需要刪除所有在ÐÏ前存在的字符。如何使用java識別文件中的特殊字符

實施例:asdfasdfasdfasfasdfasfÐÏ9asjdfkj

我已經使用了下面的代碼。

InputStream is = new FileInputStream("D:\\Users\\Vinoth\\workspace\\Testing\\Testing_2.doc"); 
    DataInputStream dis = new DataInputStream(is); 
    OutputStream os = new FileOutputStream("D:\\Users\\Vinoth\\workspace\\Testing\\Testing_3.doc"); 
    DataOutputStream dos = new DataOutputStream(os); 
    byte[] buff = new byte[dis.available()]; 
    dis.readFully(buff); 
    char temp = 0; 
    boolean start = false; 
    try{ 
    for(byte b:buff){ 
     char c = (char)b; 
     if(temp == 'Ð' && c == 'Ï'){ 
      start = true; 
     } 
     if(start){ 
      dos.write(c); 
     } 
     temp = c; 

    } 

但是,如果條件沒有得到滿足,它不會在我的文件中寫入任何內容。請告訴我如何執行此操作。

+0

我只需要刪除「ÐÏ」之前的字符,並且doc的內容仍然保持不變。我已經嘗試過這種方法,只需讀取和寫入,沒有任何變化,doc文件是完美的。 – Vinoth

回答

1

也有一些是錯誤的,當你使用char c = (char)b;

參考byte-and-char-conversion-in-java

你會看到

Java中的字符是一個Unicode代碼單元,被視爲 無符號數。

以您的案例爲例。字符「I」的字節的二進制表現爲11001111. 參考oracle tutorial

字節:字節的數據類型是一個8位有符號二進制補碼整數。 它的最小值爲-128,最大值爲127(包括)。

所以字節的值是-49。但是,對於Unicode使用,11001111應該被解釋爲無符號字節,實際上它應該是207。

int i = b & 0xff; 

將得到二進制表示的無符號字節值。

您可以修改您的代碼,如下所示。爲了便於調試,我更改了文件路徑和文件格式。我不確定是否.doc是一個問題,但您的代碼本身有我實際提到的錯誤。

import java.io.*; 

public class Test { 
    public static void main(String args[]){ 
     InputStream is; 
     try { 
      is = new FileInputStream("Testing_2.txt"); 
      DataInputStream dis = new DataInputStream(is); 
      OutputStream os = new FileOutputStream("Testing_3.txt"); 
      DataOutputStream dos = new DataOutputStream(os); 
      byte[] buff = new byte[dis.available()]; 
      dis.readFully(buff); 
      char temp = 0; 
      boolean start = false; 
      for(byte b:buff){ 
       int i = b & 0xff; 
       char c = (char)i; 
       if(temp == 'Ð' && c == 'Ï'){ 
        start = true; 
       } 
       if(start){ 
        dos.write(c); 
       } 
       temp = c; 

      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 
    } 
}