我有一个文件,里面既包含ASCII文本,也包含二进制内容。我想提取文本,而不必解析二进制内容,因为二进制内容有180MB。我能否简单地提取文本以进行进一步操作...最好的方法是什么。
ASCII文本位于文件开头。
我有一个文件,里面既包含ASCII文本,也包含二进制内容。我想提取文本,而不必解析二进制内容,因为二进制内容有180MB。我能否简单地提取文本以进行进一步操作...最好的方法是什么。
ASCII文本位于文件开头。
有4个Java库可以读取FITS文件,点击这里查看:
Java
开发了一个Java FITS库,提供了高效的FITS图像和二进制表的I/O,至少对于Java而言。Java库支持所有基本的FITS格式和gzip压缩文件。包括支持访问数据子集,并且可以使用HIERARCH约定。
包括用于查看和编辑FITS文件的应用程序和小应用程序。还包括一个用于读写FITS数据的通用包。如果可用的话,它可以读取PGP加密文件。
jfits库支持FITS图像和ASCII和二进制表。支持关键字和数据的内联修改。
纯Java通用表I/O库,可以读取和写入FITS二进制表等其他表格式。它高效,并且可以提供比物理内存大得多的FITS表的快速顺序或随机读取访问。不支持FITS图像。
import java.io.*;
// ...
public static void main(String args[]) {
try {
FileInputStream f = new FileInputStream("object.bin");
DataInputStream d = new DataInputStream(f);
BufferedReader b = new BufferedReader(new InputStreamReader(d));
String s = "";
while ((s = b.readLine()) != "#END#") {
// ASCII contents parsed here.
System.out.println(s);
}
d.close();
} catch (Exception e) {
System.err.println("kablammo! " + e.getMessage());
}
}
编写一个方法,检查特定字符是否符合您的条件(这里,我已经涵盖了键盘上找到的字符)。一旦您遇到该方法返回false的字符,就知道您已经遇到了二进制。请注意,有效的ASCII字符也可能构成二进制的一部分,因此您可能最终会得到一些额外的字符。
static boolean isAsciiCharacter(char c) {
return (c >= ' ' && c <= '~') ||
c == '\n' ||
c == '\r';
}
我不知道有没有Java类可以读取ASCII字符并忽略其余部分,但在这里我能想到的最简单的方法是使用strings
实用程序(假设您正在使用基于Unix的系统)。
概要 strings [ - ] [ -a ] [ -o ] [ -t format ] [ -number ] [ -n number ] [--] [file ...]
描述 Strings会在二进制文件或标准输入中查找ASCII字符串。 Strings对于识别随机对象文件和许多其他事物非常有用。字符串是以换行符或空字符结尾的4个(默认值)或更多打印字符序列。除非给出了-标志,否则strings将查找对象文件的所有部分,除了(__TEXT,__text)部分。如果未指定文件,则读取标准输入。
然后,您可以将输出导入另一个文件并对其进行任何操作。
编辑:有了额外的信息,所有ASCII字符都在开头,这样就更容易通过编程方式提取文本;尽管如此,这仍然比编写代码要快。一个FITS文件的前2880个字节是ASCII头数据,表示36个80列的“卡片图像”。没有行终止符号,只有一个36x80的ASCII数组,必要时用空格填充。在二进制数据之前可能会有额外的2880字节的ASCII头;您需要解析第一组头来知道期望多少ASCII。
但我完全赞成Oscar Reyes的建议,使用现有的软件包来解码FITS文件!他提到的两个软件包都由NASA的戈达德太空飞行中心托管,他们也负责维护FITS格式。这是您可以得到的最权威的来源。