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 ...
随机推荐
- mongdb分片
实验环境 主机 IP 虚拟通道 centos1 192.168.3.10 vmnet8 centos2 ...
- Flask_cookie和session(五)
一.cookie和session介绍 cookie 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现 ...
- Oracle 五种约束的创建和移除:
1.主键约束: 创建表的时候就添加: create table table_name (categoryId varchar2(10), categoryName varchar2(30), prim ...
- 终-Echart可视化学习(十二)
文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 进入官网寻找 里面可以搜素很多 这 ...
- Hive分析统计离线日志信息
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...
- stm32单片机利用ntc热敏电阻温度转换公式C语言版
首先 我们需要明确电路结构 热敏电阻的原理就不再赘述,本文不凑字数,只讲干货 必须要知道的就是串联电阻R9程序中定义为resistanceInSeries ,精度越高越好 为了方便,先在程序中定义好你 ...
- 离线环境安装使用 Ansible
之前写了一篇介绍 Ansible 的文章 ,今天回顾看来写的有些匆忙,一些具体的操作步骤都没有讲明白,不利于读者复现学习.最近又申请了一个几百台机器的环境,正好借此机会把如何在离线环境中使用 Ansi ...
- Java包装类和处理对象
Java中基本类型变量和字符串之间的转换 public class Primitive2String { public static void main(String args[]) { String ...
- 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单
不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...
- 【记录一个问题】opencl的clGetPlatformIDs()在cuda 9下返回-1001(找不到GPU平台)
如题:在cuda9, nvidia驱动版本 384.81 的环境下运行opencl程序,在clGetPlatformIDs()函数中返回-1001错误. 把环境更换为cuda 10,驱动版本410.1 ...