一、字节流
1.概述:
1、字节流和字符流的基本操作是相同的,但是要想操作媒体流就需要用到字节流。
2、字节流因为操作的是字节,所以可以用来操作媒体文件。(媒体文件也是以字节存储的)
3、读写字节流:InputStream 输入流(读)和OutputStream 输出流(写)
4、字节流操作可以不用刷新流操作。
5、InputStream特有方法:
int available();//返回文件中的字节个数
注:可以利用此方法来指定读取方式中传入数组的长度,从而省去循环判断。但是如果文件较大,而虚拟机启动分配的默认内存一般为64M。当文件过大时,此数组长度所占内存空间就会溢出。所以,此方法慎用,当文件不大时,可以使用。
练习:
需求:复制一张图片F:\java_Demo\day9_28\1.BMP到F:\java_Demo\day9_28\2.bmp
[java] view plain copy
-
import java.io.*;
-
class CopyPic {
-
public static void main(String[] args){
-
copyBmp();
-
System.out.println("复制完成");
-
}
-
public static void copyBmp() {
-
FileInputStream fis = null;
-
FileOutputStream fos = null;
-
try {
-
fis = new FileInputStream("F:\\java_Demo\\day9_28\\1.bmp"); //写入流关联文件
-
fos = new FileOutputStream("F:\\java_Demo\\day9_28\\2.bmp"); //读取流关联文件
-
byte[] copy = new byte[1024];
-
int len = 0;
-
while((len=fis.read(copy))!=-1) {
-
fos.write(copy,0,len);
-
}
-
}
-
catch (IOException e) {
-
e.printStackTrace();
-
throw new RuntimeException("复制文件异常");
-
}
-
finally {
-
try {
-
if(fis!=null) fis.close();
-
}
-
catch (IOException e) {
-
e.printStackTrace();
-
throw new RuntimeException("读取流");
-
}
-
}
-
}
-
}
-
字节流缓冲区
- 字节流缓冲区跟字符流缓冲区一样,也是为了提高效率。
注意事项:
- read():会将字节byte()提升为int型值
- write():会将int类型转换为byte()类型,保留最后的8位。
练习:
1.复制MP3文件 1.MP3 --> 2.MP3
2.自己写一个MyBufferedInputStream缓冲类,提升复制速度
代码:
[java] view plain copy
- import java.io.*;
- //自己的BufferedInputStream
- class MyBufferedInputStream {
-
private InputStream in; //定义一个流对象
-
private byte [] buf = new byte[1024*4];
-
private int count = 0,pos = 0;
-
public MyBufferedInputStream(InputStream in){
-
this.in = in;
-
}
-
public int MyRead() throws IOException{
-
if(count==0) { //当数组里的数据为空时候,读入数据
-
count = in.read(buf);
-
pos = 0;
-
byte b = buf[pos];
-
count--;
-
pos++;
-
return b&255; //提升为int类型,在前面三个字节补充0。避免1111 1111 1111 1111
-
}
-
else if(count > 0) {
-
byte b = buf[pos];
-
pos++;
-
count--;
-
return b&0xff; //提升为int类型,在前面三个字节补充0。避免1111 1111 1111 1111
-
}
-
return -1;
-
}
-
public void myClose() throws IOException{
-
in.close();
-
}
- }
- class BufferedCopyDemo {
-
public static void main(String[] args) {
-
long start = System.currentTimeMillis();
-
copy();
-
long end = System.currentTimeMillis();
-
System.out.println("时间:"+(end-start)+"ms");
-
start = System.currentTimeMillis();
-
copy1();
-
end = System.currentTimeMillis();
-
System.out.println("时间:"+(end-start)+"ms");
-
}
- public static void copy1() { // 应用自己的缓冲区缓冲数据
-
MyBufferedInputStream bis = null;
-
BufferedOutputStream bos = null;
-
try {
-
bis = new MyBufferedInputStream(new FileInputStream("马旭东-入戏太深.mp3"));//匿名类,传入一个InputStream流对象
-
bos = new BufferedOutputStream(new FileOutputStream("3.mp3"));
-
int buf = 0;
-
while((buf=bis.MyRead())!=-1) {
-
bos.write(buf);
-
}
-
}
-
catch (IOException e) {
-
e.printStackTrace();
-
throw new RuntimeException("复制失败");
-
}
-
finally {
-
try {
-
if(bis!=null) {
-
bis.myClose();
-
bos.close();
-
}
-
}
-
catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
- }