如何使用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;
}
但是,如果条件没有得到满足,它不会在我的文件中写入任何内容。请告诉我如何执行此操作。
答
也有一些是错误的,当你使用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();
}
}
}
我只需要删除“ÐÏ”之前的字符,并且doc的内容仍然保持不变。我已经尝试过这种方法,只需读取和写入,没有任何变化,doc文件是完美的。 – Vinoth