字节流:I/O中以字节形式输入和输出的流
    字节流概述:计算机中无论是文本还是视屏,图片、音频。都是以二进制(字节形式存在的),根据数据的传输方法分为输入流和输出流。
    一、字节输入流(读取):
    所有的字节输入流都继承InputStream,他的作用是用来表示那些从不同数据源产生输入的类;
    1.字节流读写文件:在java中提供了两个类专门用来处理文件的读写操作
    ①:FileInputStream:是InputStream的子类专门用来读取文件中的数据

    1. public class Example01 {
    2. public static void main(String[] args) throws IOException {
    3. FileInputStream file = new FileInputStream("src/text.txt");
    4. int read=0;
    5. while ((read=file.read())!=-1) {
    6. System.out.print((char) read);
    7. }
    8. file.close();
    9. }
    10. }
    11. Output:
    12. hello
    1. ②:通过FileOutputStream**把数据写入文件 **
    1. public class Example02 {
    2. public static void main(String[] args) throws IOException {
    3. FileOutputStream fo = new FileOutputStream("out.txt");
    4. String str="heole word";
    5. //将字符串转换为字节流
    6. fo.write(str.getBytes());
    7. fo.close();
    8. }
    9. }
    1. 运行结果:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12862216/1619249711060-b90a93bf-427c-411f-9fb6-b763414840b5.png#clientId=u2e62ca63-911c-4&from=paste&height=65&id=ufb9d03c0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=130&originWidth=281&originalType=binary&size=4802&status=done&style=none&taskId=ub7c83406-f8aa-4316-a208-b05335955be&width=140.5)<br /> ②-1:如果通过FileOutputStream向一个已经存在数据的文件中写入的话,那么该文件的数据将被覆盖。可以通过在FileOutputStream的构造器中**把append的参数设置为true,就不会覆盖之前数据并写入新的数据。 **
    1. public class Example02 {
    2. public static void main(String[] args) throws IOException {
    3. FileOutputStream fo = new FileOutputStream("out.txt",true);
    4. String str="heole word 中国";
    5. //将字符串转换为字节流
    6. fo.write(str.getBytes());
    7. fo.close();
    8. }
    9. }

    运行结果:
    image.png5
    二、文件的拷贝

    1. public class CopyDemo {
    2. public static void main(String[] args) throws IOException {
    3. //先读取需要拷贝的文件
    4. FileInputStream input = new FileInputStream("./image.png");
    5. //创建文件的写入
    6. FileOutputStream output = new FileOutputStream("./aa.png");
    7. int len=0;
    8. long beginTime=System.currentTimeMillis();//获得文件拷贝前的系统时间
    9. System.out.println(beginTime);
    10. while ((len=input.read())!=-1){
    11. output.write(len);//每读取一次文件的同时便写入
    12. }
    13. long endTime=System.currentTimeMillis();
    14. System.out.println(endTime);
    15. System.out.println("花费的时间为:"+(endTime-beginTime)+"毫秒");
    16. input.close();
    17. output.close();
    18. }
    19. }

    三、字节流的缓冲区:
    我们在上一步进行文件的拷贝时候,是一个一个字节的进行拷贝的,如果文件过大,则拷贝的时间就会很长,所以为了提高传输的效率,我们可以定义一个字节数组来当成缓冲区,在拷贝文件的时候,就可以先将文件读入的字节数组中,然后在将数组中的文件一次性的写入新文件中。

    1. public class ByteDemo {
    2. public static void main(String[] args) throws IOException {
    3. FileInputStream inputStream = new FileInputStream("./image.png");
    4. FileOutputStream OutputStream = new FileOutputStream("D:\\ideawork\\project03\\src\\com\\package18\\cc.png");
    5. int temp=0;
    6. byte [] bytes=new byte[10241];//缓冲区1024字节,文件缓冲区的容量越小时间越长
    7. long beingTime=System.currentTimeMillis();
    8. while ((temp=inputStream.read(bytes))!=-1){
    9. OutputStream.write(bytes);
    10. }
    11. long endTime=System.currentTimeMillis();
    12. System.out.println("文件拷贝的时间"+(endTime-beingTime)+"毫米");
    13. inputStream.close();
    14. OutputStream.close();
    15. }
    16. }
    17. OutPut:
    18. 文件拷贝的时间3毫米

    四、字节缓冲流:
    BufferedInputStream和BufferedOutputStream这两个流的内部都定义一个大小为8192字节的数组。所以这两个流自带缓冲区。
    源码所示:

    1. public
    2. class BufferedInputStream extends FilterInputStream {
    3. private static int DEFAULT_BUFFER_SIZE = 8192;
    4. protected volatile byte buf[];
    5. //通过两个构造器进行数组的赋值
    6. public BufferedInputStream(InputStream in) {
    7. this(in, DEFAULT_BUFFER_SIZE);
    8. }
    9. public BufferedInputStream(InputStream in, int size) {
    10. super(in);
    11. if (size <= 0) {
    12. throw new IllegalArgumentException("Buffer size <= 0");
    13. }
    14. buf = new byte[size];
    15. }
    1. <br />
    1. public class BufferedStreamTest {
    2. public static void main(String[] args) throws IOException {
    3. BufferedInputStream buffinput = new BufferedInputStream(new FileInputStream("./image.png"));
    4. BufferedOutputStream buffout = new BufferedOutputStream(new FileOutputStream("D:\\idea work\\project03\\src\\com\\package18\\ccccc.png"));
    5. int leng=0;
    6. long beginTime=System.currentTimeMillis();
    7. while ((leng=buffinput.read())!=-1){
    8. buffout.write(leng);
    9. }
    10. long l = System.currentTimeMillis();
    11. System.out.println("结束时间"+(l-beginTime));
    12. buffinput.close();
    13. buffout.close();
    14. }
    15. }