第一个参数 : 很明显,这是一个buffer,一个缓冲区 第二个参数 :这里可以理解为偏移量,也就是说,你想从这个缓冲区的第几个字 节开始存放读入的数据,你就写几,但是一般情况下默认我们都写0 第三个参数 :一次性可以读入的最大字节数。网传的64K,其实不然,我觉得这个还是自己调试,只要不比前面给出来的缓冲区大,且快就行 返回值:返回成功写入缓存区的字节数 注:第二个参数,如果设置为m,那么第三个参数最大设置为(缓冲区大小-m),否则会出现IndexOutOfBoundsException异常,就是说你接收的数据超出了缓存区
write(byte[] b, int off, int len) 用来从调用他的stream处,将缓存区的数据发出第一个参数:这还是一个缓冲区 第二个参数:偏移量,表示你要从缓冲区的第几个字节出开始发出数据,一样,默认我们都写0 第三个参数:一次性可以发出的最大字节数,一般设置为缓冲区大小,当然也要注意第二个参数的设置,一定不能超出缓冲区的大小 返回值:返回成功发出的字节数
public static final int BUFFER_SIZE = 5; File fileIn = new File("./src/lib/验证.txt"); File fileOut = new File("./src/lib/newFile.txt"); try { FileInputStream fis = new FileInputStream(fileIn); FileOutputStream fos = new FileOutputStream(fileOut);这是你要看的代码,可以看出,我在向新文件中写入时,将缓冲区的第一个字节绕过去了,也就是说,才每次写入的时候,都会少掉缓冲区的第一个字节
byte[] buffer = new byte[BUFFER_SIZE]; int len = fis.read(buffer, 0, BUFFER_SIZE); while (len != -1) { fos.write(buffer, 1, len - 1); len = fis.read(buffer, 0, BUFFER_SIZE); } fis.close(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }上面代码的运行结果,如图所示 可以看出,我的缓冲区大小为5个字节,每次读文件时会取出五个字节,写文件时会忽略掉第一个字节,形成了这种情况 有关read的尝试,大家可以自己进行验证