IO流实现文件的读写(图像、音频、视频)

来源:互联网 发布:淘宝店不开了怎么注销 编辑:程序博客网 时间:2024/05/26 07:29

本博文使用字节流对文件进行复制,其中用到InputStream输入流、FileOutputStream输出流

source --->A InputStream --->Program--->A FileOutputStream--->destination

资源向程序传输数据的流是输入流;程序向目标传输数据的流是输出流。


程序实现复制【src/Bilibili.mp4】文件到【src】目录下



先上完整代码:

public static void main(String[] args) {System.out.println("开始复制...");byte[] myArray = new byte[1024*1024];int len;try {InputStream is = new FileInputStream("src/Bilibili.mp4");OutputStream os = new FileOutputStream("src/BilibiliCopy.mp4");while((len=is.read(myArray))!=-1){byte[] descArray = new byte[len];for (int i = 0; i < len; i++) {descArray[i]=myArray[i];}os.write(descArray);}System.out.println("复制完成!");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}


详细注解如下:

public class copyFile {public static void main(String[] args) {System.out.println("开始复制...");//设置每次读取1024*1024个字节byte[] myArray = new byte[1024*1024];//len计数器:记录每次读取的字节数。防止"多"读数据。int len;try {//获取源文件相对路径InputStream is = new FileInputStream("src/Bilibili.mp4");//复制文件到【src】目录下,文件命名为BilibiliCopy.mp4OutputStream os = new FileOutputStream("src/BilibiliCopy.mp4");/** * len:【is.read(myArray)】返回int类型的字节数长度,当流读到文件末尾便返回-1 * is.read(myArray):从数据流中读取myArray(1024*1024)个字节的数据,并存储在缓冲区myArray数组中。 */while((len=is.read(myArray))!=-1){//每个字节占一个数组空间,有len个字节开辟len个空间接收数据流byte[] descArray = new byte[len];//取出myArray数组中的数据for (int i = 0; i < len; i++) {descArray[i]=myArray[i];}//每次循环写入一次,直至结束。os.write(descArray);}System.out.println("复制完成!");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

运行程序:

因为图像、音频、视频都是二进制资源,对其读写方式都是一样的,将源文件名、目标文件名改成相应的图像名称、音频名称就OK。


注意:

如果没有计数器将会出现奇怪现象,稍作改动,上代码:

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class Demo {public static void main(String[] args) {System.out.println("开始复制...");byte[] myArray = new byte[3];//int len;try {InputStream is = new FileInputStream("src/a.txt");OutputStream os = new FileOutputStream("src/b.txt");while((is.read(myArray))!=-1){for (int i = 0; i < myArray.length; i++) {os.write(myArray[i]);}}System.out.println("复制完成!");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

a.txt 文件的内容是【java.io】,而b.txt 文件的内容是【java.io.i】,比源文件“多”读了两个字节。

原因是数组没有被完全覆盖,

第1轮的数组读取【j a v】,

第2轮数组读取【a . i】完全覆盖第1轮读取的【j a v】,

第3轮数组读取【o】,没有完全覆盖第2轮数组,旧数据仍然存在,会被继续读取。

声明初始化一个计数器就记录最后一次读取多少个字节,就只存储N个字节,而不会出现“多余”数据。




1 0
原创粉丝点击