JAVA之IO(输入输出)学习

简介:

Java中,将这种通过不同输入输出设备(键盘, 内存, 显示器, 网络等)之间的数据传输抽象表述为”流”,程序通过流的方式与输入输出设备进行数据传输。在Java中,流都位于java.io包中,所以又称之为IO流(输入输出)流。根据操作数据的不同可以分为字节流和字符流,根据数据传输方向的不同可分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据。

在Java的IO包中,字节流的输入输出流: java.io.InputStream和java.io.OutputStream
字符流的输入输出流: java.io.Reader和java.io.Writer

这里写图片描述

字节流:

其实在我们所说的计算机中,无论是文本、图片、音频还是视频数据,所有的文件都是以二进制(字节)形式存在,IO流针对字节的输入输出提供了一系列的流,统称为字节流。在Java中,提供两个抽象类InputStream和OutputStream,这个两个是字节流的顶级父类,所有的字节输入输出流都继承自它们。由于这两个类是抽象类,不能被实例化,因此针对不同的功能,它们都提供了不同的子类,这些子类形成了一个体系结构,如下图。

这里写图片描述

这里写图片描述

从图可以看出,InputStream和OutputStream的子类很多都是大致对应的。图中列出的IO流都是程序中常见的。

字节流Demo:

 public static void FileInput() throws IOException {
        //创建一个文件字节输入流
        FileInputStream in = new FileInputStream("src\\Zhuanti\\text.txt");
        //定义一个int类型的变量b,记住每次读取的一个字节
        int b = 0;
        while (true)
        {
            //变量b记住读取的一个字节
            b = in.read();
            //如果读取的字节为-1,结束
            if (b==-1)
                break;
            System.out.println(b);
            System.out.println((char)b);
        }
        in.close();
    }
//这种方式在已存在的文件中在写入数据,会覆盖原有数据
    public static void FileOutput() throws IOException {
        //创建一个文件字节输出流
        FileOutputStream out = new FileOutputStream("src\\Zhuanti\\out.txt");
        String str = "hello world!";
        byte[] b = str.getBytes();
        for (int i=0; i<b.length; i++)
        {
            out.write(b[i]);
        }
        out.close();
    }

    //追加数据,不会覆盖原有数据
    public static void AppendFileOutput() throws IOException {
        //创建一个文件字节输出流,追加数据到文件末尾
        FileOutputStream out = new FileOutputStream("src\\Zhuanti\\out.txt",true);
        String str = "hello world!";
        byte[] b = str.getBytes();
        for (int i=0; i<b.length; i++)
        {
            out.write(b[i]);
        }
        out.close();
    }
 //文件的拷贝,同时用到输入输出流
    public static void CopyFlie() throws IOException {
        InputStream in = new FileInputStream("src\\Zhuanti\\source.txt");
        OutputStream out = new FileOutputStream("src\\Zhuanti\\target.txt");

        int len;//定义一个int类型的变量len,记住每次读取的一个字节
        long begintime = System.currentTimeMillis();//拷贝前系统时间
        while ((len=in.read())!=-1)
            out.write(len);

        long endtime = System.currentTimeMillis();
        System.out.println("Copy times:"+(endtime-begintime)+"ms");

        in.close();
        out.close();
    }
 //字节流的缓冲区
    public static void BuffCopyFile() throws IOException {
        InputStream in = new FileInputStream("src\\Zhuanti\\source.txt");
        OutputStream out = new FileOutputStream("src\\Zhuanti\\target.txt");

        //用缓冲区读写文件
        byte[] buff = new byte[1024]; //定义一个字节数组,作为缓冲区

        int len; //定义len,记住读取 读入缓冲区的字节数

        long begintime = System.currentTimeMillis();

        while ((len = in.read(buff))!=-1)
            out.write(buff,0,len);//从第一个字节开始,向文件写入len个字节

        long endtime = System.currentTimeMillis();
        System.out.println("Copy times:"+(endtime-begintime)+"ms");

        in.close();
        out.close();
    }
 //IO包中提供两个待缓冲的字节流
    public static void BufferedCopyFile() throws IOException {
        //创建一个带缓冲区的输入流
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("src\\Zhuanti\\source.txt"));
        //创建一个带缓冲区的输出流
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("src\\Zhuanti\\target.txt"));
        int len;
        while ((len=bis.read())!=-1)
            bos.write(len);
        bis.close();
        bos.close();
    }

字符流:
Java在操作文件的时候使用的是字节流,但是在操作字符的时候就不太方便了,为此JDK提供了字符流。同字节流一样,字符流也有两个顶级父类,分别是Reader(字符输入流)和Writer(字符输出流)。

这里写图片描述

这里写图片描述

字符流Demo:

//从文件中直接读取字符
    public static void ReadFile() throws IOException {
        //创建一个FileReader对象用来读取文件中的字符
        FileReader reader = new FileReader("src\\Zhuanti\\text.txt");
        //定义一个变量用于记录读取的字符
        int ch;
        //循环判断是否读取到文件的末尾
        while ((ch=reader.read())!=-1)
            System.out.println((char)ch);
        reader.close();//关闭文件读取流,释放资源
    }
  public static void WriteFile() throws IOException {
        FileWriter writer=new FileWriter("out.txt");
       // FileWriter writer=new FileWriter("out.txt",true);//追加方式写入
        String str = "hello world!";
        writer.write(str);
        writer.close();
    }
  public static void ReadlineFile() throws IOException {
        FileReader reader = new FileReader("src\\Zhuanti\\source.txt");
        //创建一个bufferedReader缓冲对象
        BufferedReader br = new BufferedReader(reader);

        FileWriter writer = new FileWriter("src\\Zhuanti\\target.txt");
        //创建一个bufferedWriter缓冲对象
        BufferedWriter bw = new BufferedWriter(writer);
        String str;

        //每次读入
        while ((str=br.readLine())!=null)
        {
            bw.write(str);
            bw.newLine();//写入换行符
        }
        br.close();
        bw.close();
    }

转换流:

前面提到IO流分为字符流和字节流,有时二种流直接也需要进行转换。

  //字节流转换成字符流(只能操作文本文件)
    public static void Stream2ZF() throws IOException {
        //创建字节输入流
        FileInputStream in = new FileInputStream("src\\Zhuanti\\source.txt");
        //将字节流输入转换成字符输入流
        InputStreamReader isr = new InputStreamReader(in);
        //对字符流对象进行包装
        BufferedReader br = new BufferedReader(isr);

        FileOutputStream out = new FileOutputStream("src\\Zhuanti\\target.txt");
        OutputStreamWriter osw = new OutputStreamWriter(out);
        BufferedWriter bw = new BufferedWriter(osw);

        String line;
        while ((line = br.readLine())!=null)
            bw.write(line);

        br.close();
        bw.close();
    }

猜你喜欢

转载自blog.csdn.net/m0_37306360/article/details/79426206