首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中读取二进制数,并将整数与长整型/双精度型分开

从文件中读取二进制数,并将整数与长整型/双精度型分开
EN

Stack Overflow用户
提问于 2017-08-12 20:13:59
回答 1查看 81关注 0票数 0

在这个程序员中,我发现了前100个数字中的质数。数字是整型格式的,所有的数字都是双精度格式的。我想要读取那个文件,我只为整型数字做了,但我不知道双精度数字的热度。代码如下:

代码语言:javascript
复制
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();
    }

}

}

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

代码语言:javascript
复制
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行数组中的一行素数(下面这行):

代码语言:javascript
复制
    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);

当它到达文件的末尾时,它将双精度数字放入整数,并写入错误的数字(如何区分整数和双精度数字?)

代码语言:javascript
复制
        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();

    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2017-08-12 20:36:17

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

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

在这个程序员中,我发现前100个都是质数,它们都是整数格式的,总共有几个是双精度格式。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45650129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档