Java BufferedInputStream.read()IndexOutOfBounds

时间:2012-03-14 11:21:10

标签: java java-io bufferedinputstream datainputstream

我想编写一个方法,将文件中的部分读入字节数组。 为此我正在使用fileinputstream和缓冲输入流。

像这样:

fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);

我只通过调用方法名称“OpenFile(String File)”来执行此操作一次。 使用此方法打开文件后,我尝试使用以下函数进行操作:“ReadParts(byte [] buffer,int offset,int len)”

dis.read(buffer, offset, len);            
for(int i = 0; i < buffer.length; i++) System.out.print((char)buffer[i]);

// used data:
// file = "C:\Temp\test.txt" with a size of 949
// buffer: always in this case with a size of 237, except for the last one its 238
// offsets: 0, 237, 474, 711 
// len is always 237, except for the last one its 238

行dis.read()在第一步之后抛出一个indexOutOfBounds错误消息,但我无法弄明白为什么和什么。使用netbeans调试器没有帮助,因为我找不到索引的问题.....

4 个答案:

答案 0 :(得分:1)

你怎么想出胶印和len。我现在的猜测是你偏移+ len大于缓冲区。

答案 1 :(得分:1)

如果您将Stream读入缓冲区数组,则offset和len必须始终为:

offset = 0;
len = buffer.length();

这些参数指定数据放入缓冲区的位置,而不是从Stream读取哪些数据。 Stream是连续读取的(或者这是拼写错误的?)!

如果你总是打电话:

buffer = new byte[256];
dis.read(buffer, 0, 256);

这将发生: 在第一次调用之前,Streamposition(返回的下一个字节的位置)为0。

  1. 调用后的Streamposition = 256,缓冲区包含字节0-255
  2. 调用后的Streamposition = 512,缓冲区包含字节256-511
  3. ...

    dis.reset();

  4. Streamposition再次为0。

    此代码仅从Stream读取字节256-511到缓冲区:

    byte[] buffer = new byte[512];
    dis.skip(256);
    dis.read(buffer, 0, 256);
    

    看到最后256个字节的缓冲区未填充。这是read(byte [],int,int)和read(byte [])之间的差异之一!

    以下是一些链接,它们描述了流的概念和read-method的用法: read() Streams

答案 2 :(得分:0)

偏移量是缓冲区中的偏移量而不是文件。

我怀疑你想要的是什么

byte[] buffer = new byte[237];

int len = dis.read(buffer); // read another 237 bytes.

if (len < 0) throw new EOFException(); // no more data.
for(int i = 0; i < len; i++)
   System.out.print((char)buffer[i]);
// or
System.out.print(new String(buffer, 0, 0, len));

在你的调试器中,你能检查偏移&gt; = 0和偏移+ lengh&lt; = buffer.length?

来自InputStream.read()

public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
    throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
    throw new IndexOutOfBoundsException();

检查的其中一个条件无效。

答案 3 :(得分:0)

您将获得IndexOutOfBoundsException - 如果

  • 偏移为负,

  • len是否定的,

  • len大于buffer.length - off

第3点的例子:

如果输入文件中有500个字符或1500个字符,则以下程序将成功运行,

byte[] buffer = new byte[1000];
int offset = 0;
int len = 1000;
dis.read(buffer, offset, len);            
for(int i = 0; i < buffer.length; i++) System.out.print((char)buffer[i]);

但它会失败并抛出异常,如果,

byte[] buffer = new byte[1000];
int offset = 0;
int len = 1001;
dis.read(buffer, offset, len); 
for(int i = 0; i < buffer.length; i++) System.out.print((char)buffer[i]);

检查两种情况下的长度值。