Java BufferedInputStream.read() IndexOutOfBounds



我想编写一个方法,将文件中的部分读取到字节数组中。为此,我使用fileinputstream和缓冲的inputstream。

像这样:

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

我只通过调用方法名"OpenFile(字符串文件)"来完成一次。使用此方法打开文件后,我尝试使用以下函数进行操作:"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:Temptest.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调试器没有帮助,因为我找不到索引的问题。。。。。

如果将Stream读取到缓冲区数组中,则偏移量和len必须始终为:

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

这些参数指定将数据放入缓冲区的位置,而不是从流中读取哪些数据。流被读取为continuous(或者这是怎么拼写的?)!

如果你总是打电话:

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

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

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

    dis.reset();

流位置再次为0。

此代码只将流中的256-511字节读取到缓冲区中:

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

请确保最后256个字节的缓冲区未被填满。这是读取(byte[],int,int)和读取(byte[])之间的区别之一!

以下是一些链接,用于描述流的概念和读取方法的用法:读取()流

您是如何获得偏移量和len的。我现在的猜测是你的偏移+len大于缓冲区。

您将获得IndexOutOfBoundsException-如果

  • 偏移为负,

  • len为阴性,

  • len大于buffer.length-关闭

第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]);

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

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

我怀疑你想要的是

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));

在调试器中,您可以检查偏移量>=0和偏移量+长度<=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();

检查的条件之一无效。

相关内容

  • 没有找到相关文章

最新更新