• 回顾IO流


    IO流

    IO流简介

    • IO流:Java对数据的操作是通过流的方式,IO流就是处理设备之间的数据传输。
    • 输入流InputStream(读取数据) 输出流OutStream(写数据)
    • 字节流可以操作任何数据 字符流只能操作字符数据

    FileInputStream

    文件输入流FileInputStream用于读取文件的原始字节流。

    构造方法:FileInputStream(File file) FileInputStream(String name)

    方法:Int read() 读取一个字节

    FileInputStreamDemo1.java*

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    public class FileInputStreamDemo1 {
        public static void main(String[] args) throws IOException {
            //创建文件输入流对象
            FileInputStream fis1 = new FileInputStream("a.txt");
            //读取a.txt文件数据(每读取一个字节返回一个int数值)
            int a=0;
            while((a=fis1.read())!=-1){
                System.out.println(a);
            }
            //创建文件对象
            File file = new File("b.txt");
            //创建文件输入流对象
            FileInputStream fis2 = new FileInputStream(file);
            //读取b.txt文件数据
            int b;
            while ((b=fis2.read())!=-1){
                System.out.println(b);
            }
            //关闭流
            fis1.close();
            fis2.close();
        }
    }
    

    FileOutputStream

    文件输出流FileOutputStream用于向文件中写入数据

    构造方法:FileOutputStream(File file) FileOutputStream(String name)

    方法:write(int b) 每次向文件中写入一个字节 write(byte[] b) 每次向文件中写入多个字节

    FileOutputStreamDemo1.java

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class FileOutputStreamDemo1 {
        public static void main(String[] args) throws IOException {
            File file = new File("a.txt");
            FileOutputStream fos1 = new FileOutputStream(file);
            fos1.write(65);//向a.txt文件中写入'A'
            fos1.close();
            FileOutputStream fos2 = new FileOutputStream("b.txt");
            byte[] b={65,66,67,68,69,70};
            fos2.write(b);//向b.txt文件中写入"ABCDDEF"
            fos2.close();
    
        }
    }
    

    缓冲区思想

    拷贝文件,利用文件输入流读取文件数据,再利用文件输出流向文件中写入数据。

    • CopeDemo1.java (该方法每读取一个字节写入一个字节,速度慢)
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    public class CopeDemo1 {
        public static void main(String[] args) throws IOException {
           FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
           FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
            int a = 0;
            while ((a = fis.read()) != -1) {
                fos.write(a);
            }
            System.out.println("图片拷贝成功!");
            fis.close();
            fos.close();
        }
    }
    
    • CopeDemo2.java (利用available()方法,返回文件大小,只适合小文件,若文件太大会造成内存溢出)
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopeDemo2 {
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
            int size = fis.available();
            byte[] bytes = new byte[size];
            fis.read(bytes);
            FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/11(副本).jpg");
            fos.write(bytes);
            System.out.println("图片拷贝成功!");
            fis.close();
            fos.close();
        }
    }
    
    • CopeDemo3.java (自定义缓存区大小,先读取一个缓存区大小数据,再进行写入,再继续读取写入,知道完后为止)
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopeDemo3 {
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
            FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
            byte[] bytes = new byte[1024*8];//自定义缓存区大小
            int size=0;
            while((size=fis.read(bytes))!=-1){
                fos.write(bytes,0,size);
            }
            System.out.println("图片拷贝成功!");
            fis.close();
            fos.close();
        }
    }
    

    BufferedInputStream

    • BufferedInputStream内置了一个缓冲区(数组)

    • 当使用BufferedInputStream读取一个字节时,BufferedInputStream会一次性从文件中读取8192个(8Kb), 存在缓冲区中,直到缓冲区装满了, 才重新从文件中读取下一个8192个字节数组

    • 向流中写入字节时, 不会直接写到文件, 先写到缓冲区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里

    CopeDemo4.java

    import java.io.*;
    
    public class CopeDemo4 {
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
            BufferedInputStream bis=new BufferedInputStream(fis);
            FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            int a=0;
            while((a=bis.read())!=-1){
                bos.write(a);
            }
            System.out.println("图片拷贝成功!");
            bis.close();
            bos.close();
        }
    }
    

    flush()方法

    用来刷新缓冲区的,把内部buf[] 变量的数据写入文件,刷新后可以再次写入数所

    close()方法

    • 用来关闭流释放资源的

    • 如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写入数据

  • 相关阅读:
    C++ Low level performance optimize
    简单find命令的实现
    数据结构学习之栈
    随机数的生成
    数据结构学习(一)
    C复习---动态内存分配
    (转)虚拟文件系统(VFS)浅析
    (转) 中断处理程序&中断服务例程
    Gradle系列教程之依赖管理
    Gradle系列教程之依赖管理
  • 原文地址:https://www.cnblogs.com/jascen/p/11315889.html
Copyright © 2020-2023  润新知