IO流概念:IO流其实就是java程序与计算机上(或者网络上的文件),进行交互的抽象过程。
1、file文件
- IO流通过java程序操作计算机上的文件或者文件夹;Windows操作系统使用dos命令来操作计算机上的文件。
1、1File
java用来表示文件的类,该类用来表示文件的路径。
- 相对路径和绝对路径的区别:
相对路径:要有参考目标,以参考目标为例相对于目标的位置
绝对路径:能够直接准确定位到的位置,就是哪个盘符下 - 在java程序中,如果要将文件放到程序中的时候,应该将他放到项目的根目录或者根目录的子目录下(不可以放到src下,src是资源文件夹);
- URL / URI:统一资源定位符
URI:只能进行位置的确定,只能得到位置是什么
URL:可以获取文件位置,可以使用IO流进行网络资源的获取
代码演示如下:
@Test
void file03(){
//URI只能定位资源,统一资源标识符
try {
URI uri = new URI("MapDemo.java");
//返回此 URI 的已解码的路径组成部分。
System.out.println(uri.getPath());//MapDemo.java
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
void file04(){
//使用URL获取资源并下载资源,统一资源定位符
try {
URL url = new URL("http://www.slxy.cn/__local/E/C4/F7/8B0A27C3DA0C354BC0FE9451066_3BEE9DFB_1ABCE.jpg");
//返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
URLConnection openConnection = url.openConnection();
InputStream inputStream = openConnection.getInputStream();
FileOutputStream out = new FileOutputStream(new File("slxy.jpg"));
byte [] bytes = new byte[1024*1000];
inputStream.read(bytes);
out.write(bytes);
out.close();
inputStream.close();
System.out.println("文件下载完成");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
1、2对文件的操作(文件和文件夹)
1、2、1构造方法
//使用构造方法实例化
@Test
void file02() {
/*
* 通过两个参数的构造方法进行实例化file的时候,
* 自动进行拼接并且自动加上"/",
* 如果自己写了就不加
*/
//F:\newJ2021\IO文件操作\MapDemo.java
File parent = new File("f:/newJ2021");
/*
* 构造方法一
* File(File parent, String child)
* 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
*/
File file = new File(parent,"\\IO文件操作\\MapDemo.java");
//获取绝对路径
System.out.println(file.getAbsolutePath());//f:\newJ2021\IO文件操作\MapDemo.java
/*
* 构造方法二
* File(String parent, String child)
* 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
*/
File file01 = new File("f:/newJ2021","\\IO文件操作\\MapDemo.java");
System.out.println(file01.getAbsolutePath());//f:\newJ2021\IO文件操作\MapDemo.java
}
1、2、2方法
测试操作
- isAbsolute( );
- isDirectory( );
- isFile( );
- isHidden( );
File file = new File("F:\\newJ2021\\StudentSystemOOP\\src\\com\\xingyun\\bean\\Admin.java");
// 判断路径是绝对路径吗
System.out.println("是否是绝对路径" + file.isAbsolute());//是否是绝对路径true
// 判断他是否是一个目录
System.out.println("是目录吗" + file.isDirectory());//是目录吗false
// 判断他是否是一个文件
System.out.println("是文件吗" + file.isFile());//是文件吗true
// 判断他是否是一个隐藏文件
System.out.println("是隐藏文件吗" + file.isHidden());//是隐藏文件吗false
// 判断他是否存在
System.out.println("是否存在" + file.exists());//是否存在true
//查看文件的长度
System.out.println("长度是"+file.length());//长度是689
删除操作
- delete( );
要删除的如果是目录,必须是空目录,否则删除失败
//对文件进行删除,删除的必须是一个空目录
boolean delete = file.delete();
System.out.println("是否删除成功"+delete);//是否删除成功true
创建操作
- mkdir( );这个方法只能创建一级目录
- mkdirs();这个方法可以创建多级目录
- createNewFile( );
//创建文件
File newfile01 = new File("E:\\newJ2021\\demo");
//创建一级目录
boolean mkdir = newfile01.mkdir();
System.out.println("创建文件"+mkdir);//创建文件true
File newfile02 = new File("E:\\newJ2021\\demo\\test");
//创建多级目录
boolean mkdirs = newfile02.mkdirs();
System.out.println("创建文件"+mkdirs);//创建文件true
//指定路径创建文件
File newfile3 = new File("E:\\newJ2021\\hello.docx");
try {
//当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
boolean createNewFile = newfile3.createNewFile();
System.out.println("创建文件"+createNewFile);//创建文件true
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
查找操作
- list( );
- list( FilenameFilter filter);
- listFiles( );
- listFiles( FileFilter filter);
- listFiles( FilenameFilter filter);
- listRoots( );
//查找,遍历
@Test
void test02(){
/*
* 在进行文件查找或者操作之前,
* 先判断文件路径所指的文件或者文件夹是否存在
*/
File file = new File("F:\\newJ2021\\StudentManager");
int count = 0;
if(file.exists()) {
System.out.println("文件或者文件夹存在");
//获取该文件是目录吗
if(file.isDirectory()) {
System.out.println("是一个目录");
//获取该目录的所有文件和文件夹
//list方法获取的是文件或者文件夹的字符串形式
String[] list = file.list();
for (String filename : list) {
count++;
System.out.println(filename);
}
System.out.println("该目录总共有"+count+"个文件");
}else {
System.out.println("是一个文件");
}
}else {
System.out.println("文件或者文件夹不存在");
}
}
//查找遍历
@Test
void test03(){
//在进行文件查找或者操作之前,先判断文件路径所指的文件或者文件夹是否存在
File file = new File("F:\\newJ2021\\StudentManager");
//获取string的表示形式
String[] list = file.list();
System.out.println(list.length);
//获取该目录下的所有文件,用file来表示
File[] listFiles = file.listFiles();
System.out.println(listFiles.length);
}
1、3文件过滤器 FileFilter(函数式接口)
三种方式:
- 匿名对象法
/*
* 匿名对象法
*/
@Test
void fileFilter01() {
//实例化file
File file = new File("F:\\newJ2021\\OOPWork2\\src\\com\\xingyun\\CarDaiLi");
//使用过滤器过滤文件,只要java文件
File[] files = file.listFiles(new FileFilter() {
//该方法就是实际进行选择的方法
@Override
public boolean accept(File pathname) {
//先获得文件的名字,进行后缀判断
if(pathname.getName().endsWith("java")) {
return true;
}
return false;
}
});
System.out.println(files.length);
for (File file2 : files) {
System.out.println(file2.getName());
}
}
- lambda表达式法
/*
* lanbda表达式法
*/
@Test
void fileFilter02() {
//实例化file
File file = new File("F:\\newJ2021\\OOPWork2\\src\\com\\xingyun\\CarDaiLi");
//使用过滤器进行过滤,只要jpg文件
File[] files = file.listFiles((File name)->{
if(name.getName().endsWith("java")) {
return true;
}
return false;
});
System.out.println(files.length);
for (File file2 : files) {
System.out.println(file2.getName());
}
}
- 自定义过滤器法
/*
* 自定义过滤器
*/
@Test
void fileFilter03() {
//实例化file
File file = new File("F:\\newJ2021\\OOPWork2\\src\\com\\xingyun\\CarDaiLi");
File[] files = file.listFiles(new MyFilter());
System.out.println(files.length);
for (File file2 : files) {
System.out.println("文件名称为"+file2.getName());
}
}
//自定义过滤器
class MyFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
if(pathname.getName().endsWith("java")) {
return true;
}
return false;
}
}
2、使用递归进行file操作
2、1非递归查找
//获取该路径下所有的java文件
@Test
void fun02() {
File file = new File("F:\\java课堂笔记");
//首先判断文件是否存在
if(file.exists()) {
//判断他是一个目录吗
if(file.isDirectory()) {
//如果是一个文件夹的话,便遍历这个文件夹下所有的文件,包括文件夹
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
//判断file2是文件还是文件夹
if(file2.isDirectory()) {
//如果是一个文件夹的话,便遍历这个文件夹下所有的文件
File[] listFiles2 = file2.listFiles();
//遍历
for (File file3 : listFiles2) {
//判断
if(file3.isDirectory()) {
//获取所有
File[] listFiles3 = file3.listFiles();
for (File file4 : listFiles3) {
if(file4.getName().endsWith("java")) {
System.out.println(file4.getName());
}
}
}else {
if(file3.getName().endsWith("java")) {
System.out.println(file3.getName());
}
}
}
}else {
if(file2.getName().endsWith("java")) {
System.out.println(file2.getName());
}
}
}
}
}
}
2、2递归查找
public static void main(String[] args) {
File file = new File("F:\\J2021");
getFile(file);
getFile01(file);
}
//查找文件的方法
public static void getFile(File file) {
//判断
if(file.exists()){
if(file.isDirectory()) {
//遍历
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
//递归调用
getFile(file2);
}
}else {
System.out.println(file.getName());
}
}
}
//查找所有的java文件
public static void getFile01(File file) {
//判断
if(file.exists()){
if(file.isDirectory()) {
//遍历
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
//递归调用
getFile(file2);
}
}else {
if(file.getName().endsWith("java")) {
System.out.println(file.getName());
}
}
}
}