字符流FileReader和FileWriter

前面介绍过了FileOutputStream和FileInputStream,但是他们是属于字节流的,字节流,顾名思义,就是一个字节一个字节读取,这样,有时会出错或者出现乱码的情况,因为在“UTF-8”里一个中文是两个字节,而如果我们用字节形式读取,读取的时候刚好只读取一个字节,那么就会出现乱码

那么怎么区分字节流和字符流呢,其实很简单,只要后面跟着的是Reader或writer的就是字符流,后面跟着Stream的就是字节流

我们先来查看一下FileReader的api,
我们看到它是继承InputStreamReader,所以我们直接使用InputStreamReader:先创建一个文件zzq.txt 然后我们使用InputStreamReader读取里面的内容,它会提示()里面可以放一个InputStream类,然后InputStream可以制定编码格式,所以我们在()里new一个FileInputStream,再在后面加上“UTF-8”编码格式
	/**
	 * 演示InputStreamReader的用法
	 */
	public static void test1() {
		try {
			InputStreamReader is = new InputStreamReader(new FileInputStream("zzq.txt"), "UTF-8");
			int a = 0;
			while ((a = is.read()) != -1) {
				System.out.println(a);
				System.out.println((char) a);
			}
		} catch (UnsupportedEncodingException | FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
接下来演示用数组FileInpurStream读取内容,我们先用File指定文件,然后用 InpurStreamReader读取
	public static void test2() {
		try {
			File file = new File("a.txt");
			InputStreamReader is = new InputStreamReader(new FileInputStream(file), "UTF-8");

			char[] b = new char[(int) file.length()];
			while (is.read(b) != -1) {
				System.out.println(new String(b));
			}
			is.close();
		} catch (UnsupportedEncodingException | FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

上面的方法,还要定义一个数组,可以使用IO流的包装类Buffered,这样,就可以直接读取一行
	/**
	 * 演示BufferedReader的用法,整行读取文本
	 */
	public static void test3() {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream("zzq.txt"), "UTF-8"));
			while (br.ready()) {
				String str = br.readLine();
				System.out.println(str);
			}

		} catch (UnsupportedEncodingException | FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
下面介绍FileWrite的用法,查看api可以知道它也是继承OutputStreamWrite

/**
	 * 演示OutputStreamWriter的用法
	 */
	public static void test4() {
		try {
			OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("zzq1.txt"));
			os.write(97);
			os.flush();
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
上面输出的97因为不是String类型,所以会被电脑内部装换成ascii码,然后在zzq1.txt文件中输入小写字母a
下面我们输入中文试试,在FileOutputStream()里面可以加一个参数true,这样我们之后写入的内容就不会覆盖之前写的了
/**
	 * 演示OutputStreamWriter的用法
	 */
	public static void test5() {
		try {
			OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("b.txt", true));
			os.write("\r\n");
			os.write("我是zzq");
			os.flush();
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
然后介绍一个我认为的大王PrintWrite,怎么说呢,总之如果需要使用输出流就可以想到直接使用PrintWrite,下面看下api,可以看到PrintWrite()里面可以直接放一个文件或者放一个OutputStream,这样就可以使用输出流的方法了
下面进行简单的演示
/**
	 * 演示PrintWriter类的用法
	 */
	public static void test6() {
		try {
			PrintWriter pw = new PrintWriter("zzq.txt");
			pw.println("哈喽,我是zzq");
			pw.println("你好吗");
			pw.flush();
			pw.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
以上就是字符流的简单介绍

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值