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 之 爬虫:BeautifulSoup 的 find、find_all、select 方法
from bs4 import BeautifulSoup lxml 以lxml形式解析html,例:BeautifulSoup(html,'lxml') # 注:html5lib 容错率最高fin ...
- elasticsearch设置密码
ELK - X-Pack设置用户密码 enable X-Pack security vi elasticsearch.yml #首先开启x-pack插件 xpack.security.enabled: ...
- android 报错 net::ERR_CLEARTEXT_NOT_PERMITTED
这是从27版本后不允许使用http方式来请求 ,需要使用https 解决办法: 加入一个开关即可 android:usesCleartextTraffic="true"
- Go语言实战-爬取校花网图片
一.目标网站分析 爬取校花网http://www.xiaohuar.com/大学校花所有图片. 经过分析,所有图片分为四个页面,http://www.xiaohuar.com/list-1-0.htm ...
- Hive的分析函数的使用
原文: https://www.toutiao.com/i6769120000578945544/?group_id=6769120000578945544 我们先准备数据库.表和数据 开窗分析函数相 ...
- phar反序列化
我们一般利用反序列漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高这种漏洞利用越来越来难了,但是在今年8月份的Blackhat2018大会上,来自Secarma的安全研究 ...
- 【Java】单例设计模式
文章目录 单例设计模式 什么是设计模式 单例设计模式 实现 饿汉式 懒汉式 饿汉式与懒汉式的区别 饿汉式 懒汉式 单例模式的应用场景 单例设计模式 什么是设计模式 设计模式是在大量的实践中总结和理论化 ...
- Appium+python自动化测试过程中问题
一.自动删除contactmanager 自动化测试appium提供的sample如下包/activity:com.example.android.contactmanager/.ContactMan ...
- 使用.NET 6开发TodoList应用(30)——实现Docker打包和部署
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 .NET 6 Web API应用使用最多的场景是作为后端微服务应用,在实际的项目中,我们一般都是通过将应用程序打包成docke ...
- actf2020 exec
actf2020 exec 1.根据提示,ping一个127.0.0.1,有回显,ls一下发现index.php 3.方向找错了,绕了一大圈,还cat了index.php也没发现什么 最后没招了,回原 ...