我是一个通用的非专业纯文本文件提取器。
首先在人们对Apache Tika的看法之前 - 我的回答是它只支持一些流行的二进制文件格式,如Office,BMP等。
回到问题 - 许多二进制文件中嵌入了文本字符串,我想在没有二进制字节噪声的情况下提取它。这意味着它可以在exes中找到简单的文本字符串序列,依此类推,结果只包含ascii字。我试过谷歌搜索,但找不到任何这样做。我的基本想法是,如果TIKA没有处理文件,这个简单的二进制文件处理程序会尽力找到这些文本字符串。
答案 0 :(得分:0)
以下代码过滤不可打印的ASCII字符。
package sandbox;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author yan-cheng.cheok
*/
public class Main {
// Returns the contents of the file in a byte array.
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
// Get the size of the file
long length = file.length();
// You cannot create an array using a long type.
// It needs to be an int type.
// Before converting to an int type, check
// to ensure that file is not larger than Integer.MAX_VALUE.
if (length > Integer.MAX_VALUE) {
// File is too large
}
// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}
// Close the input stream and return bytes
is.close();
return bytes;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
File f = new File("c:\\jstock.exe");
byte[] bs = getBytesFromFile(f);
List<Byte> list = new ArrayList<Byte>();
for (byte b : bs) {
if (b >= 0) {
// Printable ASCII code.
list.add(b);
}
}
byte[] output = new byte[list.size()];
for (int i = 0, size = list.size(); i < size; i++) {
output[i] = list.get(i);
}
System.out.println(new String(output));
}
}
答案 1 :(得分:0)
我最后编写了我的代码类来解决我的问题。
重要功能/注意事项。