内容
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.字节流和字符流
字节输入输出流继承结构图
字符输入输出流继承结构图
①字节输入输出流是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.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流,这一次非常清晰。捋顺了它们之间的关系,总之收获颇丰。