IO流中字符流的使用

本文详细介绍了字符流的概念及其在处理中文文本文件中的应用。包括字符流与字节流的关系、字符流复制文件的不同方式、缓冲流的使用、文件复制技巧、特定读写器如LineNumberReader的操作方法以及编码问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 字符流=字节流+编码表。一般用来处理中文文本文件

 OutputStreamWriter=FileOutputStream + 编码表(GBK)默认的是GBK。
  FileWriter = FileOutputStream + 编码表(GBK)
 
 InputStreamReader = FileInputStream + 编码表(GBK)
FileReader = FileInputStream + 编码表(GBK)

2. 字节流的子类:

输出流:

OutputStreamWriter:

FileWriter (用来替代OutputStreamWriter)

BufferedWriter:

输入流:

InputStreamReader :

FileReader (用来替代InputStreamReader )

BufferedReader:

3. 字符流复制文件的5种方式:

第一种:字符流一次读取一个字符

		//封装数据源和目的地
		FileReader fr = new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3");
		FileWriter fw = new FileWriter("f.mp3");
		// 一次读取一个字符
		int by = 0;
		while ((by = fr.read()) != -1) {
			fw.write(by);
		}
		//释放资源
		fr.close();
		fw.close();
第二种:字符流一次读取一个字符数组

		FileReader fr = new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3");
		FileWriter fw = new FileWriter("c.mp3");
		// 一次读取一个一个字符数组
		int len = 0;
		char[] array = new char[1024];
		while ((len = fr.read(array)) != -1) {
			fw.write(array, 0, len);
		}
		fr.close();
		fw.close();
第三种:高效字符流一次读取一个字符

	BufferedReader br = new BufferedReader(new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("d.mp3"));
		int by = 0;
		while ((by = br.read()) != -1) {
			bw.write(by);
		}
		bw.close();
		br.close();

第四种:高效字符流一次读取一个字符数组

		BufferedReader br = new BufferedReader(new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("e.mp3"));
		int by = 0;
		char [] array=new char[1024];
		while ((by = br.read(array)) != -1) {
			bw.write(array,0,by);
		}
		bw.close();
		br.close();
第五种:字符缓冲流一次读取一行数据

		//字符缓冲流  一次读取一行
		BufferedReader br = new BufferedReader(new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("e.mp3"));
		String ss=null;
		//如果已达文件末尾,则返回null
		//readLine()方法,遇到\r \n则停止
		while ((ss = br.readLine()) != null) {
			bw.write(ss);
			bw.newLine();
			//刷新缓冲区
			bw.flush();
		}
		bw.close();
		br.close();

4.  flush()和close()的区别:
  close()表示关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象就不能使用了
  flush()表示刷新一次缓冲区,刷新之后,流对象还能继续使用

5. 复制多级文件到指定目录

	// 封装数据源、目的地:
		File file = new File("D:\\java\\程序");
		File files = new File("D:\\java\\程序副本");
		//如果文件夹不存在,将自动创建
		if(!files.exists()){
			files.mkdir();
		}
		//调用方法,进行递归判断
		method(file,files);
	}

	public static void method(File file, File files) throws IOException {
		if(file.isFile()){
			//如果是文件,就直接复制
			//先把名字封装到指定文件夹下
			File newFile=new File(files,file.getName());
			//在复制文本文件
			copy(file,newFile);
		}
		else{
			//是文件夹的话,就把文件夹复制到指定目录,在调用方法判断
			File newFile=new File(files,file.getName());
			//创建文件夹
			newFile.mkdir();
			//获取该文件夹的file数组
			File[] array=file.listFiles();
			//遍历数组,得到每个file对象
			for(File newFiles:array){
				//再重新判断
				method(newFiles,newFile);
			}
		}
		
	}

	public static void copy(File file, File newFile) throws IOException {
		//封装数据源,目的地
		BufferedReader br=new BufferedReader(new FileReader(file));
		BufferedWriter bw=new BufferedWriter(new FileWriter(newFile));
		String s=null;
		while((s=br.readLine())!=null){
			bw.write(s);
			bw.newLine();
			bw.flush();
		}
		br.close();
		bw.close();	

6. LineNumberReader的使用

继承自BufferedReader,

		LineNumberReader lnr=new LineNumberReader(new FileReader("a.txt"));
		String s=null;
		lnr.setLineNumber(10);
		//设置行号,从10开始
		while((s=lnr.readLine())!=null){
			System.out.println(lnr.getLineNumber()+":"+s);
			//输出文字前面的行号
		}
		lnr.close();
输出结果是:

11:Hello
12:好好学习,天天上向!
13:渴望成熟一点!
7. 字符串中的编码问题:

String(byte[] bytes, String charsetName)   通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
  byte[] getBytes(String charsetName)  使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

	//编码问题
	String s="我四级考试没过";
	byte[] by=s.getBytes();//默认编码GBK
	System.out.println(Arrays.toString(by));
	//一个汉字两个字节,并且是以负数开头
	//[-50, -46, -53, -60, -68, -74, -65, -68, -54, -44, -61, -69, -71, -3]
	byte [] bys=s.getBytes("UTF-8");//指定编码
	
	//解码
	String s1=new String(by);
	String s2=new String(bys,"UTF-8");
	System.out.println(s1+"---"+s2);
	//我四级考试没过---我四级考试没过
	
	//用GBK编码,"UTF-8"解码
	String s3=new String(by,"UTF-8");
	System.out.println(s3);
	//????????????
	
	//用"UTF-8"编码,GBK解码
		String s4=new String(bys);
		System.out.println(s4);
		//鎴戝洓绾ц?冭瘯娌¤繃
所以用什么编码,就用什么解码。
8. 如何实现数据的追加写入
 
  通过构造方法
 public  FileOutputStream  (File file , boolean append)  throws   FileNotFoundException
 
 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。

  创建一个新 FileDescriptor 对象来表示此文件连接。 

9.     close()的功能
   让流对象变成垃圾,这样就可以被垃圾回收器回收了
  通知系统去释放与该文件相关的资源


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值