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 voidclose()关闭流并释放与之相关联的任何系统资源。voidmark(int readAheadLimit)标记流中的当前位置。booleanmarkSupported()告诉这个流是否支持mark()操作。intread()读一个字符intread(char[] cbuf)将字符读入数组。abstract intread(char[] cbuf, int off, int len)将字符读入数组的一部分。intread(CharBuffer target)尝试将字符读入指定的字符缓冲区。booleanready()告诉这个流是否准备好被读取。voidreset()重置流。longskip(long n)跳过字符
Writer(抽象类)
方法
-
public void write(int n){} // -
public void write(String str){} // -
public void write(char[] c){} // -
Modifier and Type Method and Description Writerappend(char c)将指定的字符附加到此作者。Writerappend(CharSequence csq)将指定的字符序列附加到此作者。Writerappend(CharSequence csq, int start, int end)将指定字符序列的子序列附加到此作者。abstract voidclose()关闭流,先刷新。abstract voidflush()刷新流。voidwrite(char[] cbuf)写入一个字符数组。abstract voidwrite(char[] cbuf, int off, int len)写入字符数组的一部分。voidwrite(int c)写一个字符voidwrite(String str)写一个字符串voidwrite(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();
}
}

浙公网安备 33010602011771号