IO框架(六)字符流、文件字符流
IO框架(六)字符流、文件字符流
目录
引言
如果在txt文件里的汉字用输入流FileInputStream读出会出现乱码,因为txt里的汉字是utf-8格式的,一个汉字是3个字节,但是FileInputStream里的read方法是一个字节一个字节的读,所以是乱码,所以这时就要用到字符流了
字符流的内容
- 字符流(抽象类):
- Reader(抽象类):字符输入流
- Writer(抽象类):字符输出流
- 字符流的子类:
- 文件字符流:
- FileReader(子类)
- FileWriter(子类)
- 文件字符流:
Reader(抽象类)
方法
-
public int read(){} //
-
public int read(char[] c){} //
-
public int read(char[] b,int off,int len){} //
-
Modifier and Type Method and Description abstract void
close()
关闭流并释放与之相关联的任何系统资源。void
mark(int readAheadLimit)
标记流中的当前位置。boolean
markSupported()
告诉这个流是否支持mark()操作。int
read()
读一个字符int
read(char[] cbuf)
将字符读入数组。abstract int
read(char[] cbuf, int off, int len)
将字符读入数组的一部分。int
read(CharBuffer target)
尝试将字符读入指定的字符缓冲区。boolean
ready()
告诉这个流是否准备好被读取。void
reset()
重置流。long
skip(long n)
跳过字符
Writer(抽象类)
方法
-
public void write(int n){} //
-
public void write(String str){} //
-
public void write(char[] c){} //
-
Modifier and Type Method and Description Writer
append(char c)
将指定的字符附加到此作者。Writer
append(CharSequence csq)
将指定的字符序列附加到此作者。Writer
append(CharSequence csq, int start, int end)
将指定字符序列的子序列附加到此作者。abstract void
close()
关闭流,先刷新。abstract void
flush()
刷新流。void
write(char[] cbuf)
写入一个字符数组。abstract void
write(char[] cbuf, int off, int len)
写入字符数组的一部分。void
write(int c)
写一个字符void
write(String str)
写一个字符串void
write(String str, int off, int len)
写一个字符串的一部分。
FileReader(子类)
部分方法
-
public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1
举例1
public class Demo01 {
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("D:\\aaa.txt");
//读取
//单个字符读取
System.out.println("--------------单个字符读取--------------");
int data=0;
while ((data=fr.read())!=-1){
System.out.println((char) data);
}
fr.close();
}
}
//输出:
--------------单个字符读取--------------
史
小
鹏
举例2
public class Demo02 {
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("D:\\aaa.txt");
//读取
//单个字符读取
System.out.println("--------------单个字符读取--------------");
char[] b=new char[1024];
int count=0;
while ((count=fr.read(b))!=-1){
System.out.println(new String(b,0,count));
}
fr.close();
}
}
//输出:
--------------单个字符读取--------------
史小鹏
FileWriter(子类)
部分方法
-
public int write(String str) //一次写多个字符,将b数组中所有字符,写入输出流
举例1
public class Demo03 {
public static void main(String[] args) throws Exception{
FileWriter fw = new FileWriter("D:\\练习1.txt");
//写入
for(int i=0;i<10;i++){
//写入缓冲区
fw.write("java练习\n");
//写入文件中
fw.flush();
}
fw.close();
}
}
字符流实现复制文件
注意:
-
使用FileReader和FileWriter只能复制文本文件,不能复制图片或二进制文件
-
原因:
因为图片不是字符,将图片转为字符存储会形成乱码,而将图片再次输出只会将乱码输出
实现:
public class Demo04 {
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("D:\\练习1.txt");
FileWriter fw = new FileWriter("D:\\练习2.txt");
//读写
int data=0;
while ((data=fr.read())!=-1) {
fw.write(data);//这里运行一次之后光标在最后,所有再次循环会接着往后写,而重新创建输出流会让光标从最开始起步,形成覆盖,这里是继续往后写用的同一个输出流,所以会继续往后写
fw.flush();
}
fr.close();
fw.close();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统