【问题标题】:Read binary numbers from file and separate integers from longs/doubles从文件中读取二进制数并从长/双精度数中分离整数
【发布时间】:2017-08-12 12:13:58
【问题描述】:

在这个程序员中,我发现前 100 个中的素数。数字是 INT 格式,它们的总数是 DOUBLE 格式。我想读取那个文件,我只为 INT 数字做了,但我不知道怎么做它为双数。 代码如下:

package int1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.nio.channels.FileChannel;

public class int_upis {
public static void main(String[] args) {
    File a = new File("C:\\Users\\Jovan\\Desktop\\Pisem.txt");
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(a);
    } catch (Exception e) {

    }
    FileChannel ch = fos.getChannel();
    ByteBuffer bff = ByteBuffer.allocate(100);
    IntBuffer ibf = bff.asIntBuffer(); // Int type
    DoubleBuffer db = bff.asDoubleBuffer(); // Double type
    double p = 0;
    for (int i = 1; i <= 100; i++) {
        int t = 0;
        for (int j = 1; j <= i; j++) {
            if (i % j == 0) {
                t = t + 1;
            }

        }
        if (t < 3) {
            p = p + 1; // number of Prime numbers
            System.out.println(i);
            ibf.put(i);
            bff.position(4 * ibf.position());
            bff.flip();
            try {
                ch.write(bff);
                bff.clear();
                ibf.clear();
            } catch (IOException e) {

            }
        }

    }

    try {
        db.put(p); //At the end of the txt-file i put double format of number (Number of Prime numbers)
        bff.position(8*db.position());
        bff.flip();
        ch.write(bff);

        System.out.println("File is writen with: " + ch.size());
        ch.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

现在我尝试读取这个文件:

public class int_ispis {
public static void main(String[] args) throws IOException {
    File a = new File("C:\\Users\\Jovan\\Desktop\\Pisem.txt");
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(a);
    } catch (Exception e) {

    }
    FileChannel ch = fis.getChannel();
    ByteBuffer bff = ByteBuffer.allocate(6 * 4);

这是放在 6 行数组中的一行质数(下面这一行):

    int[] niz = new int[6];
    System.out.println("Pre flipa: " + bff.position() + " " + bff.limit());
    System.out.println("++++++++++++++++++++++++++++++++++++");
    while (ch.read(bff) != -1) {

        bff.flip();
        System.out.println();
        System.out.println("Posle flipa: " + bff.position() + " " + bff.limit());
        IntBuffer ib = bff.asIntBuffer();
        System.out.println("IB: " + ib.position() + " " + ib.limit());

        int read = ib.remaining();
        System.out.println(read);

当它到达文件末尾时,它将双数作为整数并写入错误的数字(如何将整数与双数分开?)

        ib.get(niz, 0, ib.remaining());
        for (int i = 0; i < read; i++) {
            System.out.print(niz[i] + " ");

        }
        System.out.println();
        System.out.println("=================================");
        ib.clear();
        bff.clear();

    }
}
}

【问题讨论】:

    标签: java integer double binaryfiles mixed


    【解决方案1】:

    二进制文件没有任何“分隔符”。

    您需要了解文件内容的结构并使用这些知识。

    在这个程序员中,我发现前 100 个中的素数。数字是 INT 格式,它们的总数是 DOUBLE 格式。

    这意味着文件中只有一个long 值,并且在最后 8 个字节中。因此,您只需检查当前位置是否为fileLenght - 8,然后将这最后 8 个字节读取为long 值。

    【讨论】:

    • 这仅适用于这种特定的文件格式,但问题标题更笼统
    • @smci 我的前两行声明:“没有一般答案”。如果您知道得更多,请随时发布您自己的答案。
    • 你误会了;我不是在谈论分隔符。是的,有一个普遍的答案。我的意思是你依赖于文件格式都是整数,最后只有一个 long,你不会检测到这些整数的溢出。从数字的字符串长度(最高一位)中检测溢出非常容易。
    • @smci “你依赖的文件格式都是整数,最后只有一个 long” 我不知道。这是 OP 的声明。 ---- “从数字的字符串长度(最高一位)检测溢出非常容易”不,不是。除非您知道文件内容的结构,否则您不知道某个字节属于数字中的哪个位置。 二进制文件中的数字之间没有隐式分隔符。
    • 啊我的错误,我读到“文件中的二进制数”,以为 OP 意味着空格分隔。是的,你是对的,如果它是一个二进制文件,这会很痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多