【问题标题】:How to output binary data to a file in Java?如何将二进制数据输出到Java中的文件?
【发布时间】:2011-08-08 11:40:08
【问题描述】:

我正在尝试将数据以二进制格式写入文件以进行压缩。数据完全由浮点组成,因此我决定将数据量化为 0 到 65535 之间的整数,以便可以将数据写入两位无符号整数并最终节省空间。但是,我需要将该量化数据输出到二进制文件,而不是人类可读的 Ascii。

这就是我现在正在做的事情

@param outputFile 包含已量化数据的文件,作为 .txt 文件中的字符串

public void generateBinaryRioFile(String materialLibrary,
        String outputFile, String group, String mtlAux) {

    try {

        // Create file
        FileWriter fileStream = new FileWriter(outputFile);
        try {

            BufferedReader br = new BufferedReader(new FileReader(new File(
                    "idx.txt")));

            while ((line = br.readLine()) != null) {
                writer.write(line + "\n");
            }
            try {
                br.close();

            } catch (FileNotFoundException e) {
                e.getMessage();
            } catch (IOException e) {
                e.printStackTrace();
            }           BufferedWriter writer = new BufferedWriter(fileStream);

但是,它以人类可读字符串的形式写入文件。我需要把它写成二进制数据。在 Java 中如何做到这一点?

【问题讨论】:

  • 你背后的动机是什么?
  • 显示一些你到目前为止所做的代码,以便我可以帮助你
  • @Kit Ho 我的老板告诉我这样做的动机是为了节省文件空间,所以与其将多个 ascii 字符写入文件会增加文件大小,不如将其写入二进制文件以节省空间.该文件将通过互联网发送,数据将用于在 webgl 中生成 3d 模型。我们希望模型尽快加载
  • @Talha Ahmed Khan 我刚刚用一些代码更新了它
  • 我猜你得到了你的答案,如果不是你想要的,请告诉我

标签: java binary-data


【解决方案1】:

也许这个片段会有所帮助。

 int i = 42;
 DataOutputStream os = new DataOutputStream(new FileOutputStream("C:\\binout.dat"));
 os.writeInt(i);
 os.close();

【讨论】:

  • 如果你只想写 2 字节使用writeShort()
  • @Ratchet 怪胎 Java 的短范围从 -32,768 到 32,767(根据 download.oracle.com/javase/tutorial/java/nutsandbolts/…)。如果 OP 使用 Java short (这是一个好主意,谢谢),他应该在写入前减去 32,768,并在阅读后加上 32,768。
  • @rajah9 谢谢!这么棒的想法!这将减少相当数量的文件大小。谢谢大家,感谢所有帮助:-)
  • 为数字 42 点赞 :)
【解决方案2】:

DataOutputStream 呢?您可以编写包含 2 个数据整数的 int。

DataOutputStream dos = new DataOutputStream(new FileOutputStream(<path>));
ArrayList<Integer> list = new ArrayList<Integer>();
int sum;
for( int i = 0; i < list.size(); i++ ) {
    if(i%2!=0){
        sum |= list.get( i ).intValue()<<16;
        dos.writeInt( sum );
    } else {
        sum = list.get( i ).intValue();
    }
}

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多