内容

1.文件简介
2.File类使用
3.IO流

一.文件简介

1.文件是什么东西

文件:可以是目录(平常理解的文件夹),也可以是具体的文件(文本、图片、音频、视频等等)

2.文件的操作

1.创建文件
2.判断文件是否存在
3.写入相应的数据
(注意:File没有具体的读取和写入的方法,数据的读取和写入通过IO流操作)
4.删除

3.目录的操作

1.创建目录(文件夹)
2.判断目录是否存在
3.对目录进行相应操作(往目录中copy文件等)
4.删除目录

二.File类使用

1.注意点

①File创建出的对象,可以指向指定的一个文件。这个被指向的文件可以存在,也可以不存在。当该文件不存在时,new File(“文件路径”)不会创建这个文件
②File有专门创建文件和目录的方法。分别是createNewFile()mkdir()
③可理解为:File是 文件和目录 路径名的抽象表示形式

2.File使用示例(针对文件)
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

//1.让file对象指向指定的一个文件(有可能存在,也有可能不存在)
File file = new File("C:\\Users\\刘金豪\\Desktop\\temp");
//new File并不会创建这个文件

//2.判断文件是否存在
if(!file.exists()) {
//3.创建文件(这段程序在此之前不会真正创建一个文件)
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}


}

}
3.File使用示例(针对目录)
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

File file = new File("C:\\Users\\刘金豪\\Desktop","newFile");

if(file.exists()) {
return;
}
try {
//创建目录
file.mkdir();
}catch(NullPointerException e) {
e.printStackTrace();
}



}

}
4.删除文件
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

//1.得到这个文件
File parent = new File("C:\\\\Users\\\\刘金豪\\\\Desktop");
File file = new File(parent,"file");

if(file.exists()) {
file.delete();
}


}

}
5.File中的常用方法
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

//1.得到这个文件
File file = new File("C:\\Users\\刘金豪\\Desktop\\newFile");

//2.判断是文件还是目录
if(file.isDirectory()) {
System.out.println("是目录");
}
if(file.isFile()) {
System.out.println("是文件");
}

//3.1查看当前目录的所有内容(列出来所有文件的名称)
String[] fileNameList = file.list();
for(String name:fileNameList) {
System.out.println(name);
}
//3.2文件过滤
String[] fileNameListAccept = file.list(new FilenameFilter() {

@Override
public boolean accept(File arg0, String arg1) {
//返回true,即满足条件,当前文件就会被过滤出来
//如果返回false,则不满足条件,就不会被过滤出来
//arg0是文件夹的路径,arg1是文件的名称
File f = new File(arg0,arg1);

if(f.isFile()) {
return true;
}
return false;
}

});
for(String name:fileNameListAccept) {
System.out.println(name);
}

//3.3得到file中的文件,并且输出绝对路径(与3.2有相通之处)
File[] files = file.listFiles();
for(File f:files) {
System.out.println(f.getAbsolutePath());
}


}

}

输出结果

文件1
文件2
文件1
文件2
C:\Users\刘金豪\Desktop\newFile\文件1
C:\Users\刘金豪\Desktop\newFile\文件2

三.IO流

1.IO流简介

输入流和输出流不是绝对的,而是相对于内存来说的,再准确一点来说就是相对于内存中正在运行的程序来说的,更精确一点就是相对于正在运行的进程来说的。
输出:内存 -> 外部(硬盘/网络/打印机等外部设备)
输入:外部(硬盘/网络/打印机等外部设备) ->内存

2.举例

比如我们常用的复制粘贴,假如把桌面的东西再复制到桌面上,那么会经过:硬盘(也就是这里的桌面)上的目标文件通过输入流到内存,再通过输出流到硬盘(也就是这里的桌面)

3.数据的储存方式(字节和字符)

有两种:

1.以字节形式存储 比如:图片、视频、音频、exe(二进制,点开看不懂)
2.以字符形式存储 比如:文本(点开能看懂)
这两种数据存储形式不一样,那么读取的方式就不同。如果是二进制文件,那么就需要用字节流读取。如果是文本,那就可以用字符流读取

4.字节流和字符流




Java项目实战开发Day16 2020-04-10_python


字节输入输出流继承结构图



Java项目实战开发Day16 2020-04-10_linux_02


字符输入输出流继承结构图


①字节输入输出流是InputStream 和 OutputStream。这两个都是抽象类
字符输入输出流是 Reader 输出是Writer。这两个也是抽象类
②具体实现类
字节流的输入流FileInputStream 输出流FileOutputStream
字符流输入流 FileReader输出流FileWriter
③注意:当使用IO流时,不需要的资源一般需要自己手动释放(关闭文件)

5.流的形象理解

可以把流当作水流的通路,创建流就是拧开水龙头,这个时候水就可以从源头顺着水管流到需要的地方(这里的水就类似Java中的数据,水流的通道即水管就是Java中的流)到时候水流够了之后就需要关闭水龙头(也就是关闭流)
向文件中写入文本

6.字符输出流使用示例(其余与此类似)
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){
//1.准备需要写入的数据
String text = "hello";//这个已经在内存中存在了

//2.决定是选择字符流还是字节流(是相当于输出)
FileWriter fw = null;
try {
//是把内存中的文本内容写到磁盘中,所以选择字符输出流
fw = new FileWriter("C:\\Users\\刘金豪\\Desktop\\temp");

//开始写入数据
fw.write(text);

} catch (IOException e) {
e.printStackTrace();
}finally {
//3.关闭流
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

}

注意:凡是实现了closeable接口的类都可以在try(){
}的()里面创建对象好处:当try代码块执行完毕或者有异常的时候,系统会自动关闭对应的对象

7.1使用字节输入输出流完成图片复制粘贴(一次性读取一个字节)

知识点
①在des里面也要写上图片的名称。如果复制的不是图片,也需遵守此规则。
②read()不加参数就是一次读取一个字节,当然也可以加参数,后面代码会有介绍。当读取完毕时,返回-1

import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

//1.保存图片地址和拷贝到的地址
String src = "C:\\Users\\刘金豪\\Desktop\\mmexport1566548991556.jpg";
String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意这里,要再写一个jpg

try (//2.将图片读取到内存中(输入流),因为是图片,所以是字节流
FileInputStream fis = new FileInputStream(src);

//3.将内存中的图片写到磁盘中(字节输出流)
FileOutputStream fos = new FileOutputStream(des);
){

//每次获取的一个字节
int b = 0;
while(true) {
//4.从输入流里面获取数据,写入到输出流
b = fis.read();//read不加参数是一个字节一个字节读取
//一个字节一个字节地写入内存
//读完了就返回-1

//判断是否读取完毕
if(b == -1) {
break;
}

//5.一个字节一个字节地读出去
fos.write(b);

}

} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}



}

}
7.2一次性读取多个字节

知识点:read的参数一般是数组,如果加了参数,就直接把数据读入这个参数里面了

import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

String src = "C:\\Users\\刘金豪\\Desktop\\mmexport1566548991556.jpg";
String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意这里,要再写一个jpg

try (FileInputStream fis = new FileInputStream(src);

FileOutputStream fos = new FileOutputStream(des);
){

//字节数组,用于保存一次性读取的多个数据
byte[] buffer = new byte[1024];//通常定义1024个字节

int len = 0;
while(true) {
//4.从输入流里面获取数据,写入到输出流
len = fis.read(buffer);

//判断是否读取完毕
if(len == -1) {
break;
}

//5.一个字节一个字节地读出去
fos.write(buffer);//数据读入buffer里面了

}

} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}



}

}
8.1使用字符流完成文本复制粘贴
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

String src = "C:\\Users\\刘金豪\\Desktop\\temp";
String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\temp";

try(FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(des);){
while(true) {
int ch = fr.read();
if(ch == -1) {
break;
}
fw.write(ch);
}
}catch(Exception e) {
e.printStackTrace();
}
}


}

}
8.2一次性读取多个字符(和字节流的基本一样)
import java.io.*;
import java.util.*;

public class 测试程序 {


public static void main(String[] args){

String src = "C:\\Users\\刘金豪\\Desktop\\temp";
String des = "C:\\Users\\刘金豪\\Desktop\\newfile\\temp";

try(FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(des);){

char[] buffer = new char[1024];
while(true) {
int len = fr.read(buffer);
if(len == -1) {
break;
}
fw.write(buffer);
}
}catch(Exception e) {
e.printStackTrace();
}
}


}

}

总结

相比第一次学文件和IO流,这一次非常清晰。捋顺了它们之间的关系,总之收获颇丰。