Java IO流简介、对文件的读取和复制

目录

1. IO流

1.1 缓冲的概念

1.2 IO流的分类

2. 读取文件

2.1 字节输入流

2.2 字节输出流

2.3 字符输入流

2.4 字符输出流

3. 对文件的复制


1. IO流

        在读取的时候,会将文件(图片,音频,视频等)变成流的形式 ,一点一点来处理拆解开出来的。 

1.1 缓冲的概念

        IO流 的本质就是对电脑的文件进行读和写的。
        计算机通过CPU内存读取磁盘上面的文件数据,一次读取1字节。但是可以加上缓冲的概念,每次读取固定大小。效率会提高。

1.2 IO流的分类

输入流分为两种:

        1.字节输入流  FileInputStream

        2.字符输入流 FileReader

输出流分为两种:

        1.字节输出流 FileOutputStream

        2.字符输出流 FileWriter

2. 读取文件

2.1 字节输入流

例:磁盘上面有一个1.txt文件,现在要将1.txt文件中的内容读取到内存(Java代码中)。

        Java封装好了类: FileInputStream 文件输入流(字节输入流)。

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        // 将磁盘上面的c:/aaa/1.txt文件这个数据读取到内存(Java)中
        // 创建File对象,是本地磁盘文件的一个File对象
        File file = new File("c:/aaa/1.txt");
        // 创建文件字节输入流对象,来操作1.txt
        // 将c:/aaa/1.txt文件转为字节输入流的形式,之后可以按照流的形式读取到内存中
        FileInputStream fis = new FileInputStream(file);
        // BufferedInputStream为另一个输入流添加了功能,即缓冲输入
        // FileInputStream就具备了缓冲的功能
        BufferedInputStream bis = new BufferedInputStream(fis);
        // 当创建BufferedInputStream时
        // 将创建一个内部缓冲区数组,这个数组的数据类型是byte
        // 当缓冲数组是几个字节的时候,每次读取的时候存到缓冲数组中,就只存几个字节
        byte[] buf = new byte[1024 * 4];//缓冲区4096字节
        // 现在数组是空的
        // public int read(byte[] b) throws IOException
        // 从输入流读取一些字节数,并将它们存储到缓冲区b,实际读取的字节数作为整数返回
        // 将1.txt文件的内容 读取到缓冲数组buf里面
        // 如果没有字节可用,因为流在文件末尾,则返回值-1
        int length = -1;
        //如果length=-1  那么就会到达流的末尾  就证明后面没有数据
        //循环结束,不会再读了
        while ((length = bis.read(buf)) != -1) {
            System.out.println(new String(buf));
        }
        // 流是需要关闭的
        bis.close();
        fis.close();
    }
}

2.2 字节输出流

        将Java中数据写入到磁盘上面。

例:如Java代码中有一个字符串 String str = "我就是我";将这个字符串写入磁盘某一个文件中

        Java封装好了类: FileOutputStream文件输入流(字节输入流)。

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        // 将Java代码中的一个字符串写入到磁盘的某一个文件中
        // 创建File对象,文件路径对象,告知编译器要把数据写到哪个文件中
        File file = new File("c:/aaa/2.txt");
        // 实例化字节输出流对象
        FileOutputStream fos = new FileOutputStream(file);
        // 对FileOutputStream加上缓冲的效果
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 将一个字符串写入到磁盘中
        String str = "我就是我";
        // 将str字符串转为字节数组
        byte[] bytes = str.getBytes();
        bos.write(bytes);
        bos.flush();// 没有实际的意义,可以不写的
        // 关闭流
        // 在输入流的时候一定是先开的后关,后开的先关
        bos.close();
        fos.close();
    }
}

2.3 字符输入流

        也是输入流,将磁盘的某一个文件读取到内存。

        FileReader是一个阅读字符文件的便利类,是专门处理字符文件的。比如txt文件。音频视频图片不能使用这个流。

        FileReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

        牵涉到解码,底层是字节流,但是会解码为字符。如果解码失败就意味着咱们读取失败了

一般不会使用字符流操作图片 音频 视频等,因为牵涉到解码。

        开发一般使用字节流!!!

import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        // 将c盘下面的aaa文件夹下面的1.txt文件的内容 读取到Java内存中
        // 新建一个File对象
        File file = new File("c:/aaa/1.txt");
        // 新建字符输入流FileReader对象
        FileReader fr = new FileReader(file);
        // FileRFeader没有缓冲的效果,可以加上缓冲的效果
        BufferedReader br = new BufferedReader(fr);
        // 字符的缓冲数组是字符
        char[] cbuf = new char[4];//缓冲区是4个字符
        // read(char[] cbuf) 将文件内容读取到字符数组中(缓冲区)
        int length = -1;
        while ((length = br.read(cbuf)) != -1) {
            // 将数组展示到控制台
            System.out.println(new String(cbuf, 0, length));
        }
        // 关闭流
        br.close();
        fr.close();
    }
}

2.4 字符输出流

例:将一个字符串类型的数据写入到磁盘中

        FileWriter写字符文件一个便利类。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        // 从内存写入数据到磁盘的文件中
        File file = new File("c:/aaa/2.txt");
        FileWriter fw = new FileWriter(file);
        // 加缓冲流
        BufferedWriter bw = new BufferedWriter(fw);
        // viod writer(char[] cbuf, int off, int length);
        String str = "今天的天气真的太热了";
        // 将字符串转为char数组
        char[] chars = str.toCharArray();
        // 将chars数组中  从0 开始  取3个字符写入到缓冲流中
        bw.write(chars, 3, 3);
        // 关闭流
        bw.close();
        fw.close();
    }
}

3. 对文件的复制

import java.io.*;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("D:/桌面/aaa/斗破苍穹.txt")));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:/桌面/aaa/bbb/斗破苍穹.txt")));

        byte[] buf = new byte[4 * 1024];
        int length = -1;
        while ((length = bis.read(buf)) != -1) {
            bos.write(buf, 0, length);
        }
        bos.close();
        bis.close();
    }
}

你可能感兴趣的:(java)