java之IO流详解(二)

好了,昨天讲了字节流,现在我们就来讲字符流吧。。。

字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操作这些文件必须使用字节流)

我们先看看字符流有几类:

A:OutputStreamWriter             (父类Writer)

OutputStreamWriter(OutputStream os):默认编码,GBK

OutputStreamWriter(OutputStream os,String charsetName):指定编码。

B:InputStreamReader              (父类Reader)

InputStreamReader(InputStream is):默认编码,GBK

InputStreamReader(InputStream is,String charsetName):指定编码

注:编码问题只要输入和输出流的编码一致即可。

C:FileWriter           (父类OutputStreamWriter)

FileWriter(File file)

FileWriter(String fileName)

FileWriter(File file, boolean append)

来写入字符文件的便捷类 ,通常我们操作字符流采取这个类即可,因为它是继承自OutputStreamWriter的类,方法和父类的一样,而且构造方法比较简便,当然使用上面的OutputStreamWriter(OutputStream os)也行,参数是一个字节流对象。

D:FileReader           (父类InputStreamReader)

用来读取字符文件的便捷类

E:BufferedWriter         (父类Writer)

BufferedWriter(Writer out)

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

F:BufferedReader       (父类Reader)

BufferedReader(Reader in)

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

注:为了获得最高效率,可考虑将 OutputStreamWriter或FileWriter 包装到 BufferedWriter 中,将 OutputStreamReader或FileReader 包装到 BufferedReader 中。

下面我们通过代码来具体看看字符流怎么使用:

1、OutputStreamWriter和InputStreamReader

public static void OutputStreamWriter() throws IOException{
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c.txt"));
		char[] ch = new char[]{'a','b','c','d','e'};
		osw.write(ch);//字符数组形式写入
		osw.write(ch, 0, 3);//字符数组一部分写入
		osw.write("你好吗");//字符串形式写入
		osw.flush();//刷新,将缓冲区的数据写入到文件中
		osw.close();
		InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"));
		char[] ch2 = new char[1024];
		int len = -1;
		while((len = isr.read(ch2))!=-1){//一次读1024个字符
			System.out.print(new String(ch2,0,len));//将读取到的字符转化为字符串显示出来
		}
		isr.close();
	}

结果为:abcdeabc你好吗


2、 FileWriter 和FileReader 

public static void FileWriterDemo() throws IOException{
		FileReader fr = new FileReader("a.txt");//创建一个读取字符流对象,并指向a.txt这个文件
		FileWriter fw = new FileWriter("b.txt");
		char[] ch = new char[1024];
		int len = -1;
		while((len=fr.read(ch))!=-1){//一次读1024个字符
			fw.write(ch, 0, len);//将读到多少数据写入缓冲区中
			fw.flush();//刷新缓冲区把数据写入文件中
		}
		fw.close();
		fr.close();
	}

3、最高效的 BufferedWriter 和BufferedReader,缓冲字符流

  • 普通方式:

public static void Bufferwriter() throws IOException{
		//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));//包装字符流
		BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));//包装字符流
		int len = -1;
		char[] cbuf = new char[1024];
		while((len=br.read(cbuf))!=-1){
			bw.write(cbuf, 0, len);//将读到多少数据写入缓冲区中
			bw.flush();//刷新缓冲区把数据写入文件中
		}
		bw.close();
		br.close();
	} 
BufferedReader特有方式,一次读取一行的数据,即读一行字符串:
public static void BufferDemo() throws IOException{
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
		String line = null;
		while((line=br.readLine())!=null){//br.readLine()返回值是一个字符串,因为它是一次读取一行字符串数据。当它返回值为null时,表示读取完毕
			bw.write(line);//写入刚刚读取到的字符串到缓冲区
			bw.newLine();//换行
			bw.flush();//将缓冲区的字符串写入文件中,如果不刷新,那么就没有数据写入
		}
		bw.close();//将写入流关闭时会默认刷新一遍缓冲区,建议在每写一遍数据时候调用flush()刷新一遍
		br.close();
	}


 
 


ok,字符流就讲完了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值