黑马程序员--java基础:File类和文件字节IO流

本文详细介绍了Java中的File类,包括字段、构造方法、获取文件属性、创建与删除文件、重命名文件、列举文件以及应用案例。此外,还讲解了字节流的使用,如FileOutputStream的文件写入和FileInputStream的文件读取,以及如何进行文件复制。同时,文章提到了字节流与字符流之间的转换,帮助理解IO流在处理数据时的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、File类
1,字段和构造方法

public static void constructorDemo() {
        //可以封装已存在的,也可以封装不存在的文件或者目录
        File f1 = new File("f:\\a.txt");
        //用两个字符串初始化文件对象
        File f2 = new File("f:\\","a.txt");
        //用一个文件对象和一个字符串初始化文件对象
        File f = new File("f:\\");
        File f3 = new File(f,"a.txt");

        /*分割符可以用private static final String FILE_SEPARATOR = System.getProperty("file.separator")
        也可以用File.separator*/
        File f4 = new File("f:"+File.separator+"abc"+File.separator+"a.txt");
        System.out.println(f4);
    }

2.File类常见方法
2.1获取。
2.1.1 获取文件名称。String getName()
2.1.2 获取文件路径。
String getAbsolutePath()获取绝对路径字符串(唯一)
File getAbsoluteFile()获取绝对路径的文件(唯一)
String getPath()获取File对象中封装的路径
2.1.3 获取文件大小。
long getLength()
2.1.4 获取文件修改时间。
long time = file.getLastModified()获取file的最后修改时间
Date date = new Date(time);创建日期对象
String str_time = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(date);将日期装成字符串
2.1.5获取空余空间
long getFreeSpace()获取文件空余空间

2.2创建与删除。
boolean creatNewFile()文件存在不创建,不存在就创建。可能抛异常,并停掉程序
boolean mkdir()创建单级目录
boolean mkdirs()创建多级目录
boolean delete()删除文件不走回收站,不能删除有内容文件的文件夹

2.3判断。
boolean exists()判断是否存在,才能判断是文件还是文件夹
boolean isFile()是不是文件
boolean isDirectory()是不是文件夹
boolean isHidden()判断文件是否隐藏

3.重命名
boolean renameTo(File dest)重新命名此抽象路径名表示的文件。

    public static void renameToDemo() {

        File f1 = new File("c:\\9.mp3");
        File f2 = new File("d:\\aa.mp3");
        //将c盘f1中的9.mp3文件重命名为aa.mp3,并剪切到d盘
        boolean b = f1.renameTo(f2);
        System.out.println("b="+b);
    }

4.列举
4.1列举文件名称
String [] list()只列举文件中的文件夹名称或文件名(包括隐藏的)
注意:当文件夹不存在(封装的文件夹不存在,封装的是文件),返回的数组为空,应判断;如果文件夹存在但无内存,
结果是长度为0的字符串数组

File file = new File("c:\\");
        String [] names = file.list();
        //判断数组是否为空
        if (names != null) {
            for (String name : names) {
                System.out.println(name);
            }
        }

4.2列举文件对象
File [] listFiles()列出的文件对象,就可以获取名称,路径,大小等等

File file = new File("c:\\");
File [] ffs = file.listFiles();
        if(ffs != null) {
            for(File ff : ffs) {
                System.out.println(ff.getName()+"..."+ff.getFreeSpace());
            }
        }

4.3过滤器(文件名过滤器和文件过滤器)

public class Demo{
    public static void main(String [] args) {
    File file = new File("c:\\");
        //过滤出以".txt"结尾的文件名
        String [] names = file.list(new SuffixFilter(".txt"));
        //判断数组是否为空
        if (names != null) {
            for (String name : names) {
                System.out.println(name);
            }
        }
    }
}
//创建一个文件名过滤器
class SuffixFilter implements FilenameFilter {
    private String suffix;
    //构造函数
    public SuffixFilter (String suffix) {
        super();
        this.suffix = suffix;
    }
    public boolean accept(File dir, String name){
        return name.endsWith(suffix);
    }
}
//创建一个文件过滤器
class FilterByFile implements FileFilter {
    public boolean accept(File pathname) {
        //
        return pathname.isFile();
    }
}

4.4列出有效盘的根
static File[] listRoots()列出可用的文件系统根

5.应用
需求1:变量指定目录中的所有文件夹和文件名称(包含子目录)

import java.io.*;  

class FileDemo3 {  
    public static void main(String[] args)  
    {  
        File dir = new File("e:\\java练习");  
        showDir(dir);  
    }  

    public static String getLevel(int level)  
    {  
        StringBuilder sb = new StringBuilder();  
        sb.append("|--")  
        for(int x=0;x<level;x++)  
        {  
            sb.insert(0,"  ")  
         }  
         return sb.toString();  
    }  

    public static void showDir(File dir,int level)  
    {  
        System.out.println(getLevel(level)+dir.getName());  
        level++;  
        File[] files = dir listFiles();  
        for(int x=0;x<files.length;x++)  
        {  
            if(files[x].isDirectory())  
                showDir[Files[x,level]]  
            else  
                System.out.println(getLevel(level)files[x])  
        }  
    }  
}  

需求2:删除指定目录中的所有文件和文件夹

import java.io.*;  

class RemoveDir {  
    public static void main(String[] args)  
    {  
        File dir = new File("E:\\TEST")  
        removerDir(dir);  
    }  

    public static void removeDir(File dir)  
    {  
        File[] files = dir.listFiles();  
        for(int x=0;x<files.length;x++)  
        {  
            if(files[x].isDirectory())  
                removeDir(files[x]);  
            eles  
                //files[x].delete();  
                System.out.println(files[x].toString()+"::"+files[x].delete());  
        }  
        System.out.println(dir+":dir:"+dir.delete());  
    }  
}  

二、IO流
IO:用于处理设备上数据的技术,设备包括:内存,硬盘光盘等等;
流:系统资源,windows系统本身就可以操作设备,各种语言只是使用系统平台上的这个资源,并对外提供了各种语言自己的操作功能,这些功能最终调用的是系统资源。使用完资源一定要释放资源。
流的分类:按操作数据分为字节流和字符流;按流向分为输入流(读)和输出流(写)
1.字节输入输出流
1.1将数据写入文件中使用FileOutputStream
思路:
1)创建输出流对象,并明确数据存储的目的地,如果目的地不存在,就创建;如果存在就覆盖
2)调用输出流的写功能,
3)关闭资源

public class IOExceptionDemo {

    public static void main(String[] args) {

        File file = new File("templefile");
        if(!file.exists()) {
            file.mkdir();
        }
        //使得fos变量在下面try,catch,finally块中都有效
        FileOutputStream  fos = null;
        try {
            //创建输出流
            fos = new FileOutputStream("templefile\\fos.txt");
            fos.write("abcde".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //如果创建输出流对象失败,又调用close()就会出现空指针异常
                if(fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                //资源关闭失败转换后抛出运行异常
                throw new RuntimeException("程序已失败"+e);
            }
        }
    }

}

补充:
1)如果想要在前一个文件中续写字符串需要修改输出流对象初始化
fos = new FileOutputStream(“templefile\fos.txt”,true);
2)如果要换行续写,需要修改输出流对象初始化,和写出语句
private static final String LINE_SEPARAOR = System.getProperty(“line.separator”);

fos = new FileOutputStream(“templefile\fos.txt”,true);
String str = LINE_SEPARATOR+”hello”;
fos.write(str.getBytes());

1.2 将已有文件的数据读取出来
思路:
1)创建文件输入流对象,并关联数据资源
2)调用read(byte [])方法循环读取数据
3)关闭资源

public static void main(String[] args) {
        File file = new File("templefile");
        if(!file.exists()) {
            throw new RuntimeException("要读的文件不存在");
        }
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            //创建字节数组,
            byte [] buf = new byte [1024];
            int len = 0;
            //将读取的字节存入字节数组中,返回存入的字节总数,循环读取
            while((len = fis.read(buf)) != -1) {
                //将字节数组转成字符串打印
                System.out.println(len+"..."+new String(buf,0,len));
            }
        } catch (Exception e) {
            //将异常写入到日志文件中,进行记录
        }finally {
            try {
                if(fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                //一般抛出运行异常,或者写的日志文件中
                throw new RuntimeException("程序已停止"+e);
            }
        }
    }

1.3复制文件
思路:
1)创建输入流对象,并和源数据关联
2)创建输出流对象,并通过输出流创建一个目的
3)调用read(byte [])方法存储到字节数组中,然后调用write()方法写出,循环读写
4)关闭资源

public static void main(String[] args) {

        File file = new File("templefile");
        if(!file.exists()) {
            throw new RuntimeException("要读的文件不存在");
        }
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(file);
            fos = new FileOutputStream("f:\\abc");
            //定义一个字节缓冲区
            byte [] buf = new byte [1024];
            int len = 0;
            //循环读写
            while((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
        } catch (IOException e) {
            // 将异常写入日志中
        } finally {
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    throw new RuntimeException("程序已停止"+e);
                }
            }
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    throw new RuntimeException("程序已停止"+e);
                }
            }
        }
    }

2字节流与字符流的桥梁
2.1字节流到字符流
需求1:字节流转换成字符流,读中文非常方法便
思路:
1).创建字节输入流,明确关联的源数据
2)利用字节流创建字符流,
3)一个字符一个字符地读取
4)关闭字符流

public static void main(String[] args) {

        File file = new File("templefile\\fos.txt");
        if(!file.exists()) {
            throw new RuntimeException("要读的文件不存在");
        }
        FileInputStream fis = null;
        InputStreamReader isr = null;
        try {
            fis = new FileInputStream(file);
            isr = new InputStreamReader(fis);
            int len = 0;
            //循环地一个字符一个字符地读取
            while((len = isr.read()) != -1) {
                System.out.println((char)len);
            }
        } catch (IOException e) {
            //异常写入日志
        }finally{
            if(isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                    throw new RuntimeException("程序已停止"+e);
                }
            }
        }
    }

需求2:字符流向字节流转换
思路:
1)创建字节输出流 ,明确目的地
2)使用字节流创建字符流
3)调用字符流的方法输出,用flush()刷新,可以继续使用流;用close()刷新后,关闭流

public static void main(String[] args) {

        File file = new File("templefile\\fos.txt");
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                throw new RuntimeException("路径有误"+e);
            }
        }
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            fos = new FileOutputStream(file,true);
            osw =new OutputStreamWriter(fos);
            //直接写中文字符串,查表并把数据存储到缓冲区中,所有要刷新
            osw.write("你好啊!");
            osw.flush();
            osw.write("我hen好!");
            osw.flush();
        } catch (IOException e) {
            // 异常写入日志
        } finally {
            if(osw != null) {
                try {
                    osw.close();
                } catch (IOException e) {
                    throw new RuntimeException("程序已停止"+e);
                }
            }
        }

    }

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值