17.File类和字节流

File类

File类 : File代表计算机中所有的文件和文件夹的类
    //文件和目录路径名的抽象表示形式。 

File的构造方法

File(String pathname) : 传入文件/文件夹的路径,让File对象指向路径结尾的文件/文件夹;

File(String parent, String child) : 以子父路径的形式 传入文件/文件夹的路径,让File对象指向路径结尾的文件/文件夹;

File(File parent, String child) :  : 以子父路径的形式 传入文件/文件夹的路径,让File对象指向路径结尾的文件/文件夹; //父路径以File类型的对象表示  

File 对象创建干了哪些事情:
        1. file对象产生了
        2. 在堆内存中开辟了内存空间
        3. 如果路径结尾的文件/文件夹存在 : 不会覆盖源文件和文件夹
            如果路径结尾的文件/文件夹不存在 : 不会创建文件和文件夹

File类的自定义常量

static String pathSeparator  
static char pathSeparatorChar 
 
 
static String separator 
static char separatorChar

相对路径和绝对路径

绝对路径 : 绝对能找到目标文件/文件夹的路径 -> 完整路径
    特点 : 一定以盘符开头
        
相对路径 : 以一个相对位置出发,找到目标文件/文件夹的路径 -> 表示起来会更加简单
    在IO流技术中,相对路径的起点 : Project 的根目录(IDEA和Eclipse是一样的) //往相对路径的起点内去找(弊端)
    特点 : 没有用盘符开头的路径
    前置路径是当前项目的根目录\\"abc.txt"

File的创建功能

boolean createNewFile() : 创建新文件,返回创建是否成功; //一定创文件
	//文件存在,返回false,创建失败
   
boolean mkDir() : 创建单级文件夹,返回创建是否成功;//一定创建文件夹
boolean mkDirs() : 创建多级文件夹,返回创建是否成功;//一定创建文件夹,也能创建单级文件夹  

File的删除功能

boolean delete() : 删除File对象指向的文件/文件夹 返回删除是否成功         //不走回收站!


 File的获取功能

File getAbsoluteFile()  : 获取File对象的绝对路径,但是以File对象的形式进行返回
String getAbsolutePath() : 获取File对象的绝对路径,但是以String对象的形式进行返回
     
String getName()  : 获取File对象指向的文件/文件夹的名称  
 
String getParent() : 获取File对象指向的文件/文件夹的父路径,返回以String对象的形式进行返回
File getParentFile() : 获取File对象指向的文件/文件夹的父路径,返回以File对象的形式进行返回 
     
String getPath() : 获取创建File对象时传入的路径
     
long length() : 获取File对象指向的文件的大小(所占字节数) //文件夹没有大小
long lastModified() : 获取File对象指向的文件/文件夹的最后修改时间 //毫秒值     

File的判断功能

boolean exists()  : 判断File对象指向的文件/文件夹是否存在
boolean isAbsolute(): 判断创建File对象时使用的是否是绝对路径
 
boolean isDirectory()    : 判断File对象指向的是否是一个文件夹
boolean isFile() :  判断File对象指向的是否是一个文件 
 
boolean isHidden() : 判断File对象指向的文件/文件夹是否是隐藏的

File的遍历功能(文件夹遍历)

File[] listFiles() : 获取File对象指向的文件夹下 根目录中 所有的文件和文件夹对象,并存储到File数组中                 //单级文件夹的遍历


 

FIle的遍历功能(带过滤条件的遍历)

File[] listFiles(FileFilter filter) : 获取File对象指向的文件夹下 根目录中 所有的文件和文件夹对象,并存储到File数组中
    //单级文件夹的遍历
    //带过滤条件的文件夹遍历

    
FileFilter : 过滤器接口
    抽象方法 : boolean accept(File file)//重写accept方法的逻辑就是过滤条件,返回true允许通过,存储到数组中,返回false就拒绝通过,数组中就没有这个file对象

多级文件夹遍历

import java.io.File;
import java.io.FileFilter;

/*
    递归的出口 : file对象指向的是一个文件

    递归的规律 : 不断遍历文件夹的过程

    递归编写的技巧 :
        先写出口
        再写规律
 */
public class Demo {
    public static void main(String[] args) {
        //创建File对象 -> 指向文件夹
        File file = new File("文件夹路径");
        //第一次调用传入根目录
        getFileNames(file);
    }

    public static void getFileNames(File root){
        //先写出口
        if (root.isFile()){//判断传入的file对象是一个文件
            System.out.println("文件有 = " + root.getName());
            return;//结束方法
        }

        System.out.println("文件夹有 = " + root.getName());

        //如果能下来说明,一定是一个文件夹
        //写规律
        File[] files = root.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".xmind") || pathname.isDirectory();
            }
        });
        //遍历files数组
        for (File file : files) {//file: 子文件,子文件夹
            getFileNames(file);
        }
    }
}

IO流

IO流 : 用来让Java代码连接硬盘数据的技术名称; //流 : 水流

IO流的分类 :
    1. 流向来分 -> 参照物 : 当前Java代码
        I: Input/Reader 输入
        O: Output/Writer 输出
    2. 操作的文件类型来分
        //字节流 : XxxxStream
        字节文件 : 字节流操作字节文件  //计算机中所有的文件都是字节文件
        
        //字符流 : XxxxReader/XxxxWriter
        字符文件 : 字符流操作字符文件  //计算机中字节文件内有很多 字符文件 
            字符文件 : 文件内全是字符 //字节流操作字符文件不是那么方便!!
        字符文件如何鉴别 : 能用windows自带的记事本工具打开并能阅读文件
                .txt,.java,.xml,.hmtl,.css,.md ...
                
常见流的类型 :
    Reader : 字符输入流
    OutputStream : 字节输出流
    BufferedWriter : 高效字符输出流
    InputStreamReader : 字符输入流 -> 转换流 : 字节流通往字符流的桥梁(字符流的本质其实就是字节流 + 编码格式)

字节流

    字节输入流的根节点 : InputStream
    字节输出流的根节点 : OutputStream
    
普通字节流:
    FileInputStream/FileOutputStream : 文件字节输入/输出流
    
高效字节流:
    BufferedInputStream/BufferedOutputStream : 高效字节输入/输出流

FileOutputStream文件字节输出流

构造方法 :

FileOutputStream(String name) : 创建FileOutputStream对象,并让这个对象指向传入路径结尾的文件
        String name : 目标文件的路径 -> String 类型;

FileOutputStream(File file)  : 创建FileOutputStream对象,并让这个对象指向传入路径结尾的文件             
        File file : 目标文件的路径 -> File 对象

创建FileOutputStream对象做了哪些事情:
        1. 创建了对象
        2. 开辟了内存空间
        3. 让fos对象指向了路径结尾的文件
        4. 当文件不存在,会帮你创建文件
            当文件存在,会重新创建新文件并覆盖老文件

FileOutputStream的写数据的方法

FileOutputStream的写数据的方法 : write

void write(int b) : 一次写一个字节

void write(byte[] bys) : 一次写一个字节数组

void write(byte[] bys,int offset,int length) : 一次写一个字节数组的一部分
        int offset : 从数组的哪个索引开始写数据
        int length : 写几个字节

1. 如何写字符串

String --> byte[] :
   byte[] getBytes()  : 平台默认的编码格式进行转换 (UTF-8 : 一个中文占用3个字节)
   byte[] getBytes(String charsetName)  : 指定的编码格式进行转换 (GBK: 一个中文占用2个字节)

    2. 如何写换行符 -> "\r\n"
        write("\r\n".getBytes())
    3. 如何追加写

FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
      boolean append : 追加写开关 主动传入true ,可以追加写

FileInputStream 文件字节输入流

构造方法:
     FileInputStream(String name)
    FileInputStream(File file) 

输入流指向的源文件必须存在!! //若文件不存在则报错!!

FileInputStream 的读数据的方法

FileInputStream 的读数据的方法 : read

int read() : 一次读一个字节

int read(byte[] bys) : 一次读一个字节数组

int read(byte[] bys,int offset,int length) : 一次读一个字节数组的一部分

注意 :
    1. 如果文件中有换行符,read方法也是能读到的
    2. 当读到了文件的末尾,read方法的返回值是 -1

FileInputStream 一次读一个字节的标准代码

public class 普通字节流一次一个字节复制文件 {
    public static void main(String[] args) throws IOException {
        //创建流对象
        FileInputStream fis = new FileInputStream("源文件");
        FileOutputStream fos = new FileOutputStream("目标文件");
        //循环读写
        //定义int类型的变量by,用来存每次读到的字节
        int by;
        while((by = fis.read()) != -1){
            //读了多少写多少
            fos.write(by);
        }

        //关流
        fis.close();
        fos.close();
    }
}

FileInputStream 一次读一个字节数组的标准代码

public class 默写_普通字节流一次一个字节数组复制文件 {
    public static void main(String[] args) throws IOException {
        //创建流对象
        FileInputStream fis = new FileInputStream("T_Day21\\test\\童话镇.MP3");
        FileOutputStream fos = new FileOutputStream("C:\\Users\\WH-HKB\\Desktop\\童话镇(一次一个字节数组).mp3");

       //定义byte数组存储每次读到的字节数据
        byte[] bys = new byte[1024];
        //定义int变量len统计每次读到的字节个数
        int len;
        //循环读写
        while((len = fis.read(bys)) != -1){
            //读了多少写多少
            //**void write(byte[] bys,int offset,int length) :
            fos.write(bys,0,len);
        }

        //关流
        fis.close();
        fos.close();
    }
}

BufferedOutputStream/BufferedInputStream

BufferedOutputStream/BufferedInputStream : 高效字节输出/字节输入流
    //缓冲区(Buffered)  -> BufferedOutputStream : void flush();  自动刷新,关流也可以刷新
    
//包装流 : 自己不具备读写能力,真正读写的还是基本流; 高效率只不过是对老流的操作进行了优化
BufferedOutputStream 的构造方法 :
    BufferedOutputStream(OutputStream out) 
        
BufferedOutputStream 的写出数据方法 : write

1. 一次写一个字节 : void write(int b)

2. 一次写一个字节数组 : void write(byte[] bys)

3. 一次写一个字节数组的一部分 : void write(byte[] bys,int offset,int length)

BufferedInputStream 的构造方法 :
    BufferedInputStream(InputStream in) 

BufferedInputStream 的读数据方法 : read

1. 一次读一个字节 : int read();

2. 一次读一个字节数组 : int read(byte[] bys)

3. 一次读一个字节数组的一部分 : int read(byte[] bys,int offset,int length)

高效字节流一次一个字节复制文件:

import java.io.*;

public class 高效字节流一次一个字节复制文件 {
    public static void main(String[] args) throws IOException {
        //创建流对象
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("目标文件地址"));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("源文件地址"));

        //循环读写 : 一次一个字节
        int by; //存储每次读到的字节

        while((by = bis.read()) != -1){
            //读一个写一个
            bos.write(by);
        }


        //关流
        bos.close();
        bis.close();
    }
}

高效字节流一次一个字节数组复制文件:

import java.io.*;

public class 高效字节流一次一个字节数组复制文件 {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        //创建流对象
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(""目标文件地址""));
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("源文件地址"));

        //循环读写 : 一次一个字节数组
        byte[] bys = new byte[1024];
        int len;

        while ((len = bis.read(bys)) != -1){
            bos.write(bys,0,len);
        }


        //关流
        bos.close();
        bis.close();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值