一.字符流:读写纯文本(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读写文件常用方法的更多相关文章

  1. java 读写文件常用方法

    package study.bigdata; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; ...

  2. Java读写文件方法总结

    Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...

  3. Java读写文件的几种方式

    自工作以后好久没有整理Java的基础知识了.趁有时间,整理一下Java文件操作的几种方式.无论哪种编程语言,文件读写操作时避免不了的一件事情,Java也不例外.Java读写文件一般是通过字节.字符和行 ...

  4. java读写文件大全

     java读写文件大全 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int o ...

  5. 【java】java 读写文件

    场景:JDK8  将上传的文件,保存到服务器 Java读写文件操作: MultipartFile file InputStream inputStream = file.getInputStream( ...

  6. 转:Java读写文件各种方法及性能比较

    干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记.经常想得捡起,但总是因为一些原因,不能如愿. 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来. 文件 ...

  7. 161012、JAVA读写文件,如何避免中文乱码

    1.JAVA读取文件,避免中文乱码. /** * 读取文件内容 * * @param filePathAndName * String 如 c:\\1.txt 绝对路径 * @return boole ...

  8. java 读写文件乱码问题

    这样写,会出现乱码.原因是文件时gbk格式的, BufferedReader br = new BufferedReader(new FileReader(indir)); BufferedWrite ...

  9. java读写文件小心缓存数组

    一般我们读写文件的时候都是这么写的,看着没问题哈.   public static void main(String[] args) throws Exception {   FileInputStr ...

随机推荐

  1. Oracle:使用PL-SQL登录时报ORA-12541:无监听程序的解决办法

    背景: 在自己公司安装的Oracle,当时Oracle的监听地址都是写的公司的地址 后来由于项目需要,办公地点转移到了客户处, 大概有半年没有以sys用户登录数据库了. 最近在上下班途中学习Djang ...

  2. ubuntu 18.04 检测到系统程序出现问题

    检测到系统程序出现问题,想立即报告这个问题吗? 可以暂时先把这个提示关闭掉 $ sudo vi /etc/default/apport 找到第4行 修改为 enabled=0 保存退出 附linux中 ...

  3. centos7 配置rm命令失效。

    之前写过一篇alias别名的方法,但这个方法配置rm命令在重启后就无效了.而且重启后得输入source alias_test.sh.才可以 centos7 alias别名永久生效 原因是:root用户 ...

  4. 【Java】注解Annotation

    注解 Annotation 理解Annotation jdk 5.0 新增的功能 Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通 ...

  5. MySQL 5.7 版本的 UTF8 字符集调研

    一.故事背景 记一次 sql_mode 非严格模式下的业务事故排查.当时数据库没有开启 sql_mode 为严格模式,并且数据表的编码是 utf8,表现为业务侧的 Insert SQL 语句执行成功, ...

  6. Rust 实现Netty HashedWheelTimer时间轮

    目录 一.背景 二.延迟队列-时间轮 三.Netty 时间轮源码分析 四.Rust实现HashedWheelTimer 五.总结思考 一.背景 近期在内网上看到一篇文章,文中提到的场景是 系统自动取消 ...

  7. jvm锁的四种状态 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态

    一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因? --->synchronized是在jvm层面实现同步的一种机制.  jvm规范中可以看到synchronized在jvm里 ...

  8. DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | NEURAL NETWORKS

    神经网络可以使用 torch.nn包构建. 现在你已经对autograd有所了解,nn依赖 autograd 定义模型并对其求微分.nn.Module 包括层,和一个返回 output 的方法 - f ...

  9. 用Python实现一个Picgo图床工具

    PyPicGo PyPicGo 是一款图床工具,是PicGo是Python版实现,并支持各种插件自定义插件,目前PyPicGo自带了gitee.github.SM.MS和七牛云图传,以及rename. ...

  10. Druid未授权访问实战利用

    Druid未授权访问实战利用 ​ 最近身边的同学都开始挖src了,而且身边接触到的挖src的网友也是越来越多.作者也是在前几天开始了挖src之路.惊喜又遗憾的是第一次挖src就挖到了一家互联网公司的R ...