Java读写文件常用方法
一.字符流:读写纯文本(txt,csv等),
1 字符流写文件主要用:FileWriter,BufferedWriter,PrintWriter
1.1 测试 FileWriter 写入
private void writeFileWriter() throws IOException {
try (FileWriter fw = new FileWriter(basicPath + "writeUnicode_FileWriter.txt")) {
fw.write("测试 FileWriter 写入。");
}
}
1.2 测试 BufferedWriter 写入
private void writeBufferedWriter() throws IOException {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(basicPath + "writeUnicode_BufferedWriter.txt"))) {
bw.write("测试 BufferedWriter 写入。");
}
}
1.3 测试 PrintWriter 写入
private void writePrintWriter() throws IOException {
try (PrintWriter pw = new PrintWriter(new FileWriter(basicPath + "writeUnicode_PrintWriter.txt"))) {
pw.write("测试 PrintWriter 写入。");
}
}
2 字符流读文件主要用:FileReader,BufferedReader
2.1 测试 FileReader 读取
private void readFileReader() throws IOException {
// 方式1:一个一个char读取 (不推荐)
try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
}
// 方式2:数组自定长度一次性读取
try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
char[] buf = new char[1024];
int length;
while ((length = fr.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
}
2.2测试 BufferedReader 读取
private void readBufferedReader() throws IOException {
// 方式1:一个一个char读取 (不推荐)
try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
int c;
while ((c = br.read()) != -1) {
System.out.print((char) c);
}
}
// 方式2:数组自定长度一次性读取
try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
char[] buf = new char[1024];
int length;
while ((length = br.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
// 方式3:bufferedReader.readLine()读取
try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.print(line);
}
}
}
二.字节流:读取视频,音频,二进制文件等,(文本文件也可以但不推荐,以下仅为测试用)
1 字节流写文件主要用:FileOutputStream,BufferedOutputStream
1.1 测试 FileOutputStream 写入
private void writeFileOutputStream() throws IOException {
try (FileOutputStream fos = new FileOutputStream(basicPath + "writeByte_FileOutputStream.txt")) {
String content = "测试 FileOutputStream 写入。";
byte[] bytes = content.getBytes();
fos.write(bytes);
}
}
1.2 测试 BufferedOutputStream 写入
private void writeBufferedOutputStream() throws IOException {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
String content = "测试 BufferedOutputStream 写入。";
byte[] bytes = content.getBytes();
bos.write(bytes);
}
}
2 字节流读文件主要用:FileInputStream,BufferedInputStream
2.1 测试 FileInputStream 读取
private void readFileInputStream() throws IOException {
// 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
int ch;
while ((ch = fis.read()) != -1) {
System.out.print((char) ch);
}
}
// 方式2:数组自定长度一次性读取
try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
byte[] buf = new byte[1024];
int length;
while ((length = fis.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
}
2.2 测试 BufferedInputStream 读取
private void readBufferedInputStream() throws IOException {
// 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
int c;
while ((c = bis.read()) != -1) {
System.out.print((char) c);
}
}
// 方式2:数组自定长度一次性读取
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
byte[] buf = new byte[1024];
int length;
while ((length = bis.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
}
三.通过 Files类读写文件
1 测试 Files类写入
private void writeFiles() throws IOException {
String content = "测试 Files 类写入。\n第二行";
Files.write(Paths.get(basicPath + "writeFiles.txt"), content.getBytes());
}
2 测试 Files类读取
private void readFiles() throws IOException {
// 方式1 (文件特大时会占满内存)
byte[] bytes = Files.readAllBytes(Paths.get(basicPath + "writeFiles.txt"));
String srcStr1 = new String(bytes);
System.out.println(srcStr1);
// 方式2 (文件特大时会占满内存)
List<String> lines = Files.readAllLines(Paths.get(basicPath + "writeFiles.txt"));
StringBuilder sb = new StringBuilder();
for (String line : lines) {
// 此时line最后没有换行,因为readAllLines以换行分隔了所有行,可以用System.out.print 看到效果
sb.append(line).append("\n");
}
String srcStr2 = sb.toString();
System.out.println(srcStr2);
// 方式3 JDK8的Stream流,边消费边读取
String srcStr3 = Files.lines(Paths.get(basicPath + "writeFiles.txt")).reduce((s1, s2) -> s1 + s2).get();
System.out.println(srcStr3);
}
四.源码
1 字符流读写

package com.writefiles; import java.io.*; /**
* @author: Convict.Yellow
* @date: 2020/12/22 16:11
* @description: 字符流的基本单位为 Unicode,大小为两个字节(Byte),主要用来处理文本数据。
* 字符流有两个基类:Reader(输入字符流)和 Writer(输出字符流)。
* <p>
* 字符流写文件主要用:FileWriter,BufferedWriter,PrintWriter
* 字符流读文件主要用:FileReader,BufferedReader
*/
public class WriteAndReadByUnicode { private static final String basicPath = "D:/ztest/"; public static void main(String[] args) throws IOException {
WriteAndReadByUnicode entrance = new WriteAndReadByUnicode(); // 测试 FileWriter 写入
entrance.writeFileWriter();
// 测试 BufferedWriter 写入
entrance.writeBufferedWriter();
// 测试 PrintWriter 写入
entrance.writePrintWriter(); // 测试 FileReader 读取
entrance.readFileReader();
// 测试 BufferedReader 读取
entrance.readBufferedReader();
} private void writeFileWriter() throws IOException {
try (FileWriter fw = new FileWriter(basicPath + "writeUnicode_FileWriter.txt")) {
fw.write("测试 FileWriter 写入。");
}
} private void writeBufferedWriter() throws IOException {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(basicPath + "writeUnicode_BufferedWriter.txt"))) {
bw.write("测试 BufferedWriter 写入。");
}
} private void writePrintWriter() throws IOException {
try (PrintWriter pw = new PrintWriter(new FileWriter(basicPath + "writeUnicode_PrintWriter.txt"))) {
pw.write("测试 PrintWriter 写入。");
}
} private void readFileReader() throws IOException {
// 方式1:一个一个char读取 (不推荐)
try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
} // 方式2:数组自定长度一次性读取
try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
char[] buf = new char[1024];
int length;
while ((length = fr.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
} private void readBufferedReader() throws IOException {
// 方式1:一个一个char读取 (不推荐)
try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
int c;
while ((c = br.read()) != -1) {
System.out.print((char) c);
}
} // 方式2:数组自定长度一次性读取
try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
char[] buf = new char[1024];
int length;
while ((length = br.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
} // 方式3:bufferedReader.readLine()读取
try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.print(line);
}
}
} }
2 字节流读写

package com.writefiles; import java.io.*; /**
* @author: Convict.Yellow
* @date: 2020/12/22 15:27
* @description: 字节流的基本单位为字节(Byte),一个字节为8位(bit),主要是用来处理二进制(数据)。
* 字节流有两个基类:InputStream(输入字节流)和 OutputStream(输出字节流)。
* <p>
* 字节流写文件主要用:FileOutputStream,BufferedOutputStream
* 字节流读文件主要用:FileInputStream,BufferedInputStream
*/
public class WriteAndReadByByte { private static final String basicPath = "D:/ztest/"; public static void main(String[] args) throws IOException {
WriteAndReadByByte entrance = new WriteAndReadByByte(); // 测试 FileOutputStream 写入
entrance.writeFileOutputStream();
// 测试 BufferedOutputStream 写入
entrance.writeBufferedOutputStream(); // 测试 FileInputStream 读取
entrance.readFileInputStream();
// 测试 BufferedInputStream 读取
entrance.readBufferedInputStream(); } private void writeFileOutputStream() throws IOException {
try (FileOutputStream fos = new FileOutputStream(basicPath + "writeByte_FileOutputStream.txt")) {
String content = "测试 FileOutputStream 写入。";
byte[] bytes = content.getBytes();
fos.write(bytes);
}
} private void writeBufferedOutputStream() throws IOException {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
String content = "测试 BufferedOutputStream 写入。";
byte[] bytes = content.getBytes();
bos.write(bytes);
}
} private void readFileInputStream() throws IOException {
// 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
int ch;
while ((ch = fis.read()) != -1) {
System.out.print((char) ch);
}
} // 方式2:数组自定长度一次性读取
try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
byte[] buf = new byte[1024];
int length;
while ((length = fis.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
} private void readBufferedInputStream() throws IOException {
// 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
int c;
while ((c = bis.read()) != -1) {
System.out.print((char) c);
}
} // 方式2:数组自定长度一次性读取
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
byte[] buf = new byte[1024];
int length;
while ((length = bis.read(buf)) != -1) {
String str = new String(buf, 0, length);
System.out.print(str);
}
}
} }
3 Files类读写

package com.writefiles; import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List; /**
* @author: Convict.Yellow
* @date: 2020/12/22 16:11
* @description:
*
*/
public class WriteAndReadByFiles { private static final String basicPath = "D:/ztest/"; public static void main(String[] args) throws IOException {
WriteAndReadByFiles entrance = new WriteAndReadByFiles(); // 测试 Files类写入
entrance.writeFiles(); // 测试 Files类读取
entrance.readFiles();
} private void writeFiles() throws IOException {
String content = "测试 Files 类写入。\n第二行";
Files.write(Paths.get(basicPath + "writeFiles.txt"), content.getBytes());
} private void readFiles() throws IOException {
// 方式1 (文件特大时会占满内存)
byte[] bytes = Files.readAllBytes(Paths.get(basicPath + "writeFiles.txt"));
String srcStr1 = new String(bytes);
System.out.println(srcStr1); // 方式2 (文件特大时会占满内存)
List<String> lines = Files.readAllLines(Paths.get(basicPath + "writeFiles.txt"));
StringBuilder sb = new StringBuilder();
for (String line : lines) {
// 此时line最后没有换行,因为readAllLines以换行分隔了所有行,可以用System.out.print 看到效果
sb.append(line).append("\n");
}
String srcStr2 = sb.toString();
System.out.println(srcStr2); // 方式3 JDK8的Stream流,边消费边读取
String srcStr3 = Files.lines(Paths.get(basicPath + "writeFiles.txt")).reduce((s1, s2) -> s1 + s2).get();
System.out.println(srcStr3);
} }
Tip:均采用 try-with-resources写法,故无需手动 close流,try-with-resources写法可参考此处。
Java读写文件常用方法的更多相关文章
- java 读写文件常用方法
package study.bigdata; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; ...
- Java读写文件方法总结
Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...
- Java读写文件的几种方式
自工作以后好久没有整理Java的基础知识了.趁有时间,整理一下Java文件操作的几种方式.无论哪种编程语言,文件读写操作时避免不了的一件事情,Java也不例外.Java读写文件一般是通过字节.字符和行 ...
- java读写文件大全
java读写文件大全 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int o ...
- 【java】java 读写文件
场景:JDK8 将上传的文件,保存到服务器 Java读写文件操作: MultipartFile file InputStream inputStream = file.getInputStream( ...
- 转:Java读写文件各种方法及性能比较
干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记.经常想得捡起,但总是因为一些原因,不能如愿. 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来. 文件 ...
- 161012、JAVA读写文件,如何避免中文乱码
1.JAVA读取文件,避免中文乱码. /** * 读取文件内容 * * @param filePathAndName * String 如 c:\\1.txt 绝对路径 * @return boole ...
- java 读写文件乱码问题
这样写,会出现乱码.原因是文件时gbk格式的, BufferedReader br = new BufferedReader(new FileReader(indir)); BufferedWrite ...
- java读写文件小心缓存数组
一般我们读写文件的时候都是这么写的,看着没问题哈. public static void main(String[] args) throws Exception { FileInputStr ...
随机推荐
- 『无为则无心』Python函数 — 33、高阶函数
目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...
- 初识python: 多态
多态:允许你将父对象设置成为,与一个或更多其子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作. 简单讲就是:允许将子类类型的指针赋值给父类类型的指针. 多态 ...
- springboot 开启事务回滚
在数据库操作时如果发生异常,回滚的方法 在方法上添加注解@Transactional,作用域是方法级的 参考资料: https://www.cnblogs.com/c2g5201314/p/13163 ...
- iview 按需引入解决加载慢的问题
如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...
- 使用Swing的GUI编程
Swing AWT概述 AWT:抽象窗口工具包,提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具 Swing以AWT为基础的,尽管Swing消除了 ...
- 二维数组与稀疏数组的转换---dataStructures
首先我们看一个需求 在11 * 11 的五子棋的棋盘中 我们使用0代表十字交叉点也是无效的数据 用1代表黑棋 用2代表蓝棋 那么所看到的棋盘如下 改用数字显示后就如一下样式 现在我们需要将怎个棋盘存储 ...
- MCU软件最佳实践——使用printf打印数据
在mcu上开发应用时,使用串口打印调试信息是最常用的调试手段之一.printf是c标准库提供的函数,可以方便输出格式化的信息.但针对不同的mcu芯片,printf函数要能正常工作,需要做一些移植和适配 ...
- leetcode 921. 使括号有效的最少添加
问题描述 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字符 ...
- k8s中kubeconfig的配置及使用
1.概述 kubeconfig文件保存了k8s集群的集群.用户.命名空间.认证的信息.kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯. 注意:用于配 ...
- 【Android】安卓开发中的布局与事件
[Android]安卓开发中的布局与事件 1.Android Studio下载配置 非常简单的百度然后点击下载安装就好了.注意的是,本来我是打算使用评价还不错的Genymotion这个软件来充当虚拟机 ...