Java学习笔记之IO(八):FileWriter输出字符流

package com.io.e_character;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Test;

/*

输出字符流:
-------| Writer:输出字符流的基类,抽象类;
----------| FileWriter:向文件输出数据的输出字符流;

	FileWriter的使用步骤:
	1、找到目标文件
	2、建立数据输出通道
	3、输出数据
	4、关闭资源

	FileWriter注意事项:
	1、使用FileWriter写数据的时候,FileWriter内部是维护了一个1024个字符数组的,写数据的时候会先将数据写入字符数组中,
		如果需要把数据真正写到硬盘上,需要调用flush()方法或者close()方法,或者填满内部的字符数组;
	2、创建FileWriter对象的时候,如果目标文件不存在,那么会自动创建目标文件;
	3、创建FileWriter对象的时候,如果目标文件已经存在,那么默认情况会先清空目标文件中的数据;如果需要在目标文件中追加数据,
		那么需要使用FileWriter writer = new FileWriter(file, true);true表示在末尾追加;

 */

public class Demo2 {

	@Test
	public void test1() throws IOException{
		// 找到目标文件
		File file = new File("D:\\a.txt");
		
		// 建立数据输出通道
		FileWriter writer = new FileWriter(file);
//		FileWriter writer = new FileWriter(file, true); // true表示追加数据;
		
		// 输出数据
		String content = "你好 China";
		writer.write(content);
	
		// 刷新字符流
//		writer.flush();
		
		// 关闭资源
		writer.close();
	}
	
	// 使用字符流拷贝文件
	@Test
	public void copyFile() throws IOException{
		// 找到目标文件
		File inFile = new File("D:\\myeclipse\\workspace\\IO\\src\\com\\io\\e_character\\Demo2.java");
		File outFile = new File("D:\\a.java");
		
		// 建立数据输入输出通道
		FileReader reader = new FileReader(inFile);
		FileWriter writer = new FileWriter(outFile);
		
		// 边读边写
		int len = 0;
		char[] buf = new char[1024];
		while ((len = reader.read(buf)) != -1){
			writer.write(buf, 0, len);
		}
		
		// 释放资源
		writer.close();
		reader.close();
	}
	
	/*
	 * 使用字符流拷贝图片:数据会丢失,拷贝失败;
	 * FileReader的本质也是从文件数据中读取二进制数据,只是它把读取的每一个数据都会到GBK码表中查找对应的字符,
	 * 然后返回我们能看懂的字符;但是GBK码表有65536个数值,并没有完全使用完,也就是说有一些数值没有对应的字符;
	 * 那么当读取图片数据的时候,有可能读取到的数值在GBK码表中没有对应的字符,此时就会返回一个未知字符对应的数字,
	 * 未知字符占一个字节,而从图片读取的数据占两个字节,这样就会出现数据丢失的情况;
	 */
	@Test
	public void copyImage() throws IOException{
		// 找到目标文件
		File inFile = new File("D:\\photos\\11.jpg");
		File outFile = new File("D:\\a.jpg");
		
		// 建立数据输入输出通道
		FileReader reader = new FileReader(inFile);
		FileWriter writer = new FileWriter(outFile);
		
		// 边读边写
		int len = 0;
		char[] buf = new char[1024];
		while ((len = reader.read(buf)) != -1){
			writer.write(buf, 0, len);
		}
		
		// 关闭资源
		writer.close();
		reader.close();
	}
	
	/*
	思考:何时使用字节流?何时使用字符流?
	字符流:读写字符数据的时候使用字符流;
	字节流:读写的数据都不需要转换成字符的时候,使用字节流;
	 */
	
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值