文件操作

本文详细介绍使用Java进行文件操作的四种常见方法,包括BufferedReader和BufferedWriter按行读写、OutputStreamWriter和InputStreamReader按字符读写、FileWriter和FileReader处理文本及FileInputStream和FileOutputStream按字节流读写。

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

我们都知道java文件操作有很多种情况,这里我们就其中很常用的方法来进行实现。

1.采用BufferedReader和BufferedWriter来进行文件的读写(按行来读写)

package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 读取一个文件,并将里面的内容处理以后保存到指定文件下
 * 
 * @author WEI 哥
 *
 */
public class Fibonacci {
	public static void main(String[] args) throws IOException {
		File file = new File("D://hello.txt");
		File file2 = new File("D://hello2.txt");
		if (!file2.exists()) {
			file2.createNewFile();
		}
		InputStreamReader reader = null;
		BufferedReader read = null;
		OutputStreamWriter writer = null;
		BufferedWriter write = null;
		try {
			reader = new InputStreamReader(new FileInputStream(file), "GBK");
			read = new BufferedReader(reader);
			writer = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
			write = new BufferedWriter(writer);
			String string = "";
			while ((string = read.readLine()) != null) {
				StringBuffer sb = new StringBuffer("");
				String[] arr = string.split(",");
				for (int i = 0; i < arr.length; i++) {
					sb.append(arr[i] + "$");
				}
				/*
				 * 将修改后的内容保存在hello2.txt
				 */
				write.write(sb.toString()+"\r\n");
				//write.write(sb.toString()); write.newLine();
			}
			write.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				reader.close();
			if (read != null)
				read.close();
			if (writer != null)
				writer.close();
			if (write != null)
				write.close();
		}
	}
}

2. 采用OutputStreamWriter和InputStreamReader来读写文件(按字符来读写)

package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 读取一个文件,并将里面的内容处理以后保存到指定文件下
 * 
 * @author WEI 哥
 *
 */
public class Fibonacci {
	public static void main(String[] args) throws IOException {
		File file = new File("D://hello.txt");
		File file2 = new File("D://hello2.txt");
		if (!file2.exists()) {
			file2.createNewFile();
		}
		InputStreamReader reader = null;
		OutputStreamWriter writer = null;
		try {
			reader = new InputStreamReader(new FileInputStream(file), "GBK");
			writer = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
			int str = 0;
            //当读到不存在的时候,reader.read()会返回-1
			while ((str = reader.read()) != -1) {
				StringBuffer sb = new StringBuffer("");
                /*
                * 这里需要将对应的ascii码进行回转,转化为原来的字符
                */
				sb.append((char)str);
				writer.write(sb.toString()+"\r\n");
			}
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				reader.close();
			if (writer != null)
				writer.close();
		}
	}
}

3. 采用FileWriter和FileReader来实现(和方法二差不多,但是可能会出现中文乱码,解决方式就是采取第二种方式/设置文本编码格式和编译器一致,我这里都是设置的为UTF-8)

package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 读取一个文件,并将里面的内容处理以后保存到指定文件下
 * 
 * @author WEI 哥
 *
 */
public class Fibonacci {
	public static void main(String[] args) throws IOException {
		File file = new File("D://hello.txt");
		File file2 = new File("D://hello2.txt");
		if (!file2.exists()) {
			file2.createNewFile();
		}
		FileReader reader=null;
		FileWriter writer=null;
		try {
			reader = new FileReader(file);
			writer = new FileWriter(file2);
			int str = 0;
			while ((str = reader.read()) != -1) {
				StringBuffer sb = new StringBuffer("");
				//必须设置文本的编码格式和编译器一致,否则中文会乱码
				sb.append((char)str);
				writer.write(sb.toString()+"\r\n");
				
			}
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				reader.close();
			if (writer != null)
				writer.close();
		}
	}
}

4. 采用FileInputStream和FileOutputStream来进行读写(按字节流来读写)

package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 读取一个文件,并将里面的内容处理以后保存到指定文件下
 * 
 * @author WEI 哥
 *
 */
public class Fibonacci {
	public static void main(String[] args) throws IOException {
		File file = new File("D://hello.txt");
		File file2 = new File("D://hello2.txt");
		if (!file2.exists()) {
			file2.createNewFile();
		}
		FileInputStream reader=null;
		FileOutputStream writer=null;
		try {
			reader = new FileInputStream(file);
			writer = new FileOutputStream(file2);
			byte[] by=new byte[1024];
			int len = 0;
			while ((len = reader.read(by)) != -1) {
				//String str=new String(by,0,len);
				//System.out.println(str);
				writer.write(by,0,len);
			}
			/*
			 * 拓展,将String对象也以字符流的方式写入到文件的最后一行
			 */
			String str="\r\n我是小哥哥";
			byte[] by2=str.getBytes();
			for(int i=0;i<by2.length;i++) {
	            writer.write(by2[i]);
	        }
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				reader.close();
			if (writer != null)
				writer.close();
		}
	}
}

总结:首先我们知道文件在内存中都是以字节的形式存储的,所以对于任何形式的文件(文本,图片,影视等)都可以用字节流FileInputStream / FileOutputStream来读取存储。

但是慢慢我们发现,对于一些文本,我们更希望以一种直观的方式来读取,所以我们需要将字节流转换为字符流,就引入了一个OutputStreamWriter/InputStreamReader来转换,这样我们就可以直接以字符流的方式来读取存储文本(这里就限定了是文本)

后面我们又发现InputStreamReader只能对单个字符操作,而我们的阅读习惯是一行一行的,所以又引入了BufferedWriter / BufferedReader来弥补这个缺陷,这样我们就可以按行进行读取写入!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值