java IO流中InputStream中read()与read(byte[] b)、available()方法

内容分享16小时前发布
0 0 0

int read()

  • 从读取流读取的是一个一个字节
  • 返回的是字节的(0-255)内的字节值
  • 读一个下次就自动到下一个,如果碰到-1说明没有值了

int read(byte[] b)

  • 从输入流中读取一些字节并将它们存储到缓冲区数组b中。
  • 返回的就是读到有效的字节个数,如果没有数据返回的就是-1。

int available(): //慎用

  • Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.(JDK8中的API解释)(大意:返回可从该输入流读取(或跳过)的字节数的估计,而不会被下一次调用该输入流的方法阻塞。)
  • 这个方法可以在读写操作前先得知数据流里有多少个字节可以读取,需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题。
  • 但是由于网络通讯往往是间断性的,一串字节往往分几批进行发送。如果是用于网络操作,会出现问题
  • 如果到达输入流末尾,则返回0。

===================================================================================

拷贝文件代码

  1. 逐个字节拷贝

FileInputStream fis = new FileInputStream("致青春.mp3");       //创建输入流对象,关联致青春.mp3
FileOutputStream fos = new FileOutputStream("copy.mp3");    //创建输出流对象,关联copy.mp3

int b;
while((b = fis.read()) != -1) {                             //将每次读到的赋值给b
    fos.write(b);                                           //将b中的字节写出去
}

fis.close();                                                //关流,释放资源
fos.close();

  1. 自定义数组拷贝

FileInputStream fis = new FileInputStream("致青春.mp3");       //创建输入流对象,关联致青春.mp3
FileOutputStream fos = new FileOutputStream("copy.mp3");    //创建输出流对象,关联copy.mp3
byte[] arr = new byte[1024 * 8];                            //自定义数组
int len;
while((len = fis.read(arr)) != -1) {                            //将数据读到字节数组中
    fos.write(arr, 0, len);                                 //从字节数组中将数据写到文件上
    //fos.write(arr);
}

fis.close();                                                //关流,释放资源
fos.close();

int len = read(arr);如果文件上有数据返回的就是读到有效的字节个数,如果文件上没有数据返回的就是-1

3.定义一个大数组拷贝,数组和文件的字节个数一样大

//fis.available();一次获取读的文件的大小
FileInputStream fis = new FileInputStream("致青春.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
byte[] arr = new byte[fis.available()];                     //虽然可以拷贝,但是在开发时不提议,有可能会导致内存溢出
fis.read(arr);
fos.write(arr);
fis.close();

  1. 带缓冲区的拷贝

FileInputStream fis = new FileInputStream("致青春.mp3");       //创建输入流对象,关联致青春.mp3
BufferedInputStream bis = new BufferedInputStream(fis);     //对fis进行包装,内置一个8192大小的字节数组
FileOutputStream fos = new FileOutputStream("copy.mp3");    //创建输出流对象,关联copy.mp3
BufferedOutputStream bos = new BufferedOutputStream(fos);   //对fos进行包装,内置一个8192大小的字节数组

int b;
while((b = bis.read()) != -1) {                             //read一次会先将文件上的数据读到缓冲区中,再从缓冲区一个一个的赋值给b
    bos.write(b);                                           //write一次,是将b中的字节数据写到缓冲区,缓冲区写满再一次写到文件上
}

bis.close();                                                //只需要关掉包装后的即可
bos.close();

© 版权声明

相关文章

暂无评论

none
暂无评论...