黑马程序员--IO之字符流

8 篇文章 0 订阅
2 篇文章 0 订阅

------- android培训java培训、期待与您交流! ----------


一.字符流

1.使用FileInputStream和FileOutputStream读写中文

计算机存储任何数据都是以二进制字节形式存储, 那么使用字节流是可以读写字符的. 但是比较麻烦.

FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码

FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码

2.使用InputStreamReader和OutputStreamWriter读写中文

InputStreamReader包装一个InputStream, 可以直接读取字符, 自动解码

OutputStreamWriter包装一个OutputStream, 可以直接写出字符, 自动编码

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/*
 * InputStream.read()方法是读一个byte, 而为什么返回一个int? 而且int中全是正数.
 * 		因为byte取值范围是-128到127, 这些数据在文件中都有可能存在, 如果读到字节直接返回, 那么无法用任何一个值表示文件末尾.
 * 		read()方法内部, 将读取到的所有数据高位补0转为了int, 这样做所有负数都会变为正数, 返回-1就能表示文件末尾了.
 * 		write()方法写出数据时, 会将int数据强转为byte, 再写出. 这样就把read()方法中补的0都去掉了, 得到了文件中原有数据.
 */
public class CharDemo {

	public static void main(String[] args) throws IOException {
//		readDemo1();		
//		writeDemo1();
		
//		readDemo2();
//		writeDemo2();
		
//		readDemo3();
//		writeDemo3();
	}
	
	// 写出非平台默认码表的数据, 也是在构造函数中指定码表
	private static void writeDemo3() throws IOException {
		FileOutputStream fos = new FileOutputStream("utf-8.txt");
		OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");	// 指定使用UTF-8码表编码
		osw.write("生命在于运动\r\n");		
		osw.write("生命在于学习\r\n");
		osw.close();
	}
	
	// 读取非平台默认码表的文件, 在构造函数中指定码表即可
	private static void readDemo3() throws IOException {
		FileInputStream fis = new FileInputStream("utf-8.txt");
		InputStreamReader isr = new InputStreamReader(fis, "UTF-8");	// 指定用UTF-8码表解码
		int b;
		while ((b = isr.read()) != -1)		
			System.out.print((char)b);		
		isr.close();
	}
	
	// 字符流可以直接写出字符, 内部自动编码
	private static void writeDemo2() throws FileNotFoundException, IOException {
		FileOutputStream fos = new FileOutputStream("file.txt");
		OutputStreamWriter osw = new OutputStreamWriter(fos);	// 字符输出流
		osw.write("生命在于运动\r\n");		
		osw.write("生命在于学习\r\n");
		osw.close();
	}
	
	// 字符流每次读取一个字符, 内部自动解码, 遇到英文读1个字节转为字符, 遇到中文读2个字节转为字符
	private static void readDemo2() throws FileNotFoundException, IOException {
		FileInputStream fis = new FileInputStream("file.txt");
		InputStreamReader isr = new InputStreamReader(fis);		// 字符输入流
		int b;
		while ((b = isr.read()) != -1)		
			System.out.print((char)b);		
		isr.close();
	}

	// 由于FileOutputStream只能写出字节, 如果希望写出字符, 需要人工编码
	private static void writeDemo1() throws  IOException {
		FileOutputStream fos = new FileOutputStream("file.txt");
		fos.write("生命在于运动\r\n".getBytes());
		fos.write("生命在于学习".getBytes());
		fos.close();
	}

	// 由于FileInputStream只能读取字节, 如果希望读取字符, 需要人工解码
	private static void readDemo1() throws  IOException {
		FileInputStream fis = new FileInputStream("file.txt");
		int b;
		while ((b = fis.read()) != -1) {
			byte b1 = (byte)b;
			if (b1 < 0) {						// 如果读到了负数(代表遇到中文), 再多读一个, 两个一起转为一个字符
				byte b2 = (byte) fis.read();
				System.out.print(new String(new byte[]{b1, b2}));
			} else {							// 如果读到的不是负数, 直接转为字符
				System.out.print((char)b);		
			}
		}
		fis.close();
	}

}


  * 3.指定码表读写字符

在使用InputStreamReader和OutputStreamWriter的时候, 如果希望读写非平台 默认码表, 在构造函数中可以指定

  * 4.FileReader和FileWriter

FileReader是InputStreamReader的子类, 在读取平台默认码表的文件时, 可以 使用FileReader替代InputStreamReader

FileWriter是OutputStreamWriter的子类, 在写出平台默认码表的文件时, 可以 使用FileWriter替代OutputStreamWriter

  * 5.BufferedReader和BufferedWriter

BufferedReader可以包装一个Reader, 提供缓冲功能, 而且提供了readLine()方 法可以读取一行字符

BufferedWriter可以包装一个Writer, 提供缓冲功能, 而且提供了newLine()方 法写出系统对应的换行符号

6.LineNumberReader

是BufferedReader的子类, 带有缓冲功能, 可以读取一行, 并且还能统计行号

  ------- android培训java培训、期待与您交流! ----------   详细请查看: http://edu.csdn.net/heima/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值