I/O流------字节输入输出流问题:
I/O流也称输入输出流,输入指的是读取数据到内存中,输出指内存中的数据存入硬盘或者其他指定的位置, 流 指的是数据
写入数据的原理(内存—>硬盘):
java —> JVM(java虚拟机)—>OS(操作系统)—>OS调用写方法---->把数据写入文件中
1,字节流:
字节流中分为字节输入流(inputStream)和字节输出流(outputStream).
主要介绍字节输出流中的子类 FileoutputStream(文件字节输出流)
1),文件字节输出流:
//创建FileOutputStream对象。
FileOutputStream fos = new FileOutputStream("./a.txt");
//写入的是97,会转换成二进制数保存到文档中,但注意的是,当我们打开文档的时候,
fos.write(97);
fos.close();
注意的是:可以看到创建的文档中输出的是字符
字节输出流输出多个字节的方法:将字符串转换成字节数组
String str ="你好,明天早上来一趟办公室";
//将字符串转换成字节数组。
byte[] arrs = str.getBytes();
fos.write(arrs);
fos.close();
FileOutputStream()中第二个参数是追加写开关,参数类型是布尔类型,值为True,则就是追加写入数据的时候不覆盖原来的数据内容。值为False则表示相反。注意的是,追加的时候如果要有换行,则要加入”\r\n“;另外write(byte,偏移量的起始位置,字节数)
//创建FileOutputStream对象。
FileOutputStream fos = new FileOutputStream("./c.txt" ,true);
fos.write("今天是开心的一天.\r\n".getBytes());
fos.close();
2)文件字节输入流:从硬盘上把数据写入到内存中
用到的方法为 int read():读取到文件的末尾返回-1;
//创建对象,参数为已经存在的文件文本,如果不存在,则会报错。
FileInputStream fos = new FileInputStream("./a.txt");
int len=0;
while((len=fos.read())!=-1){
System.out.print((char)len);
}
一次性从硬盘中读取多个字符:注意的是 read(byte[])参数是将读取的字节存入到字节数组中(这里的byte数组实质上起到一个缓冲的作用),这样在将字节数组转换成字符串就可以了
String(arr,起始位置,读取的长度):在将字符数组转换成字符串的时候,可以指定的一段数据。
案例:将某路径下的音频文件赋值到指定文件中取:注意,这里用currentTimeMillis()将程序的起始时间和结束时间接收,然后算出整个文件赋值的耗时。
//创建对象读取数据
FileInputStream fis = new FileInputStream("D:\\pic1\\2.mp4");
//创建对象写入数据
FileOutputStream fos = new FileOutputStream("D:\\pic2\\2.mp4");
//计算程序的运行时间(单位:毫秒)
long i = System.currentTimeMillis();
byte[] arr = new byte[2*10000000];
int len=0;//记录读取到的字节
//下面的程序执行一读一写操作进行文件的赋值
while((len=fis.read(arr))!=-1){
fos.write(arr,0,len);
}
fos.close();
fis.close();
long e = System.currentTimeMillis();
System.out.println("复制文件共耗时"+(e-i)+"毫秒");