Java基础IO流介绍之四——什么是字符流、常用的字符流有哪些
字符流
1、简介
1、概述
char 2个字节 ----->在 jvm中 默认采用的是 unicode编码 占2个字节
在操作系统中:
在所有的编码表中 英文字符都占1个字节 ,汉字 在 GBK中 占2个字节 ,在UTF-8中占 3个字节
案例:
import java.io.File;
import java.io.FileInputStream;
public class Demo9 {
public static void main(String[] args) throws Exception{
//使用字节流 读取 a.txt中的内容
File file = new File("file/a.txt");
FileInputStream fileInputStream = new FileInputStream(file);
//读取 一个字节
// int read1 = fileInputStream.read();
// System.out.println((char)read1);
// int read2 = fileInputStream.read();
// System.out.println((char)read2);
// int read3 = fileInputStream.read();
// System.out.println((char)read3);
//读取一个字节数组
byte[] data = new byte[4];
int len;
while ((len = fileInputStream.read(data))!=-1){
System.out.println(new String(data,0,len));
}
fileInputStream.close();
}
}
2、顶级父类
Writer
Reader
3、子类
FileWriter:文件字符输出流
FileReader:文件字符输入流
2、文件字符输出流——FileWriter
2.1、构造方法
FileWriter(File file)
给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append)
给一个File对象构造一个FileWriter对象。。
FileWriter(String fileName)
构造一个给定文件名的FileWriter对象。
FileWriter(String fileName, boolean append)
构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。
2.2、常用方法
void close()
关闭流,先刷新。
void flush()
刷新流。
void write(char[] cbuf)
写入一个字符数组。
void write(char[] cbuf, int off, int len)
写入字符数组的一部分。
void write(int c)
写一个字符
void write(String str)
写一个字符串
void write(String str, int off, int len)
写一个字符串的一部分。
//案例:
import java.io.File;
import java.io.FileWriter;
public class Demo10 {
public static void main(String[] args) throws Exception{
//创建字符流对象
// File file = new File("file/a.txt");
// FileWriter fileWriter = new FileWriter(file);
FileWriter fileWriter = new FileWriter("file/a.txt");
}
}
//案例2:
import java.io.File;
import java.io.FileWriter;
public class Demo10 {
public static void main(String[] args) throws Exception{
//创建字符流对象
// File file = new File("file/a.txt");
// FileWriter fileWriter = new FileWriter(file);
FileWriter fileWriter = new FileWriter("file/a.txt",true);
// char c = '刘';
// fileWriter.write(c);//说明 内部有缓冲区
String s = "落霞与孤鹜齐飞,秋水共长天一色";
// char[] chars = s.toCharArray();
// fileWriter.write(chars);
fileWriter.write(s);
fileWriter.flush();
fileWriter.close();
}
}
2.3、复制文本文件
案例:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class Demo12 {
public static void main(String[] args) throws Exception{
//创建两个File对象
File srcFile = new File("file/a.txt");
File dirFile = new File("dir/a.txt");
//创建字符流
FileReader fileReader = new FileReader(srcFile);
FileWriter fileWriter = new FileWriter(dirFile);
//一边读一边写
// 第一种 每次复制一个字符 所用的时间为:4448300纳秒
long start = System.nanoTime();
// int data;
// while ((data = fileReader.read())!=-1){
// fileWriter.write(data);
// }
//第二种 每次复制一个字符数组 608500纳秒
char[] data = new char[1024*8];
int len;
// while ((len = fileReader.read(data))!=-1){
// fileWriter.write(data,0,len);
// }
//第三种
while ((len = fileReader.read(data))!=-1){
fileWriter.write(new String(data,0,len));
}
long end = System.nanoTime();
System.out.println("所用的时间为:"+(end - start)+"纳秒");
fileReader.close();
fileWriter.close();
}
}
3、文件字符输入流——FileReader
3.1、构造方法
FileReader(File file)
创建一个新的 FileReader ,给出 File读取。
FileReader(String fileName)
创建一个新的 FileReader ,给定要读取的文件的名称。
3.2、常用方法
int read()
读一个字符
int read(char[] cbuf)
将字符读入数组。
abstract int read(char[] cbuf, int off, int len)
将字符读入数组的一部分。
//案例:
import java.io.File;
import java.io.FileReader;
public class Demo11 {
public static void main(String[] args) throws Exception{
File file = new File("file/a.txt");
FileReader fileReader = new FileReader(file);
//每次可以读取一个字符
// int read = fileReader.read();//根据当前的编码环境 进行动态的读取
// System.out.println((char) read);
// int data ;
// while ((data = fileReader.read())!=-1){
// System.out.println((char)data);
// }
// 每次读取一个字符数组
char[] piao = new char[3];
int len;
// while (true){
// len = fileReader.read(piao);
// if (len == -1){
// break;
// }
// System.out.print(new String(piao,0,len));
// }
while ((len = fileReader.read(piao))!=-1){
System.out.print(new String(piao,0,len));
}
fileReader.close();
}
}