IO流练习

package com.li.AIO流;

import java.io.*;

/**
 * @author LiWL
 * @data 2021/12/9 0:39
 */
public class Test1 {

    /**
     * 1、字节流  字节流读取单个字节  一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节
     * InputStream  OutputStream
     * <p>
     * 2、字符流  字符流读取单个字符  字符流用来处理文本文件
     * Reader Wirter
     * <p>
     * 读取和写入,其实就是获取(输入)数据和输出数据。
     */
//    ==============================================读取控制台中的输入=============================================================

    /**
     * BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
     * InputStreamReader:将一个字节的输入流转换为字符的输入流
     * OutputStreamWriter:将一个字符的输出流转换为字节的输出流
     * 作用:提供字节流与字符流之间的转换
     */

    public static void test01() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入一个字符");
        char c;
        c = (char) bufferedReader.read();
        System.out.println("你输入的字符为" + c);
    }

    /**
     * do-while是while的特殊种类,do-while会先运行一次do里的代码,
     * 然后进行while的Boolean判定,然后返回按照do里的方法重新运行。
     * (先执行,后判断的while)
     */
    public static void test02() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入一个字符,按 q 键结束");
        char c;
        do {
            c = (char) bufferedReader.read();
            System.out.println("你输入的字符为" + c);
        } while (c != 'q');
        System.out.println("结束输出");
    }


    public static void test03() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入一行字符");
        String str = bufferedReader.readLine();
        System.out.println("你输入的字符为" + str);
    }


//    ==============================================二进制文件的写入和读取======================================================

    /**
     * FileOutputStream流是指文件字节输出(写入)流,专用于输出原始字节流如图像数据等
     * FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等
     */

    public static void test04() throws IOException {
        byte[] bytes = {12, 21, 34, 11, 21};
        //没有则会创建
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\").getAbsolutePath() + "/测试.txt");
        // 写入二进制文件,直接打开会出现乱码
        fileOutputStream.write(bytes);
        fileOutputStream.close();
    }

    public static void test05() throws IOException {
        FileInputStream fileInputStream = new FileInputStream(new File("D:\\").getAbsolutePath() + "/测试.txt");
        int c;
        // 读取写入的二进制文件,输出字节数组
        while ((c = fileInputStream.read()) != -1) {
            System.out.print(c);
        }
    }

//    ====================================================文本文件的写入和读取=====================================================


    /**
     * FileWriter
     * 如果这个文件不存在,那么就会帮我们自动创建一个
     * 如果这个纯文本文件已经存在,并且里面有内容,此时我们再添加内容,就会覆盖掉这个纯文本文件已有的内容
     * 那我不想覆盖,想追加内容可以做到吗?
     * 当然可以,我们只需要在创建对象的时候,选择另外一个构造方法就可以追加而不是覆盖。创建对象的时候我们这样创建:
     * FileWriter fw = new FileWriter("file01.txt",true);
     * 我发现写到纯文本文件里头的数据都是在同一行的,能不能换行呢? + \n
     * write() 方法和 append() 方法并不是像方法名那样,一个是覆盖内容,一个是追加内容,
     */

    public static void test06() throws IOException {
        //默认覆盖,追加 + true
        FileWriter fileWriter = new FileWriter(new File("D:\\").getAbsolutePath()+"/测试.txt",true);
        fileWriter.write("Hello,world!\n欢迎来到 java 世界\n");
        fileWriter.write("不会覆盖文件原本的内容\n");
//        fileWriter.write(null); 不能直接写入 null
        fileWriter.append("并不是追加一行内容,不要被方法名迷惑\n");
        fileWriter.append(null);
        fileWriter.flush();
        System.out.println("文件的默认编码为" + fileWriter.getEncoding());
        fileWriter.close();
    }


    public static void test07() throws IOException {
        // 关闭追加模式,变为覆盖模式
        FileWriter fileWriter = new FileWriter(new File("D:\\").getAbsolutePath()+"/测试.txt", false);
        fileWriter.write("Hello,world!欢迎来到 java 世界\n");
        fileWriter.write("我来覆盖文件原本的内容");
        fileWriter.append("我是下一行");
        fileWriter.append("追加成功");
        fileWriter.flush();
        System.out.println("文件的默认编码为" + fileWriter.getEncoding());
        fileWriter.close();
    }


    public static void test08() throws IOException {
        FileReader fileReader = new FileReader(new File("D:\\").getAbsolutePath()+"/测试.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String str;
        while ((str = bufferedReader.readLine()) != null) {
            System.out.println(str);
        }
        fileReader.close();
        bufferedReader.close();
    }


    public static void test09() throws IOException {
        FileReader fileReader = new FileReader(new File("D:\\").getAbsolutePath()+"/测试.txt");
        int c;
        while ((c = fileReader.read()) != -1) {
            System.out.print((char) c);
        }
    }

//===========================================================================================================================


    /**
     * 使用字节流和字符流的转换类
     * InputStreamReader 和 OutputStreamWriter 可以指定文件的编码,使用 Buffer 相关的类来读取文件的每一行。
     */

    public static void test10() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\").getAbsolutePath()+"/测试.txt");
        // 使用 GBK 编码文件
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
        outputStreamWriter.write("Hello,world!\n欢迎来到 java 世界\n");
        outputStreamWriter.append("另外一行内容");
        outputStreamWriter.flush();
        System.out.println("文件的编码为" + outputStreamWriter.getEncoding());
        outputStreamWriter.close();
        fileOutputStream.close();
    }


    public static void test11() throws IOException {
        FileInputStream fileInputStream = new FileInputStream(new File("D:\\").getAbsolutePath()+"/测试.txt");
        // 使用 GBK 解码文件
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String str;
        while ((str = bufferedReader.readLine()) != null) {
            System.out.println(str);
        }
        bufferedReader.close();
        inputStreamReader.close();
    }










}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值