如何使用java识别文件中的特殊字符

问题描述:

我有一个.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

也有一些是错误的,当你使用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(); 

     } 
    } 
}