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())); //要理解 } } } } |
源码解析:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律