挑战100道编程题(第7道)【编写一个字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件,能够在读取的每行前面都加上有行号和冒号】

本文介绍了一种Java字符输入流的包装类实现方法,通过该包装类在读取文本文件时,能在每行前自动添加行号和冒号,增强文件阅读的便利性和条理性。

01-题目

请编写一个字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。

02-思路

  1. 通过file读取文件路径。
  2. 判断该file是否存在,不存在抛出异常。
  3. 根据FileReader读取文件。
  4. 编写一个字符输入流的包装类。

03-代码

package com.eleven;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * 请编写一个字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,
 * 让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
 * 思路:
 * 1.通过file读取文件路径。
 * 2.判断该file是否存在,不存在抛出异常。
 * 3.根据FileReader读取文件。
 * 4.编写一个字符输入流的包装类。
 * 
 * @author sywangu
 *
 */
public class SixDemo {
	public static void main(String[] args) {
		File file = new File("C:\\Users\\sywangu\\Desktop\\aa.txt");
		if (file.exists()) {
			FileReader fr;
			try {
				fr = new FileReader(file);
				BufferUnit br = new BufferUnit(fr);
				String str = "";
				while ((str = br.readLine())!=null) {
					System.out.println(str);
				}
				
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (IOException e) {

                e.printStackTrace();
            }
		}
	}

}
/**
 * 字符输入流的包装类
 * @author sywangu
 *
 */
class BufferUnit extends BufferedReader{
	private int row;
	

	public BufferUnit(Reader in) {
		super(in);
		this.row = 1;
	}
	
	public String readLine() throws IOException {
		String s = super.readLine();
		if (s != null) {
			s = this.row + ":" +s;
			this.row++;
		}
		return s;
	}
	
}

04-输出

在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要帮助用户找到使用Java字符输入流字符输出流复制文本文件的示例代码。首先,我得回忆一下JavaIO流的相关知识。字符流主要处理字符数据,适合处理文本文件,特别是包含中文的情况,因为字符流会处理字符编码,避免乱码问题。用户明确提到了字符输入流字符输出流,所以应该使用ReaderWriter相关的。常见的字符输入流包括FileReader、BufferedReader,而字符输出流则有FileWriter、BufferedWriter。为了提高读写效率,通常会使用缓冲流,比如用BufferedReader包装FileReader,用BufferedWriter包装FileWriter。接下来,我需要考虑文件复制的步骤。基本流程是:打开输入流读取源文件,打开输出流写入目标文件,逐行或逐字符读取并写入,最后关闭流。需要注意的是,异常处理也很重要,应该使用try-with-resources来自动管理资源,避免资源泄漏。 用户可能还关心字符编码的问题。虽然FileReaderFileWriter默认使用系统编码,但在需要指定编码的情况下,应该使用InputStreamReaderOutputStreamWriter,因为它们可以指定字符集。例如,如果用户需要UTF-8编码,就需要用InputStreamReader包装FileInputStream,并指定编码格式。 然后,我需要检查现有的引用内容。引用[2]提到,处理中文时使用字符流更方便,避免字节分裂导致的乱码。引用[3]给出了使用InputStreamReaderBufferedReader读取文件的例子,这可能对处理指定编码的情况有帮助。但用户当前的问题可能不需要指定编码,除非特别要求,所以示例代码可以有两种情况:默认编码指定编码。现在,我需要组织代码示例。首先,基本的示例使用FileReaderFileWriter,加上缓冲流。然后,另一个示例展示如何指定编码,使用InputStreamReaderOutputStreamWriter。同时,要强调使用try-with-resources来自动关闭流,并处理异常。 另外,用户可能想知为什么使用缓冲流,所以需要解释缓冲的作用,提升性能。还要提到注意事项,比如目标目录是否存在,流关闭的重要性,以及大文件处理时逐行读取的优势。最后,生成相关问题,帮助用户深入理解,比如性能优化、异常处理、编码影响等。</think>以下是使用Java字符输入流字符输出流复制文本文件的示例代码关键说明: ### 基础实现代码 ```java import java.io.*; public class TextFileCopy { public static void main(String[] args) { try ( // 创建字符输入流(带缓冲区) BufferedReader br = new BufferedReader(new FileReader("source.txt")); // 创建字符输出流(带缓冲区) BufferedWriter bw = new BufferedWriter(new FileWriter("target.txt")) ) { String line; // 逐行读取并写入 while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); // 保持换行符一致性 } System.out.println("文件复制完成"); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 关键组件说明 1. **缓冲流结构**: - 输入流:`BufferedReader` 包装 `FileReader` - 输出流:`BufferedWriter` 包装 `FileWriter` - 这种嵌套结构能有效提升IO性能[^2] 2. **try-with-resources**: - 自动关闭资源的语法(Java7+) - 确保即使发生异常也能正确释放资源 3. **编码处理**: - 默认使用系统编码(如GBK) - 如需指定编码,可改用: ```java new InputStreamReader(new FileInputStream("source.txt"), "UTF-8") new OutputStreamWriter(new FileOutputStream("target.txt"), "UTF-8") ``` ### 增强版(指定编码) ```java try ( BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("source.txt"), StandardCharsets.UTF_8)); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("target.txt"), StandardCharsets.UTF_8)) ) { // 读写逻辑同上 } ``` ### 注意事项 1. 目标文件不存在时会自动创建 2. 目标文件已存在时会默认覆盖(追加模式需使用`new FileWriter(path, true)`) 3. 处理大文件时建议保持逐行读取方式 4. 注意不同操作系统的换行符差异(`newLine()`方法自动处理)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值