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

本文深入解析Java中文件操作及IO流应用,包括File类的使用、文件创建与删除、目录操作,以及字节流与字符流的具体实现,通过实例演示如何进行文件复制与文本写入。

内容

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.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流,这一次非常清晰。捋顺了它们之间的关系,总之收获颇丰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值