IO流

IO流

用于读写文件中的数据(可以读写文件,或网络中的数据...)

IO流的分类

  • 输出流:程序将数据写进文件中
  • 输入流:程序读取文件中的数据

IO流的基本操作及常用类

字节流

【1】FileOutputStream

/**
 * FileOutputStream
 * 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
 * 操作步骤:1,创建字节输出流对象
 *              a.参数是字符串表示的路径或者是File对象都是可以的
 *              b.如果文件不存在会创建新文件,只要文件的父级目录是存在的
 *              c.如果文件已经存在,会清空文件
 *          2,写数据
 *          3,释放资源:每次使用完流后都要释放资源,不然java一直占用着文件
 *          
 */
public class demo1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("streamStudy\\b.txt");
        fos.write(97);//打印出字符a
        fos.close();
    }
}

FileOutputStream写数据的几个小问题:

public class demo2 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("\\a.txt");
      	//如果要续写,打开第二个参数,置为true
      
        //1.写入一串字母zhang
        //2.换行继续写一个666
        String arr1 = "zhang";
        byte[] bytes1 = arr1.getBytes();
        fos.write(bytes1);
        
        //换行操作符 Mac:\r
        String arr3 = "\r";
        byte[] bytes3 = arr3.getBytes();
        fos.write(bytes3);

        String arr2 = "666";
        byte[] bytes2 = arr2.getBytes();
        fos.write(bytes2);

        fos.close();
    }
}

【2】FileInputStream

public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("\\a.txt");
        int bytes = fis.read();//在文件中,以ASCII码存储字符。所有取出来的一个整数
        System.out.println((char) bytes);
        fis.close();
    }
}

【3】文件拷贝

public class Demo4 {
    public static void main(String[] args) throws IOException {
        int midst;
        FileInputStream fis = new FileInputStream("被读文件地址");
        FileOutputStream fos = new FileOutputStream("数据写入文件的地址");
        //文件拷贝 规则:边读边写
        while ((midst = fis.read()) != -1 ){
            fos.write(midst);
        }
        //释放资源 先创建的后释放
        fos.close();
        fis.close();
    }
}

注:FileInputStream的read()方法一次只读取一个字节

字符流

GBK字符集

  • 汉字两个字节存储在计算机中
  • 高位字节二进制一定以1开头,转成十进制后是个负数

Unicode字符集:万国码

Unicode字符集编码方式:

  • UTF-16(Unicode Transfer Format):用2~4个字节保存
  • UTF-32:固定用4个字节保存
  • UTF-8:用1~4个字节保存 (中文用3个字节保存)

为什么有乱码:

  • 读取数据时未读完整个汉字
  • 编码和解码的方式不统一(关键)

【4】字符输入流

字符流的底层就是字节流

public class Demo5 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("\\a.txt");
        int midst;
        while ((midst = fr.read()) != -1){
            System.out.println((char)midst);
        }
        fr.close();
    }
}

【5】字符输出流

注:如果文件已经存在,会清空文件,不想清空可以打开续写开关;文件不存在则会在父目录下新建。

【6】使用场景

  1. 字节流 :拷贝任意类型的文件
  2. 字符流 :读取纯文本文件中的数据;往纯文本文件中写出数据

缓冲流

字节缓冲流:底层自带了长度为8192的缓冲区提高性能

/**
 * 利用字节缓冲流拷贝文件
 * 字节缓冲输入/输出流的构造方法
 */
public class Demo6 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("\\a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("\\b.txt"));

        int midst;//边读出边写入
        while((midst = bis.read()) != -1){
            bos.write(midst);
        }

        bos.close();//新创建的字节输入流输出流不用在这里释放,已经在封装的方法中释放了
        bis.close();
    }
}
/**
 * 字符缓冲输入流
 * 构造方法:
 *      public BufferedReader(Reader in);
 * 特有方法:
 *      public String readLine();读一整行
 */
public class Demo7 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("\\a.txt"));
        System.out.println(br.readLine());
        br.close();
    }
}
/**
 * 字符缓冲输出流
 * 构造方法:
 *      public BufferedWriter(Writer in);
 * 特有方法:
 *      public String newLine();跨平台换行
 */
public class Demo7 {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("\\a.txt"));
        String s = "你嘴角上扬的样子,";
        bw.write(s);
        bw.newLine();
        bw.write("百度搜索不到。");
        bw.close();
    }
}

转换流

转换流是字符流和字节流之间的桥梁。将内存中的字符流转成字节流放入文件。文件也是输出字节流通过转换流变成字符流在内存中移动。

作用:

  • 字节流想要使用字符流中的方法。

序列化流/对象操作输出流

可以把JAVA中的对象写到本地文件中。

IO流常用工具包

commons-io

  • 提高io流开发的效率

Hutool工具包

posted @ 2023-02-28 20:59  安静的美美  阅读(30)  评论(0编辑  收藏  举报