- 一. 文件
- 概念
- 文件流
- 常见的文件的操作
- 二. IO流原理及其分类
- 2.1 `InputStream` 和 `OutputStream`
- 2.2 `Reader` 和 `Writer`
- 三. 节点流和处理流
- 3.1 节点流
- 3.2 处理流
- 3.3 节点流和处理流的区别和联系
文件就是保存数据的地方,比如大家经常使用的word文档,text文档,excel文档,可以是音频也可以是视频还可以是文件。
文件流文件在程序中是以流的形式来操作的。
- 输入流:磁盘(文件)中的数据加载到程序(内存)中。
- 输出流:程序(内存)中的数据加载到磁盘(文件)中。
常见文件对象的相关的构造器和方法
-
相关方法
- new File(String path) // 根据路径构建一个File对象
- new File(File parent, String child) // 根据父目录文件 + 子路径 构建
- new File(String parent, String child) // 根据父目录 + 子目录路径 构建
-
@Test的使用:
- alt + enter 选择一个类别
package Pac;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import java.io.File;
import java.io.IOException;
public class FileCreate {
public static void main(String[] args) {
}
//方式1:new File(String path) // 根据路径构建一个File对象
@Test
public void create01(){
String filePath = "e:\news1.txt";
File file = new File(filePath);
try{
file.createNewFile();
System.out.println("news1.txt文件创建成功~");
}catch (IOException e){
e.printStackTrace();
}
}
//方式2: new File(File parent, String child) // 根据父目录文件 + 子路径 构建
//e:\new2.txt
@Test
public void create02(){
File parentFile = new File("e:\");
String fileName = "news2.txt";
File file = new File(parentFile,fileName); //在这里里,仅仅是在内存里面有file
try{
file.createNewFile(); //执行了create才是真正将file写在磁盘里面
System.out.println("news2.txt文件创建成功~ ");
}catch(IOException e){
e.printStackTrace();
}
}
//方式3:new File(String parent, String child) // 根据父目录 + 子目录路径 构建
@Test
public void create03(){
String parentPath = "e:\";
String filePath = "news3.txt";
File file = new File(parentPath, filePath);
try{
file.createNewFile();
System.out.println("news3.txt文件创建成功~");
}catch(IOException e){
e.printStackTrace();
}
}
}
- 获取文件的相关的信息
- getName、getAbsolutePath、getParent、length、exits、isFile、isDirectory
package Pac;
import org.junit.jupiter.api.Test;
import java.io.File;
public class FileInformation {
public static void main(String[] args) {
}
//获取文件的信息
@Test
public void info(){
//先创建文件的对象
File file = new File("e:\news1.txt");
//调用相应的方法,得到对应的信息
System.out.println("文件名字 = " + file.getName());
// 常用的文件的方法: getName、getAbsolutePath、getParent、length、exits、isFile、isDirectory
System.out.println("文件的绝对路径 = " + file.getAbsolutePath());
System.out.println("文件的父目录 = " + file.getParent());
System.out.println("文件的大小 = " + file.length());
System.out.println("文件是否存在" + file.exists());
System.out.println("是否是一个文件" + file.isFile());
System.out.println("是否是一个目录" + file.isDirectory());
}
}
"C:Program FilesJavajdk1.8.0_152binjava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar=52010:D:软件下载ideaideaIntelliJ IDEA 2021.1bin" -Dfile.encoding=UTF-8 -classpath "D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-launcher1.7.0junit-platform-launcher-1.7.0.jar;D:软件下载ideaideaIntelliJ IDEA 2021.1pluginsjunitlibjunit5-rt.jar;D:软件下载ideaideaIntelliJ IDEA 2021.1pluginsjunitlibjunit-rt.jar;C:Program FilesJavajdk1.8.0_152jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_152jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_152jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_152jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_152jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_152jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_152jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_152jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_152jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_152jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_152jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_152jrelibjce.jar;C:Program FilesJavajdk1.8.0_152jrelibjfr.jar;C:Program FilesJavajdk1.8.0_152jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_152jrelibjsse.jar;C:Program FilesJavajdk1.8.0_152jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_152jrelibplugin.jar;C:Program FilesJavajdk1.8.0_152jrelibresources.jar;C:Program FilesJavajdk1.8.0_152jrelibrt.jar;E:刘建成javaprojectProoutproductionMud;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter5.7.0junit-jupiter-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-api5.7.0junit-jupiter-api-5.7.0.jar;C:UsersAdministrator.m2repositoryorgapiguardianapiguardian-api1.1.0apiguardian-api-1.1.0.jar;C:UsersAdministrator.m2repositoryorgopentest4jopentest4j1.2.0opentest4j-1.2.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-commons1.7.0junit-platform-commons-1.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-params5.7.0junit-jupiter-params-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-engine5.7.0junit-jupiter-engine-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-engine1.7.0junit-platform-engine-1.7.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 Pac.FileInformation,info 文件名字 = news1.txt 文件的绝对路径 = e:news1.txt 文件的父目录 = e: 文件的大小 = 14 文件是否存在true 是否是一个文件true 是否是一个目录false Process finished with exit code 0
- 目录的操作和文件的删除
- mkdir创建一级目录、mkdirs创建多级目录、delete删除空目录或者文件
package Pac;
import org.junit.jupiter.api.Test;
import java.io.File;
public class Directory_ {
public static void main(String[] args) {
//
}
//判断E盘中 E:\news1.txt是否存在,如果存在则删除
@Test
public void m1(){
String filePath = "d:\news1.txt";
File file = new File(filePath);
if(file.exists()){
if(file.delete()){
System.out.println(filePath + "删除成功");
} else{
System.out.println(filePath + "删除失败");
}
}else{
System.out.println("该文件不存在......");
}
}
}
二. IO流原理及其分类
- 按照操作的数据单位不同:字节流(8 bit), 字符流(按字符)
- 按数据流的流向分为:输入流、输出流
- 按照流的角色分为:节点流,处理流 / 包装流
| 抽象基类 | 字符流 | 字符流 |
|---|---|---|
| 输入流 | InputStream | Reader |
| 输出流 | OutputStream | Writer |
- Java的IO流共涉及40多个类,实际上非常的规则,都是从如上4个抽象基派生出来的。
- 由这四个类派生出来的子类的名称都是其父类名作为子类名的后缀的。
-
InputStream抽象类是所有类字节输入流的超类
-
InputStream抽象类的常用子类
-
- FileInputStream: 文件输入流
-
- BufferedInputStream: 缓冲字节输入流
-
- ObjectInputStream: 对象字节输入流
-
-
OutputStream抽象类的常用子类
-
- FileOutputStream: 文件输出流
-
FileInputStream
package PacinputStream;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream_ {
public static void main(String[] args) {
}
//单个字节的读取,运行效率比较低
@Test
public void readFile01() {
String filePath = "e:\hello.txt";
int readData = 0;
//创建了FileInputStream对象,用于读取hello.txt文件
FileInputStream fileInputStraem = null;
try {
//创建了FileInputStream对象,用于读取hello.txt文件
fileInputStraem = new FileInputStream(filePath);
// 从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
// 如何返回-1,表示读取完毕
while((readData = fileInputStraem.read()) != -1){
System.out.print((char)readData);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//当文件读取完毕的时候,一定要关闭流,释放资源
try {
fileInputStraem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
"C:Program FilesJavajdk1.8.0_152binjava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar=53612:D:软件下载ideaideaIntelliJ IDEA 2021.1bin" -Dfile.encoding=UTF-8 -classpath "D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-launcher1.7.0junit-platform-launcher-1.7.0.jar;D:软件下载ideaideaIntelliJ IDEA 2021.1pluginsjunitlibjunit5-rt.jar;D:软件下载ideaideaIntelliJ IDEA 2021.1pluginsjunitlibjunit-rt.jar;C:Program FilesJavajdk1.8.0_152jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_152jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_152jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_152jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_152jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_152jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_152jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_152jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_152jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_152jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_152jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_152jrelibjce.jar;C:Program FilesJavajdk1.8.0_152jrelibjfr.jar;C:Program FilesJavajdk1.8.0_152jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_152jrelibjsse.jar;C:Program FilesJavajdk1.8.0_152jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_152jrelibplugin.jar;C:Program FilesJavajdk1.8.0_152jrelibresources.jar;C:Program FilesJavajdk1.8.0_152jrelibrt.jar;E:刘建成javaprojectProoutproductionMud;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter5.7.0junit-jupiter-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-api5.7.0junit-jupiter-api-5.7.0.jar;C:UsersAdministrator.m2repositoryorgapiguardianapiguardian-api1.1.0apiguardian-api-1.1.0.jar;C:UsersAdministrator.m2repositoryorgopentest4jopentest4j1.2.0opentest4j-1.2.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-commons1.7.0junit-platform-commons-1.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-params5.7.0junit-jupiter-params-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-engine5.7.0junit-jupiter-engine-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-engine1.7.0junit-platform-engine-1.7.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 PacinputStream.FileInputStream_,readFile01 hello worldï¼Œåˆ˜å»ºæˆ Process finished with exit code 0
package PacinputStream;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream_ {
public static void main(String[] args) {
}
@Test
public void readFile01() {
String filePath = "e:\hello.txt";
int readData = 0;
//创建了FileInputStream对象,用于读取hello.txt文件
FileInputStream fileInputStraem = null;
try {
//创建了FileInputStream对象,用于读取hello.txt文件
fileInputStraem = new FileInputStream(filePath);
// 从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。
// 如何返回-1,表示读取完毕
while((readData = fileInputStraem.read()) != -1){
System.out.print((char)readData);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//当文件读取完毕的时候,一定要关闭流,释放资源
try {
fileInputStraem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//优化代码:
@Test
public void readFile02() {
String filePath = "e:\hello.txt";
int readData = 0;
//定义一个字节数组
byte[] buf = new byte[8]; //一次性读取8个字节
int readLen = 0;
//创建了FileInputStream对象,用于读取hello.txt文件
FileInputStream fileInputStraem = null;
try {
//创建了FileInputStream对象,用于读取hello.txt文件
fileInputStraem = new FileInputStream(filePath);
// 从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
// 如何返回-1,表示读取完毕
while((readLen = fileInputStraem.read(buf)) != -1){ //实际读取到的值
System.out.print(new String(buf,0,readLen)); //显示
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//当文件读取完毕的时候,一定要关闭流,释放资源
try {
fileInputStraem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
"C:Program FilesJavajdk1.8.0_152binjava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar=53812:D:软件下载ideaideaIntelliJ IDEA 2021.1bin" -Dfile.encoding=UTF-8 -classpath "D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-launcher1.7.0junit-platform-launcher-1.7.0.jar;D:软件下载ideaideaIntelliJ IDEA 2021.1pluginsjunitlibjunit5-rt.jar;D:软件下载ideaideaIntelliJ IDEA 2021.1pluginsjunitlibjunit-rt.jar;C:Program FilesJavajdk1.8.0_152jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_152jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_152jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_152jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_152jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_152jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_152jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_152jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_152jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_152jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_152jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_152jrelibjce.jar;C:Program FilesJavajdk1.8.0_152jrelibjfr.jar;C:Program FilesJavajdk1.8.0_152jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_152jrelibjsse.jar;C:Program FilesJavajdk1.8.0_152jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_152jrelibplugin.jar;C:Program FilesJavajdk1.8.0_152jrelibresources.jar;C:Program FilesJavajdk1.8.0_152jrelibrt.jar;E:刘建成javaprojectProoutproductionMud;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter5.7.0junit-jupiter-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-api5.7.0junit-jupiter-api-5.7.0.jar;C:UsersAdministrator.m2repositoryorgapiguardianapiguardian-api1.1.0apiguardian-api-1.1.0.jar;C:UsersAdministrator.m2repositoryorgopentest4jopentest4j1.2.0opentest4j-1.2.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-commons1.7.0junit-platform-commons-1.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-params5.7.0junit-jupiter-params-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-engine5.7.0junit-jupiter-engine-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-engine1.7.0junit-platform-engine-1.7.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 PacinputStream.FileInputStream_,readFile02 hello world Process finished with exit code 0
FileOutputStream
package PacoutputStream;
import org.junit.jupiter.api.Test;
import java.io.*;
public class OutputStream_ {
public static void main(String[] args) {
}
@Test
public void writeFile(){
//创建按我们的FileOutputStream对象
String filePath = "e:\a.txt";
FileOutputStream fileOutputStream = null;
try {
//得到fileOutputStream对象
fileOutputStream = new FileOutputStream(filePath,true);
//写入一个字节
// fileOutputStream.write('H');
//1.这种方法是写入覆盖原来的内容
//写入字符串
String str = "hello,world!";
//str.getBytes()可以将字符串转成字符数组
fileOutputStream.write(str.getBytes());
str = "hi,world,Martin!";
fileOutputStream.write(str.getBytes(),0,str.length());
//2.如果不希望覆盖原先的内容
fileOutputStream.write(str.getBytes(),0,str.length());
} catch (IOException e) {
e.printStackTrace();
} finally {
//将流关闭
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileInputStream 和 FileOutputStream
package PacoutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) {
//完成文件拷贝,将e://Koala.jpg 拷贝c:\
//思路分析
//1. 创建的文件的输入流,将文件读入到程序
//2. 创建文件的输出流,将读取到的文件的数据写入到指定的位置
//在完成程序时,应该是读取部分数据就写入到指定的文件中,这里是使用的循环操作。
//而不是将读取全部数据,直接写入全部数据。
String srcFilePath = "e:\Koala.jpg";
String destFilePath = "d:\Koala.jpg";
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(destFilePath);
//定义一个字节数组,提高读取效率
byte[] buf = new byte[1024];
int readLen = 0;
while((readLen = fileInputStream.read(buf)) != -1){
//读取到后,就写入到文件,通过fileOutputStream
//即,是一边读一边写
fileOutputStream.write(buf,0,readLen);
}
System.out.println("拷贝ok~");
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭释放资源
try {
//如果输入流不等于空,则关闭输入流
if(fileInputStream != null){
fileInputStream.close();
}
//如果输出流不等于空,则关闭输出流
if(fileOutputStream != null){
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
"C:Program FilesJavajdk1.8.0_152binjava.exe" "-javaagent:D:软件下载ideaideaIntelliJ IDEA 2021.1libidea_rt.jar=54854:D:软件下载ideaideaIntelliJ IDEA 2021.1bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.8.0_152jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_152jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_152jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_152jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_152jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_152jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_152jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_152jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_152jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_152jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_152jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_152jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_152jrelibjce.jar;C:Program FilesJavajdk1.8.0_152jrelibjfr.jar;C:Program FilesJavajdk1.8.0_152jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_152jrelibjsse.jar;C:Program FilesJavajdk1.8.0_152jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_152jrelibplugin.jar;C:Program FilesJavajdk1.8.0_152jrelibresources.jar;C:Program FilesJavajdk1.8.0_152jrelibrt.jar;E:刘建成javaprojectProoutproductionMud;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter5.7.0junit-jupiter-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-api5.7.0junit-jupiter-api-5.7.0.jar;C:UsersAdministrator.m2repositoryorgapiguardianapiguardian-api1.1.0apiguardian-api-1.1.0.jar;C:UsersAdministrator.m2repositoryorgopentest4jopentest4j1.2.0opentest4j-1.2.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-commons1.7.0junit-platform-commons-1.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-params5.7.0junit-jupiter-params-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitjupiterjunit-jupiter-engine5.7.0junit-jupiter-engine-5.7.0.jar;C:UsersAdministrator.m2repositoryorgjunitplatformjunit-platform-engine1.7.0junit-platform-engine-1.7.0.jar" PacoutputStream.FileCopy 拷贝ok~ Process finished with exit code 02.2 Reader 和 Writer
- FileReader: 字符流,按照字符来操作
- FileReader相关方法:
- new FileReader(File/String)
- read : 每次读取单个字符,返回该字符,如果文件末尾返回-1
- read(char[]) : 批量读取多个字符到数组,返回读取到的字符数,如果到文件末未返回-1
- 相关的API:
- new String(char[]) : 将char[]转换成String
- new String(char[], off, len) : 将char[] 的指定的部分转换为String
- FileReader相关方法:
- FileWriter:字符流,按照字符来操作
-
FileWriter相关方法:
- new FileWriter(File/String): 覆盖模式,相当于流的指针在首端, 这里的覆盖模式是指,对于原来的文件。我们可以覆盖掉,如果在同一个try里面,则实际上是进行的追加的。try结束了之后,再重新覆盖的。
- new FileWriter(File/String, true): 追加模式,相当于流的指针在尾端
- write(int): 写入单个字符
- write(char[]): 写入指定数组
- write(Char[], off, len): 写入指定数组的指定部分
- write(String): 写入整个字符串
- write(Strng, off, len): 写入字符串的指定的部分
-
相关的API:
- String类
- toCharArray: 将String转换为char[]
-
FileWriter使用后,必须要关闭(close)或者刷新(flash),否则写入不到指定的文件
-
FileReader
package PacReader;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReader_ {
public static void main(String[] args) {
}
@Test
public void readFile01() {
String flaPath = "e:\story.txt";
FileReader fileReader = null;
int data = ' ';
//1.先创建一个FileReader对象
try {
fileReader = new FileReader(flaPath);
//循环读取,使用read方法,单个字符读取
while((data=fileReader.read()) != -1){
System.out.print((char)data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fileReader != null){
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void readFile02() {
String flaPath = "e:\story.txt";
FileReader fileReader = null;
int readLen = 0;
char[] buf = new char[8];
//1.先创建一个FileReader对象
try {
fileReader = new FileReader(flaPath);
//循环读取,使用read(buf)方法,返回的是实际读取到的字符数
//如果返回-1,说明文件结束
while((readLen=fileReader.read(buf)) != -1){
System.out.print(new String(buf,0,readLen));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fileReader != null){
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileWriter
三. 节点流和处理流 3.1 节点流
- 节点流可以从一个特定的数据源读写数据, 如: FileReader、FileWriter[源码]
- 处理流也叫包装流,是连接在已存在的流(节点流或处理流)之上,为程序提供更加强大的读写功能,如: BufferedReader、BufferedWriter[源码]
-
- 节点流是底层流/低级流,直接和数据源相接
-
- 处理流(包装流)包装节点流,既可以消除不同节点流实现差异,也可以提供更方便的方法来完成输入输出。[源码理解]
-
- 处理流(也叫包装流),对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连。[模拟修饰器设计模式]
BufferedReader
从这里可以看出,BufferedReader里面有一个Reader属性。个属性只要是Reader的子类都是可以的。
实现具体的BufferedReader代码
package PacReader01;
import java.io.BufferedReader;
import java.io.FileReader;
public class BufferedReader_ {
public static void main(String[] args) throws Exception{
String filePath = "E:\a.java";
//创建BufferedReader对象,节点流对象为FileReader
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
//读取
String line; //按行读取,效率高
while((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
//关闭流,仅仅需要关闭外层流就可以了。因为底层会去自动的关闭节点流
//FileReader
bufferedReader.close();
}
}
BufferedWriter
从这里可以看出,BufferedWriter里面有一个Reader属性。这个属性只要是Writer的子类都是可以的。
实现具体的BufferedWriter代码
package PacReader01;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\ok.txt";
//创建一个BufferedWriter
//说明:
// 1. new FileWriter(filePath,true) 表示以追加的方式写入
// 2. new FileWriter(filePath) 表示以覆盖的方式写入
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));
bufferedWriter.write("hello1,思格露教育");
//bufferedWriter插入一个和系统相关的换行符
bufferedWriter.newLine();
bufferedWriter.write("hello2,思格露教育");
//bufferedWriter插入一个和系统相关的换行符
bufferedWriter.newLine();
bufferedWriter.write("hello3,思格露教育");
//bufferedWriter插入一个和系统相关的换行符
bufferedWriter.newLine();
//关闭外层流即可,传入的new FileWriter(filePath) 会在底层关闭
bufferedWriter.close();
}
}



