Java文件读写

Java文件读写

一、文件读写的类

  • 这个比较多,可以在网上搜一下,那个很全,但太多了,眼花缭乱。

  • 我这儿放一张别人的:

在这里插入图片描述

  • 这是比较实用的:

在这里插入图片描述

二、流

  • :数据从一端“流向”另一端,是有方向的。
  • 流分为:输入流输出流
  • 在Java文件读写里:
  • 字符流:单位:Unicode, 1 Unicode = 2 Byte
  • 字节流:单位:Byte, 1 Byte = 8 bit
  • 写入文件:Write类(输出字符流) 和 OutputStream类(输出字节流)
  • 读取文件:Reader类(输入字符流) 和 InputStream类(输入字节流)
  • 为什么这个输入,输出,看着这么别扭?请看缓冲区的概念。

三、缓冲区

  • 又叫缓存。
  • CPU:高速
  • 磁盘:低速存储设备
  • 写入操作:CPU与磁盘交互。限制:受制于低速存储设备。
  • 缓冲区作用:每次写入操作把数据存到高速缓冲区,当达到一定的阈值,再一次性写入磁盘。
  • 衍生:Java中的Buffer,基本上有这个单词的类,都比较高效,线程也安全。

四、Java文件读写一般要和Java的异常一起用

五、代码示例

  • 写入文件——覆盖(BufferedWriter 和 BufferedOutputStream)
package Huffman;
import java.io.*;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * Java Space 是eclipse的工作空间
		 * Java 0~100 是创建的项目
		 * src 是项目下的文件,主要装源文件(.java文件)
		 * Huffman 是src 下创建的一个包
		 */
		final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
		
		/**
		 * BufferedWriter 和 BufferedOutputStream 都是写入文件的类
		 * BufferedWriter 针对字符
		 * BufferedOutputStream 针对字节
		 */
		try {
			BufferedWriter out = new BufferedWriter(new FileWriter(filepath1));
			out.write("I love you !");
			out.close();
			System.out.println("操作成功!");
		}catch(IOException e) {
			e.printStackTrace(); // 显示错误信息,和位置
		}
		
		try {
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filepath1));
			out.write("I love you too !".getBytes());
			out.close();
			System.out.println("操作成功!");
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}
  • 写入文件——追加(BufferedWriter)
  • BufferedOutputStream也差不多,都是这种方法。
package Huffman;
import java.io.*;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * Java Space 是eclipse的工作空间
		 * Java 0~100 是创建的项目
		 * src 是项目下的文件,主要装源文件(.java文件)
		 * Huffman 是src 下创建的一个包
		 */
		final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
		
		/**
		 * 追加内容
		 * 只需把 new FileWriter(filepath1) 改为 new FileWriter(filepath1, true)
		 */
		try {
			BufferedWriter out = new BufferedWriter(new FileWriter(filepath1, true));
			out.write("I love you !");
			out.close();
			System.out.println("操作成功!");
		}catch(IOException e) {
			e.printStackTrace(); // 显示错误信息,和位置
		}
		
	}

}
  • 读取文件——整个文件,不是一行一行(BufferedReader)
package Huffman;
import java.io.*;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * Java Space 是eclipse的工作空间
		 * Java 0~100 是创建的项目
		 * src 是项目下的文件,主要装源文件(.java文件)
		 * Huffman 是src 下创建的一个包
		 */
		final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
		
		try {
			BufferedReader in = new BufferedReader(new FileReader(filepath1));
			
			/**
			 * readLine() 是当读到换行标记'\n','\r'时,跟着换行,同时返回这一行字符串
			 * ready() 是用于检验缓冲区是否准备好被读取
			 */
			while(in.ready()) {
				System.out.println(in.readLine());
			}
			
		} catch(IOException e) {
			e.printStackTrace();
		}
		
	}

}

在这里插入图片描述

  • 读取文件——一行一行(BufferedReader)
try {
	BufferedReader in = new BufferedReader(new FileReader(filepath1));
	String s = null;
	s = in.readLine();
	System.out.println(s);
	in.close();
} catch(IOException e) {
e.printStackTrace();
}
  • 读取文件——(BufferedInputStream)
package Huffman;
import java.io.*;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * Java Space 是eclipse的工作空间
		 * Java 0~100 是创建的项目
		 * src 是项目下的文件,主要装源文件(.java文件)
		 * Huffman 是src 下创建的一个包
		 */
		final String filepath1 = "D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt";
		
		/**
		 * BufferedInputStream 字节流
		 * 用它来读取字符流
		 */
		try {
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(filepath1));
			int bit = 0;
			byte[] buffer = new byte[1024];
			while((bit=in.read(buffer)) != -1) {
				String s = new String(buffer, 0, bit); // bit offset length
				System.out.println(s);
			}
			in.close();
			
		} catch(IOException e) {
			e.printStackTrace();
		}
		
	}

}
  • 读取文件——字节流(BufferedInputStream)

五、为什么?

  • 为什么要有个:new FileReader(filepath1)
BufferedReader in = new BufferedReader(new FileReader(filepath1));
  • 原因: BufferedReader是高级流,不能直接对文件进行操作,只有低级流才能直接与文件相连,所以需要嵌套一个低级流。

五、Files类读写文件

package Huffman;
import java.io.*;
import java.nio.file.*;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * Java Space 是eclipse的工作空间
		 * Java 0~100 是创建的项目
		 * src 是项目下的文件,主要装源文件(.java文件)
		 * Huffman 是src 下创建的一个包
		 */
		Path filepath1 = Paths.get("D:\\Java Space\\Java 0~100\\src\\Huffman\\text.txt");
		
		// 不存在就创建
		if(!Files.exists(filepath1)) {
			try {
				Files.createFile(filepath1);
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
		
		// 读取文件
		try {
			String lines = Files.readString(filepath1);
			System.out.println(lines);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 写入文件
		try {	
			// 每次写入都完全覆盖 Files.write(filepath1, "I love you !".getBytes());
			// 每次写入是追加 Files.write(filepath1, "I love you !\n".getBytes(), StandardOpenOption.APPEND);
			// 写入文件的内容有中文 Files.write(filepath1, "我爱你 !".getBytes("utf-8"));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜满月

鼓励,鼓励,更加努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值