BufferedReader BufferedWriter 中文utf-8下复制copy文件

package test;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
/*
 * @version V17.09
 */
public class BufferedCopyDemo {
    // 我在这里使用 throws,目的是为了方便地阅读代码
    // 然而 在做项目中 还是需要使用try..catch对异常做出相应的处理
    public static void main(String[] args) throws IOException {
        // 文件源头
        String pathname = "hello.txt"; // 相对路径下的文件路径
        String charsetName = "UTF-8"; // 指定字符集
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(pathname), charsetName));
 
        // 文件目的地
        String newPathName = "world.txt";
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newPathName), charsetName));
 
        // 一行一行的读取
        String line = null;
        while ((line = br.readLine()) != null) {// 读一行
            bw.write(line);// 写一行,但是没有进行换行
            bw.newLine();// 换行
            bw.flush();// 清空缓冲区,把在缓冲区的字符写到文件中
        }
         
        // 这个循环会在文本内容的后面 增加一个空行
        // 没有想到如何优化这个问题,就是如何删掉最后一个换行符
        // 有待学习
         
        // 及时的释放资源
        br.close();
        bw.close();
    }
}

以上用的转换流InputStreamReader 和 OutputStreamWriter来实现的,此转换流是由字节流转为字符流的,没有由字符流转换为字节流的转换流

直接用BufferedReader BufferedWriter会有中文乱码出现,代码如下:


public static void copyFile(String srcPath, String destPath){
		
		Reader reader = null;
		Writer writer = null;
		BufferedReader buffReader = null;
		BufferedWriter buffWriter = null;
		try {
			reader = new FileReader(srcPath);
			writer = new FileWriter(destPath);
			buffReader = new  BufferedReader(reader);
			buffWriter = new BufferedWriter(writer);
			String str = "";
			while ((str = buffReader.readLine())!=null) {
				buffWriter.write(str);
				buffWriter.newLine();
				buffWriter.flush();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			try {
				if (buffReader!=null) {
					buffReader.close();
				}
				if (buffWriter!=null) {
					buffReader.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}



import java.io.*; public class TextFileCopy { public static void main(String[] args) { String sourceFile = "source.txt"; String destinationFile = "destination.txt"; try { // 方法1: 使用字节流(InputStream/OutputStream) copyUsingByteStreams(sourceFile, destinationFile + ".method1"); // 方法2: 使用字节流带缓冲(BufferedInputStream/BufferedOutputStream) copyUsingBufferedByteStreams(sourceFile, destinationFile + ".method2"); // 方法3: 使用字符流(FileReader/FileWriter) copyUsingCharStreams(sourceFile, destinationFile + ".method3"); // 方法4: 使用字符流带缓冲(BufferedReader/BufferedWritercopyUsingBufferedCharStreams(sourceFile, destinationFile + ".method4"); // 方法5: 使用字符流带缓冲和行处理(BufferedReader/BufferedWritercopyUsingBufferedCharStreamsWithLineProcessing(sourceFile, destinationFile + ".method5"); System.out.println("所有文件复制操作已完成!"); } catch (IOException e) { System.err.println("文件操作出错: " + e.getMessage()); e.printStackTrace(); } } // 方法1: 使用基本字节流 public static void copyUsingByteStreams(String source, String destination) throws IOException { try (InputStream in = new FileInputStream(source); OutputStream out = new FileOutputStream(destination)) { int byteRead; while ((byteRead = in.read()) != -1) { out.write(byteRead); } } System.out.println("方法1: 使用字节流完成文件复制"); } // 方法2: 使用带缓冲的字节流 public static void copyUsingBufferedByteStreams(String source, String destination) throws IOException { try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(source)); BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destination))) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = bin.read(buffer)) != -1) { bout.write(buffer, 0, bytesRead); } } System.out.println("方法2: 使用带缓冲的字节流完成文件复制"); } // 方法3: 使用基本字符流 public static void copyUsingCharStreams(String source, String destination) throws IOException { try (Reader reader = new FileReader(source); Writer writer = new FileWriter(destination)) { int charRead; while ((charRead = reader.read()) != -1) { writer.write(charRead); } } System.out.println("方法3: 使用字符流完成文件复制"); } // 方法4: 使用带缓冲的字符流 public static void copyUsingBufferedCharStreams(String source, String destination) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(source)); BufferedWriter bw = new BufferedWriter(new FileWriter(destination))) { char[] buffer = new char[8192]; int charsRead; while ((charsRead = br.read(buffer)) != -1) { bw.write(buffer, 0, charsRead); } } System.out.println("方法4: 使用带缓冲的字符流完成文件复制"); } // 方法5: 使用带缓冲的字符流逐行处理 public static void copyUsingBufferedCharStreamsWithLineProcessing(String source, String destination) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(source)); BufferedWriter bw = new BufferedWriter(new FileWriter(destination))) { String line; while ((line = br.readLine()) != null) { // 这里可以对每行内容进行处理 bw.write(line); bw.newLine(); // 添加换行符,因为readLine()会移除换行符 } } System.out.println("方法5: 使用带缓冲的字符流逐行处理完成文件复制"); } } 深度解析上面的代码,并且简化该代码,要求字节流跟字符流的读写方式健在,简化一个能正常运行的总体的java代码
最新发布
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值