2016-10-10 19 views
-1

我已经通过类似的帖子,但他们没有真正回答我的问题。因此,我在一个单独的线程中发布我的问题。 我需要跳过文件中的某些字节,这我在字节array.I正在读我试图通过下面的代码在一个文件中读取字节:java.lang.NegativeArraySizeException

1. byte [] readBytesToSKip = null; 
2. readBytesToSKip = new byte[(int)bytesToSkip]; 
3. bytesReadToSkip = System.in.read(readBytesToSKip) ; 
4. if(bytesReadToSkip > 0) 
5. { 
6.  baos_.write(readBytesToSKip, 0, bytesReadToSkip); 
7. } 

实现这一目标,但我得到一个NegativeArraySizeException在那里的大小超过Integer.MAX_VALUE线2条。否则,我不知道如何实现这一目标。

bytesToSkip是只要我在下面的函数计算:

public static long bytesToLong1(byte[] bytes) { 
     long value = 0; 
     for (int i = 0; i < bytes.length; i++) 
     { 
      value = (value << 8) + (bytes[i] & 0xff); 
     } 
     return value; 
    } 
+2

'bytesToSkip'的值是多少?如果它是“long”并且大于“Integer.MAX_VALUE”,那么您将无法一次跳过它。你需要分多个步骤来完成。正如所写,这个问题闻起来像一个[XY问题](http://xyproblem.info)。告诉我们你正在努力完成的事情。 –

+1

“bytesToSkip”首先是“long”的意义何在?因为你无法一次读取那么多的数据?代码本身有什么意义?你知道'InputStream.skip()'吗? – EJP

+0

@EJP我需要读取字节形式的标准输入这就是为什么我没有使用InputSream的第一位。 –

回答

-1

从您发布bytes->long功能开始

public static long bytesToLong1(byte[] bytes) { 
    long value = 0; 
    for (int i = 0; i < bytes.length; i++) 
    { 
     value = (value << 8) + (bytes[i] & 0xff); 
    } 
    return value; 
} 

每当bytes.length==8,第一字节的绝对值> = 128(在Java中具体的:它是一个负数的字节值),你会终止对你的长期负值。

实施例:

byte vals[]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 

System.out.println(bytesToLong1(vals)); 

将导致正在打印它-1。它会很好地转换为int,其值为-1,但对于数组长度而言仍然不合适。

+0

'如果'一样强。没有区别。 – EJP

+0

对于“如果”的其他一些值,如什么?你在这里假设什么假想的语言?这是形式逻辑101。 – EJP