io流之字符流【基础流】

相对于字节流来说,字符流本身就存在:缓冲区

先解:

缓冲区:reader-->sd-->bb
作用: 缓冲区位于内存当中,大大的提高了数据的读写效率!!!!

 ★★★文件输入流:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.Lucky.io.characterStream;
import java.io.FileReader;
import java.io.IOException;
 
/**
 * 缓冲区:reader-->sd-->bb
 *
 * 字符流原理解析:
 * ①创建字符输入流对象底层:关联文件,并创建缓冲区(长度为8192的字节数组)
 * ②读取数据底层:1.判断缓冲区中是否有数据可以读取
 *             2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-13.缓冲区有数据:就从缓冲区中读取。
 * 空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
 * 有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
 */
/*
作用:用于操作纯文本数据【例如:中文】
     字符流【底层也是字节流+字符集】:
           1.FileReader文件输入流   2.FileWriter文件输出流
 */
/**
 * FileReader文件输入流:
 *                      1.创建
 *                      2.读取数据
 *                      3.关闭资源
 */
 
/*
    无参read()的细节:  底层也是字节流,默认情况下,还是一个字节一个字节地读取,遇到中文就会一次读取多个字节
                1.读取之后,方法底层还会进行解码并转换成十进制,最后将这个十进制数据返回
                2.返回的十进制数据也是字符集上的数字
 */
    /*
    有参read()的细节:  底层也是字节流,默认情况下,还是一个字节一个字节地读取,遇到中文就会一次读取多个字节
                1.读取之后,方法底层还会进行解码并转换成十进制,
                2.然后自动将十进制的数据转换成char类型数据返回
 */
public class fileReaderDemo {
    public static void main(String[] args) throws IOException {
        //无参Read()
        System.out.println("---无参Read()-----");
        FileReader reader=new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\readerTest.txt");
        int val;
        while ((val=reader.read())!=-1){
            System.out.print((char) val);
        }
 
        reader.close();
 
 
 
        //有参Read(char[] arr)
        System.out.println();
        System.out.println("---有参Read(char[] arr)-----");
        FileReader fr=new FileReader("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\readerTest.txt");
         char[] arr=new char[2];
        int nb;
        while ((nb=fr.read(arr))!=-1){
 
            System.out.print(new String(arr,0,nb));
        }
 
        fr.close();
 
 
 
    }
}

  

★★★文件输出流:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.Lucky.io.characterStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
/**
 * FileWriter文件输出流:
 *                      1.创建
 *                      2.读取数据
 *                      3.关闭资源
 */
/*
         ★★★细节:  跟字节输出流不一样,【字节输出流是一次输出一个字节,字符输出流是一次输出一个字符】
                其他的跟FileInputStream的差不多[方法存在部分差异]
 
                ★★★     【注意点:1个字符=2个字节】    ★★★
 */
 
public class fileWriterDemo {
    public static void main(String[] args) throws IOException {
//        FileWriter writer=new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\WriterTest.txt");
//
//        System.out.println("-------------writer(int c)---------------");
//        writer.write(97);
//
//        System.out.println("-------------writer(String str)---------------");
//        writer.write("ai你哟,宝贝");
//
//            System.out.println("-------------writer(String str,int off,int len)---------------");
//        writer.write("ai你哟,宝贝",4,3);
//
//        System.out.println("-------------writer(char[] arr)与writer(char[] arr,int off,int len)---------------");
//        char[] arr={'你','最','近','还','好','吗','?','m','u','a'};
//        writer.write(arr);
//        writer.write(arr,7,3);
//        writer.close();
 
        System.out.println("-------------续写---------------");
        FileWriter writerNext=new FileWriter("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\WriterTest.txt",true);
        char[] RR={'m','u','a'};
        writerNext.write(RR,0,3);
    ///////////////////////////////////底层分析////////////////////////////////////////////////////
/*
      调用字符输出流的write方法之后,会将数据先写入到缓冲区中【可以使用DeBug模式查看sd-->bb】
      缓冲区的大小是8192字节的byte数组,会尽量将缓冲区的内存填充完整再输出到指定文件中
      将缓冲区的数据输出到指定文静中的三个条件: 1.默认在关闭流【colse】的时候将数据输出到指定文件中
                                        2.手动刷新缓冲区的数据flush
                                        3.当缓冲区被填满的时候会自动将缓冲区的数据输出到文件中,并且清空缓冲区
 
 */
 
        char[] arrNB={'缓','冲','中','的','数','据','?','m','u','a'};
        writerNext.write("SB");
        writerNext.write(arrNB,7,3);
        writerNext.write("SB");
        writerNext.flush();   //刷新缓冲区的数据
        writerNext.write("NB");
        writerNext.close();  //关闭流
 
 
    }
}

  综合小练习:字节流运用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.Lucky.io.characterStream;
 
import java.io.*;
 
/*
拷贝文件夹:   要考虑子文件
 */
public class copyFileClamp {
    public static void main(String[] args) throws IOException {
        //文件源和目标
        File startF=new File("F:\\学习\\导出Jar包【官方】\\poi-bin-5.0.0-20210120");
        File endF=new File("F:\\学习\\导出Jar包【官方】\\CS");
 
      copydir(startF,endF);
    }
 
    /**
     * 拷贝文件夹的方法
     * 参数一:数据源
     * 参数二:目标
     * @param startF
     * @param endF
     */
    private static void copydir(File startF, File endF) throws IOException {
        //判断目标文件夹是否存在
        if(!endF.exists()){
            //不存在就创建
            endF.mkdirs();
        }
 
        //1.进入文件夹
        File[] files = startF.listFiles();
        //2.循环文件夹
        for (File file : files) {
            //3.判断{要明白到底是文件还是文件夹}
            if(file.isFile()){  //是文件时,此时目标路径中不存在该文件,就要根据数据源创建一个一样的文件
                //创建字节流  outputStream代表的是:目标文件【要正确理解路径】
                FileInputStream inputStream=new FileInputStream(file);   //读取对象
                FileOutputStream outputStream=new FileOutputStream(new File(endF,file.getName()));      //输出对象
                byte[] arr=new byte[1024];
                  //拷贝
                int val;
                while ((val=inputStream.read(arr))!=-1){
                    outputStream.write(arr,0,val);
                }
 
                //关闭流【先开后关】
                outputStream.close();
 
            }else //文件夹 :递归  不是文件时,此时目标路径中不存在该文文件夹,要创建该文件夹
                copydir(file,new File(endF,file.getName()));  //要理解
            }
 
        }
 
 
 
 
 
 
    }
}

  源码解析:

 

 

posted @   唯易人生  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示