java:读取大型二进制文件

时间:2014-10-23 13:28:16

标签: java byte binaries large-data

我需要读出一个包含500000001二进制文件的给定大文件。之后我必须将它们翻译成ASCII。

尝试将二进制文件存储在大型数组中时出现问题。我在数组ioBuf的定义中得到警告:

" int类型的文字16000000032超出范围。"

我不知道如何保存这些数字来与他们合作!有人有想法吗?

这是我的代码:

public byte[] read(){
    try{
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("data.dat"));
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        BufferedOutputStream out = new BufferedOutputStream(bs);
        byte[] ioBuf = new byte[16000000032];       
        int bytesRead;
        while ((bytesRead = in.read(ioBuf)) != -1){
            out.write(ioBuf, 0, bytesRead);
        }
          out.close();
          in.close();
          return bs.toByteArray();
}

3 个答案:

答案 0 :(得分:3)

数组的最大索引为Integer.MAX_VALUE16000000032大于Integer.MAX_VALUE

Integer.MAX_VALUE = 2^31-1 = 2147483647

2147483647 < 16000000032

您可以通过检查阵列是否已满并创建另一个并继续阅读来解决此问题。 但我不太确定你的方法是否是执行此操作的最佳方式。 byte [Integer_MAX_VALUE]很大;) 也许你可以用较小的块来分割输入文件。

编辑:这是你如何读取文件的单个int。您可以将缓冲区的大小调整为要读取的数据量。但是你试图立刻读完整个文件。

//Allocate buffer with 4byte = 32bit = Integer.SIZE
byte[] ioBuf = new byte[4];       
int bytesRead;
while ((bytesRead = in.read(ioBuf)) != -1){
   //if bytesRead == 4 you read 1 int
   //do your stuff
}

答案 1 :(得分:0)

  1. 如果需要声明一个大常量,请向其附加一个“L”,表示编译器是long常量。但是,正如另一个答案所提到的,你不能声明那些大的数组。
  2. 我怀疑这项练习的目的是学习如何使用java.nio.Buffer系列课程。

答案 2 :(得分:0)

我从头开始做了一些进步!但我还是有问题。

我的想法是读取前32个字节,将它们转换为int数。然后是接下来的32个字节等。不幸的是,我只是得到第一个并且不知道如何继续。

我发现了以下将这些数字转换为int的方法:

public static int byteArrayToInt(byte[] b){
    final ByteBuffer bb = ByteBuffer.wrap(b);
    bb.order(ByteOrder.LITTLE_ENDIAN);
    return bb.getInt();
}

所以现在我有:

    BufferedInputStream in=null;
    byte[] buf = new byte[32];
    try {
        in = new BufferedInputStream(new FileInputStream("ndata.dat"));
        in.read(buf);
        System.out.println(byteArrayToInt(buf));
        in.close();
    } catch (IOException e) {
        System.out.println("error while reading ndata.dat file");
    }