2016-07-25 22 views
1

ÐÏの前にcontainsヘッダーを含む.docファイルがあるので、ÐÏの前に存在するすべての文字を削除する必要があります。Javaを使用してファイル内の特殊文字を特定する方法

例:asdfasdfasdfasfasdfasfÐÏ9asjdfkj

Iは、以下のコードを使用しています。

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; 

    } 

ただし、最初のif条件が満たされていないため、ファイルには何も書き込まれません。どうすればいいのかアドバイスしてください。

+0

"ÐÏ"の前に文字を削除するだけで、ドキュメントの内容は変わりません。私はちょうど変更をせずに読んで、書き込むだけでこの方法を試しました.DOCファイルは完璧です。 – Vinoth

答えて

1

間違って何かあなたがbyte-and-char-conversion-in-java

を参照してくださいchar c = (char)b;

を使用するときは、

Javaで文字が 符号なしの数として扱われるUnicodeコード単位で表示されますがあります。

例を挙げてください。 「I」の文字のバイトのバイナリ表現は

バイト、11001111. はoracle tutorialを参照してくださいです:バイトデータ型は8ビットの2の補数の符号付き整数です。 最小値は-128、最大値は127(両端を含む)です。

したがって、byteの値は-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(); 

     } 
    } 
} 
関連する問題