io流之字符流【基础流】
相对于字节流来说,字符流本身就存在:缓冲区
先解:
缓冲区:reader-->sd-->bb
作用: 缓冲区位于内存当中,大大的提高了数据的读写效率!!!!
★★★文件输入流:
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();
}
}
★★★文件输出流:
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(); //关闭流
}
}
综合小练习:字节流运用
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())); //要理解
}
}
}
}
源码解析:

浙公网安备 33010602011771号