Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有ByteArrayOutputStream的OutputStream部分写入,然后停止_Java_File - Fatal编程技术网

Java 带有ByteArrayOutputStream的OutputStream部分写入,然后停止

Java 带有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

因此,我尝试使用字节数组每1000个整数在一个文件上写入一些整数,但它只在我想要大约1000个整数时写入一次(我已使用hexeditor确认),我不知道为什么它会先写入,然后停止。出现以下错误:线程“main”中的异常java.io.ByteArrayOutputStream.write(未知源)处java.io.DataOutputStream.write(未知源)处test.Class1.main(Class1.java:32)处的java.lang.IndexOutOfBoundsException

 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[])非常感谢您的帮助。我想,如果文件足够小,您可以将整个内容读入缓冲区,但一般来说,您需要找到文件中的正确位置,然后读取所需的字节数。