字符流,打印流的讲解及使用

字符流

字符流:只能操作文本文件,其他类型文件,不能操作.局限性很大
JDK中的字符流:字节流+编码表组成而来的

Writer:所以字符输出流的父类
  • 只能写入文本文件
  • 方法都是write
    。write(int c)写入单个字符
    。write(char[] ch)写入字符数组
    。write(char[] ch,int off,int len)写入字节数组的一部分
    。write(String str)写入字符串
转换流

OutputStreamWriter转换流,继承Writer,也是字符的输出流
转换:字符流通向字节流的桥梁,字符流转成字节流
字符:查询指定的编码表,变成字节,传递到字节流中

  • OutputStreamWriter类构造方法
    。OutputStreamWriter( OutpUtStream out)传递字节输出流,使用系统默认编码表GBK
    。OutputStreamWriter(OutputStream out,String charsetName)传递字节输出流,指定编码表
  • 注意:字符流写入数据,查询编码表,查询完了就完了
    。查询编码表后的字节,写入到文件去:方法flush()
public static void main(String[] args) throws IOException{
	writeGBK();
}
/*
*系统默认的编码表GBK
*创建转换流对象,构造方法传递字节输出流
*/
public static void writeGBK() throws IOException{
	//创建转换流对象,构造方法传递字节输出流
	OutputStreamWriter osw =
	new OutputStreamWriter(new FileOutputStream(" gbk.txt"));
	//写入字符串.
	osw. write("你好");
	osw. flush();
	osw.close();
}
/*
*指定的编码表UTF-8
*创建转换流对象,构造方法传递字节输出流,传递编码表名字
*/
public static void writeUTF() throws IOException{
	//创建转换流对象,构造方法传递字节输出流,传递编码表名字
	OutputStreamWriter osw =
	new OutputStreamWriter(new FileOutputStream( "utf.txt"), "utf-8");
	//写入字符串.
	osw. write("你好");
	osw. flush();
	osw.close();
}
Reader:所以字符输入流的父类
  • 只能读取文本文件
  • 方法都是read,读取到文件末尾返回 -1
    。int read(int c)读取单个字符
    。read(char[] ch)读取字符数组,返回读取到的字符个数;读取到文件末尾返回-1
转换流

InputStreamReader转换流,继承Reader,也是字符的输入流
转换:InputStreamReader是字节流,通向字符流的桥梁,字节转成字符
字符:根据读取的字节,查询编码表转成字符

  • InputStreamReader构造方法
    。InputStreamReader(InputStream in)传递任意字节输入流,系统默认的编码表GBK
    。InputStreamReader(InputStream in,String charsetName)传递任意字节输入流,指定编码表
/*
*转换流: InputStreamReader
*读取文本文件,默认的编码表,和指定的编码表
*/
public static void main(String[] args) throws IOException{
	readGBK();
	readUTF();
}
/*
*系统默认的编码表GBK
*创建转换流对象,传递字节输入流
*/
public static void readGBK() throws IOException{
	//创建转换流对象,传递字节输入流
	InputStreamReader isr =
	new InputStreamReader(new FileInputStream("gbk . txt"));
	//读取字符数组
	char[] chs = new char[1024];
	//int变量,保存read()方法的返回值
	int len=0;
	while( (len = isr.read(chs)) !=-1) {
		System. out. println(new String(chs,0,len ) ) ;
	}
	isr. close();
}
/*
*指定编码表UTF-8
*创建转换流对象,传递字节输入流,传递编码表名字
*/
public static void readUTF() throws IOException{
	//创建转换流对象,传递字节输入流,传递编码表
	InputStreamReader isr =
	new InputStreamReader(new FileInputStream("utf. txt"), "UTF-8");
	//读取字符数组
	char[] chs = new char[1024] ;
	//int变量,保存read()方法的返回值
	int len=0;
	while( (len = isr.read(chs)) !=-1) {
		System. out. print1n(new String(chs,B,len ));
	}
	isr. close();
}
FileWriter

写入字符文件的便捷类
FileWriter继承OutputStreamWriter,继承Writer
方便之处,FileWriter类只能使用系统默认的编码表
FileWriter类构造方法:

  • FileWriter(File file)传递File对象
  • FileWriter(File file,boolean append),传递File对象,传递的是true,文件追写
  • FileWriter(String filename),传递字符串文件名
  • FileWriter(String filename,boolean append),传递字符串文件名
/*
*字符输出流的便捷类,写入数据
*编码表固定,系统默认的
*/
public static void main(String[] args) throws IOException {
	//创建便捷类对象,构造方法传递字符串文件名.
	FileWriter fw = new FileWriter("abc.txt" );
	//写入单个字符
	fw. write(97);
	//字符流写入数据,需要刷新的
	fw. flush();
	//写入字符数组
	char[] ch ="你好,我的程序世界OK" . toCharArray( ) ;
	fw. write(ch);
	fw. flush();
	//写入数组一部分
	fw.write(ch, 2, 3);
	fw. flush();
	//写入字符串
	fw. write("写字符串hehe,嘻嘻");
	fw. flush();
	fw. close();
}
  • 字符输出流的方法flush)和close()区别
    。flush() 刷新该流的缓冲,数据从内存刷新到目的文件
    。close()关闭流, 关闭之前刷新
    。flush() 方法,刷新后,流对象可以继续使用
    。close()关闭流也刷新,但是流对象,不能在使用
FileReader

读取字符文件的便捷类
FileReader继承InputStreamReader继承Reader
方便之处,FileReader类只能使用系统默认的编码表
FileReader构造方法

  • FileReader(File file)传递File类型对象
  • FileReader(String filename)传递字符串的文件名
/*
*字符输入出流的便捷类,读取数据
*编码表固定,系统默认的
*/
public static void main(String[] args) throws I0Exception{
	// 创建便捷类对象,构造方法传递文件名
	FileReader fr = new FileReader("abc . txt" );
	//变量,保存read()方法的返回值
	int len = 0;
	char[] chs=new char[1024];
	while( (len = fr.read(chs)) !=-1) {
		System. out . print(new SString(chs,0,len);
	}
	fr. close();
}
字符流子类父类的区别
  • 字符输出流
    。OutputStreamWriter父类:写入文本文件的时候:指定编码表
    。FileWriter子类:写入文本文件的时候,编码表只能使用系统默认的
  • 字符输入流
    。InputStreamReader父类:读取文本文件的时候:指定编码表
    。FileReader子类:读取文本文件的时候,编码表只能使用系统默认的
  • 字符流应用,一直就是系统默认编码,建议使用子类,需要自己指定,只能使用父类

字符流的缓冲流

BufferedWriter字符输出流的缓冲区流

BufferedWriter类继承Writer,本身也是字符的输出流
对字符,数组,或者是字符串的高效写入
字符输出流缓冲流的最重要的功能

  • void newLine()写入换行符号
    。自己手动使用\r\n实现换行,不推荐使用
    。推荐使用newLine()方法,具有平台无关性
    。Windows系统换行\r\n,Linex系统换行\n,Max系统换行\r
    BufferedWrite类的构造方法
  • BufferedWriterWriter W)传递任意的字符输出流,传递哪个流,就高效哪个流
    。两个选择:FileWriter OutputStreamWriter
/*
*字符输出流的缓冲流,写入文本文件
*写入换行
*/
public static void main(String[] args )throws IOException {
	//创建字符输出流,绑定文件
	FileWriter fw = new FileWriter( "buffer . txt");
	//创建字符输出流的缓冲流,构造方法传递字符输出流
	BufferedWriter bfw =new BufferedWriter(fw);
	bfw. write("第一行");
	//缓冲流对象的方法newLine()换行
	bfw. newLine( );
	bfw. write("第二行");
	bfw. newLine( );
	bfw. write("第三行");
	bfw. close();
}
BufferedReader字符输入流的缓冲区流

BufferedReader类继承Reader,本身是字符输入流
实现字符,数组,行的高效读取
字符输出流缓冲流的最重要的功能

  • String readLine()读取文本一行,返回字符串
    BufferedReader类构造方法
  • BufferedReader(Reader r)传递任意的字符流,传递谁,就对谁高效
    。FileReader类,InputStreamReader
/*
*字符输入流缓冲区,读取文本文件
*按照行来读取
*readLine()方法,读取到文件末尾,返回bull
*readLine()方法读取一行字符串,不包含换行符\r\n
*/
public static void main(String[] args) throws IOException {
	//创建字符输入流,绑定数据源文件
	FileReader fr = new FileReader("buffer. txt");
	//创建字符输入流的缓冲区流
	BufferedReader bfr = new BufferedReader(fr);
	//读取方法readline()读文本行
	String line = null;
	while((line=bfr. readLine())!=null){
	System. out . println(line);
	}
	bfr . close();
}
字符流复制文件问题

只能操作文本文件,局限性很大
不能复制文件,如果需要文件复制,选择字节流

字符流用途案例

提供数据:多个姓名和年龄,存储在文本文件
读取数据,每个人,按照年龄排序,排序后的结果,存储到新的文件中
思想:文本中的数据,读取到集合,对集合中的元素排序,排序后的内容写回到文件中
实现步骤:
1读取文件person. txt
2.文件中的数据,转成Person对象
3.对象多了,存储到集合
4.集合排序Collections.工具类
5.集合中的对象,写回文件中

public static void main(String[ ] args) throws IOException{
	// 读取person.txt,按行读取
	BufferedReader bfr. = new
		BufferedReader( new FileReader("person. txt"));
	//创建List集合,存储多个Person对象
	List<Person> list = new ArrayList<Person>();
	while( (line = bfr. readLine())!=null) {
		//切割方法,分类姓名和年龄
		String[] strs = line.split(" +");// 0索引是姓名,1索引是年龄
		//创建Person对象
		Person p = new Person(strs[0], Integer. parseInt(strs[1]));
		list . add(p);
	}
	bfr.close();
	//集合排序,自定义比较器
	Collections. sort(list,new Comparator<Person>() {
		public int compare(Person p1, Person p2) {
			return p1. getAge() - p2. getAge();
		}
	});
	//字符输出缓冲流
	BufferedWriter bfw = new BufferedWriter(new FileWriter(" personSort .txt"));
	//遍历集合,取出一个Person对象,写入一个
	for(Person p : list) {
		bfw. write(p. getName( )+" "+p. getAge());
		bfw. newLine( ) ;
		bfw. flush();
	}
	bfw. close();
}

打印流

java.io.PrintStream字节输出流
java.io.PrintWriter字符输出流

  • 打印流的特点:
    。打印流,只负责数据目的,不负责数据来源
    。打印流,永远不会抛出IOException,但可以抛出其它异常 例如FileNotFoundException
    。打印流,实现了大量的打印方法,print,println
    。 打印流可以使用自动刷新
  • PrintWriter构造方法:数据目的
    。PrintWriter(File file)数据的目的File对象
    。PrintWriter(String filename)数据的目的是字符串文件名
    。PrintWriter(OutputStream out)数据目的是字节输出流
    。PrintWriter(Writer w)数据目的是字符输出流
public static void main(String[] args) throws IOException {
	method();
	method_2( );
}
/*
*打印流的数据目的是字节输出流
*/
public static void method() throws IOException{
	//创建字节输出流
	File0utputStream fos = new. FileoutputStream("print 。txt" );
	//创建打印流对象,构造方法传递字节输出流
	PrintWriter pw = new PrintWriter(fos);
	//打印流的方法输出println()
	pw. println(100);
	pw. close();
}
/*
*打印流的数据目的是字符输出流
*/
public static void method_2( )throws IOException {
	//创建字符输出流
	FileWriter fw = new FileWriter(" print2. txt");
	//打印流对象,构造方法,传递字符输出流
	PrintWriter pw = new PrintWriter(fw);
	pw. println(true);
	pw. close();
}
  • 打印流可以使用自动刷新
    。打印流开启自动刷新,数据的目的必须是流对象
    。打印流的构造方法第二参数写true
    。必须调用方法:println(),printf(),format()三个中一个,启用自动刷新
public static void main(String[] args) throws IOException {
	method_ 3();
}
/*
*打印流的自动刷新功能
*如果数据目的,不是流对象,能否使用自动刷新呢,不能
*但是可以转换
*FileWriter(String 文件名)
*FileWriter(File file)
*/
public static void method_ 3( )throws IOException {
	//创建打印流对象,输出目的必须是流对象
	PrintWriter pw = new PrintWriter(new FileWriter(" print3. txt"),true);
	PrintWriter pw2 =new PrintWriter(new FileWriter(new File("print3. txt")),true);
	pw. println(200);
	pw.close();
	pw2.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值