我想编写一个方法,将文件中的部分读入字节数组。 为此我正在使用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调试器没有帮助,因为我找不到索引的问题.....
答案 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。
...
dis.reset();
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 [])之间的差异之一!
答案 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]);
检查两种情况下的长度值。