Java 带有ByteArrayOutputStream的OutputStream部分写入,然后停止
因此,我尝试使用字节数组每1000个整数在一个文件上写入一些整数,但它只在我想要大约1000个整数时写入一次(我已使用hexeditor确认),我不知道为什么它会先写入,然后停止。出现以下错误:线程“main”中的异常java.io.ByteArrayOutputStream.write(未知源)处java.io.DataOutputStream.write(未知源)处test.Class1.main(Class1.java:32)处的java.lang.IndexOutOfBoundsExceptionJava 带有ByteArrayOutputStream的OutputStream部分写入,然后停止,java,file,Java,File,因此,我尝试使用字节数组每1000个整数在一个文件上写入一些整数,但它只在我想要大约1000个整数时写入一次(我已使用hexeditor确认),我不知道为什么它会先写入,然后停止。出现以下错误:线程“main”中的异常java.io.ByteArrayOutputStream.write(未知源)处java.io.DataOutputStream.write(未知源)处test.Class1.main(Class1.java:32)处的java.lang.IndexOutOfBoundsExce
public class Class1 {
static byte[] buf=new byte[1000];
public static void main(String[] args) throws IOException {
ByteArrayOutputStream BOS = new ByteArrayOutputStream() ;
DataOutputStream DOS = new DataOutputStream(BOS);
RandomAccessFile MyFile = new RandomAccessFile ("myfile.dat", "rw");
int acc=0;
int k=0;
for( k=0;k<100;k++) {
buf=bufferFiller( buf);
DOS.write(buf, k*1000, buf.length);
acc++;
}
}
public static byte[] bufferFiller(byte[] buf) {
int i=0;
int randomNum=0;
for(i=0;i<1000;i++) {
buf[i]=(byte) (randomNum = -50000 + (int)(Math.random() * ((100000) + 1)));
}
return buf;
}
}
公共类1{
静态字节[]buf=新字节[1000];
公共静态void main(字符串[]args)引发IOException{
ByteArrayOutputStream BOS=新建ByteArrayOutputStream();
DataOutputStream DOS=新的DataOutputStream(BOS);
RandomAccessFile MyFile=新的RandomAccessFile(“MyFile.dat”、“rw”);
int acc=0;
int k=0;
对于OP问题中的(k=0;k),问题在于缓冲区中偏移量的使用
(增加重点)
公共无效写入(字节[]b,int off,int len)引发IOException
将从偏移量off开始的指定字节数组中的len字节写入基础输出流。如果未引发异常,则写入的计数器将按len递增
因此,java.lang.IndexOutOfBoundsException
是这一行的结果:
DOS.write(buf, k*1000, buf.length);
通过始终使用“0”作为偏移量,.write(…)
将从偏移量(应该是0)开始写入字节数(在本例中是buf的长度)。OP在每次循环迭代中都会很好地重新填充缓冲区
因此,请改为:
for( k=0;k<100;k++) {
buf=bufferFiller( buf);
DOS.write(buf, 0, buf.length);
acc++;
}
对于(k=0;kso)偏移量是缓冲区的偏移量,而不是文件?是的,非常感谢,所以在类似的情况下,如果我想使用read(byte[],int off,len),我也会每次都放0?好的,我再次读取。是的,它应该是缓冲区中的偏移量。“从偏移量off开始,将指定字节数组中的len字节写入底层输出流。”是的,read
会将len
字节读取到指定的byte[]
数组中,并将这些字节从off
开始,因此通常使用0。因此,从文件中获取偏移量的唯一方法是seek函数?例如,我想读取第1000到第2000个数字,我必须首先查找(1000),然后是myFile。read(b[])非常感谢您的帮助。我想,如果文件足够小,您可以将整个内容读入缓冲区,但一般来说,您需要找到文件中的正确位置,然后读取所需的字节数。