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

时间:2016-07-25 15:36:38

标签: java escaping character special-characters

我有一个.doc文件,包含在ÐÏ之前的标题,所以我需要删除在ÐÏ之前存在的所有字符。

示例: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;

    }

但是,如果条件不满意,它不会在我的文件中写入任何内容作为第一个。请告知我该如何执行此操作。

1 个答案:

答案 0 :(得分:1)

使用char c = (char)b;

时出错

请参阅byte-and-char-conversion-in-java

你会看到

  

Java中的一个字符是一个Unicode代码单元,被视为一个   无符号数。

以你的案例为例。字符'Ï'的字节二进制表示是11001111。 请参阅oracle tutorial

  

byte:字节数据类型是8位有符号二进制补码整数。   它的最小值为-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();

        }
    }
}