Day16 File、IO流1

1、File

1.1File的基本用法

概念:代表物理盘符中的一个文件或者文件夹。

常见方法:

方法名描述
createNewFile()创建一个新文件。
mkdir()创建一个新目录。
delete()删除文件或空目录。
exists()判断File对象所对象所代表的对象是否存在。
getAbsolutePath()获取文件的绝对路径。
getName()取得名字。
getParent()获取文件/目录所在的目录。
isDirectory()是否是目录。
isFile()是否是文件。
length()获得文件的长度。
listFiles()列出目录中的所有内容。
renameTo()修改文件名为。
package Day16_IO1;/*
 * @author  pyh
 * @date  2020/12/7 0007 上午 10:02
 * @version 1.0
 * @since JDK1.8_241
 */
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo01 {
    public static void main(String[] args) {
        //路径都是从盘符开始
        //File file = new File("E:\\File\\IO1.txt");
        //File file = new File("E:\\File", "IO1.txt");
        //File file = new File(new File("E:\\File"), "IO1.txt");

        //路径从项目开始
        File file = new File("E:\\File\\IO1.txt");
        System.out.println("文件是否可读:"+file.canRead());
        System.out.println("文件是否可写:"+file.canWrite());
        System.out.println("文件是否隐藏:"+file.isHidden());
        //相对于项目
        System.out.println("相对路径:"+file.getPath());
        //从盘符开始
        System.out.println("绝对路径:"+file.getAbsolutePath());
        System.out.println("文件名:"+file.getName());
        System.out.println("文件长度:"+file.length());
        //返回的是从1970年1月1日到文件最后修改时间的毫秒数
        System.out.println("最后修改时间1:"+file.lastModified());//1607329936234
        System.out.println("最后修改时间2:"+getTime(file.lastModified()));//2020-12-7 16:32:16
        System.out.println("文件是否可执行:"+file.canExecute());
        System.out.println("文件或目录是否存在:"+file.exists());
        System.out.println("是否为文件:"+file.isFile());
        System.out.println("是否为目录:"+file.isDirectory());
    }
    public static String getTime(long time){
/*        //方法一:
        Date date = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = sdf.format(date);*/

        //方法二:
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = sdf.format(time);
        return str;

    }
}
1.2 @Test(单元测试)的用法
package Day16_IO1;/*
 * @author  pyh
 * @since JDK1.8_241
 *           @Test:单元测试
 *              1.需要加上注解@Test
 *              2.访问修饰符不能是private
 *              3.不能是静态的
 *              4.包下不能存在Test类
 */
import org.junit.Test;
import java.io.File;
import java.io.IOException;
public class Demo02 {
    //1.在目录结构存在的情况下创建文件
    @Test
    public void test1() throws IOException {
        File file = new File("E:\\File\\IO1.txt");
        //判断文件是否存在,不存在则创建
        if (!file.exists()){
            //创建文件
            file.createNewFile();
        }
    }
    //2.在父目录结构不存在的情况下创建文件
    @Test
    public void test2() throws IOException {
        File file = new File("E:\\File\\IO\\IO1.txt");
        //获取文件的目录的抽象路径
        //parentFile    --  E:\File\IO
        File parentFile = file.getParentFile();
        //判断是否存在
        if (!parentFile.exists()){
            //创建指定的目录
            parentFile.mkdir();
            //判断文件是否存在
            if (!file.exists()){
                //创建文件
                file.createNewFile();
            }
        }
    }
    //3.多层父目录结构不存在的情况下创建文件
    @Test
    public void test3() throws IOException {
        File file = new File("E:\\File\\IO\\File\\IO\\IO1.txt");
        //获取文件的目录的抽象路径
        //parentFile    --  E:\File\IO\File\IO
        File parentFile = file.getParentFile();
        //判断是否存在
        if (!parentFile.exists()){
            //创建多层父目录
            parentFile.mkdirs();
            //判断文件是否存在
            if (!file.exists()){
                //创建文件
                file.createNewFile();
            }
        }
    }
    //4.删除文件
    @Test
    public void test4(){
        File file = new File("E:\\File\\IO1.txt");
        file.delete();
    }
    //5.删除目录    --  只能删除空目录
    @Test
    public void test5(){
        File file = new File("E:\\File\\IO");
        file.delete();
    }
}
1.3File的应用
package Day16_IO1;
import org.junit.Test;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class Demo03 {
    //1、输出目录下的所有的文件名(不包含子目录)  --listFilea()
    @Test
    public void test1() throws IOException {
        File file = new File("E:\\File");
        //获取指定目下的所有文件和目录的File对象
        File[] files = file.listFiles();
        for (File f:files) {
            //判断是否为文件
            if (f.isFile()){
                System.out.println(f.getName());
            }
        }
    }

    //2、输出目录下的所有的文件名(包含所有子目录)
    /* public static void main(String[] args) {
        File file = new File("E:\\File");
        test02(file);
    }*/
    
    public static void test2(File file){
        //获取目录下所有的目录和文件的File对象
        File[] files = file.listFiles();
        for (File f:files){
            //判断是文件还是目录
            if (f.isFile()){
                System.out.println(f.getAbsolutePath());
            }else{
                //获取目录里的所有文件和子目录的File对象
                test2(f);
            }
        }
    }
    //3.输出目录下所有的txt文件(包含子目录)
    public static void main(String[] args) {
        File file = new File("E:\\File");
        test3(file);
        System.out.println("--------");
        test4(file);
    }

    public static void test3(File file){
        File[] files = file.listFiles();
        for (File f:files) {
            //判断是文件还是目录
            if (f.isFile()){
                //再判断是否为txt文件
                if (f.getName().endsWith(".txt")){
                    System.out.println(f.getAbsolutePath());
                }
            }else{
                test3(f);
            }
        }
    }
    private static void test4(File file) {
        //数组中包含txt文件和目录
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                //过滤非txt文件的内容
                if (pathname.isFile()){
                    //是否为txt文件
                    if (!pathname.getName().endsWith(".txt")){
                        return false;
                    }
                }
                return true;
            }
        });
        for (File f:files) {
            //判断是文件还是目录
            if (f.isFile()){
                System.out.println(f.getAbsolutePath());
            }else {
                test3(f);
            }
        }
    }
}

2、IO流

IO流:

  • 1、根据数据的传输方向:输入流/输出流
  • 2、根据读写单位:字节流,字符流
  • 3、根据功能划分:基础流,包装类

下面的例子中会用到工具类IOUtils,所以我就不再下面一一去写了。

作用是关闭资源。

package Day16_IO1.utils;
//关闭输入输出流
import java.io.Closeable;
import java.io.IOException;

public class IOUtils {
    public static void closeAll(Closeable...closeables) {
        for (Closeable c:closeables) {
            if (c != null){
                try {
                    c.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
2.1 字节输入流
package Day16_IO1.stream;/*
 * @author  pyh
 * @date  2020/12/7 0007 下午 3:08
 * @version 1.0
 * @since JDK1.8_241
        IO流:
            1、根据数据的传输方向:输入流/输出流
            2、根据读写单位:字节流,字符流
            3、根据功能划分:基础流,包装类

            FileInputStream --  文件字节输入流,基类为InputStream
 */
import Day16_IO1.utils.IOUtils;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo01 {
    //读取单个字节
    @Test
    public void test1(){
        //文件字节输入流
        FileInputStream fis = null;
        try {
            fis =new FileInputStream("E:\\File\\IO1.txt");
            //读取单个字节
            int read = fis.read();
            System.out.println((char) read);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源(关闭字节流)
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //读取单个字节    --  循环读取完毕
    @Test
    public void test02(){
        //文件字节输入流
        FileInputStream fis = null;
        try {
            //fis = new FileInputStream(new File("IO1.txt"));
            fis = new FileInputStream("E:\\File\\IO1.txt");
            //读取到的数据字节
            int read;
            while((read = fis.read())!= -1){
                System.out.println((char)read);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //字节输出流 --  直接写String类型的数据
    @Test
    public void test3(){
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("E:\\File\\IO1.txt");
            //1024代表数组的长度,也代表一次读取1024个数据字节到数组中
            byte[] b = new byte[1024];
            //读取到数组中的数据长度
            int len;
            while ((len = fis.read(b)) != -1){
                //第一个参数为存放数据的数组(缓冲区)
                //第二个参数是偏移量
                //第三个参数是存放在数组中数据的长度
                System.out.println(new String(b,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(fis);
        }
    }
}
2.2 字节输出流
package Day16_IO1.stream;/*
 *      OutputStream        --  字节输出流的基类
 *      FileOutputStream    --  文件字节输出流
 */
import org.junit.Test;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo02 {
    //写入单个字节
    @Test
    public void test01(){
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("IO1.txt");
            fos.write(97);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //写入多个字节
    @Test
    public void test02(){
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("IO1.txt");
            //"wasd".getBytes()     -- 能把"wasd"转换成byte类型数组
            fos.write("wasd".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //末尾添加
    @Test
    public void test03(){
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("IO1.txt",true);
            //"wasd".getBytes()     -- 能把"wasd"转换成byte类型数组
            fos.write("wasd".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
2.3 字节流的拷贝
package Day16_IO1.stream;
//字节流的拷贝
import Day16_IO1.utils.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo03 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //路径指向目标源
            fis = new FileInputStream("E:\\File\\IO2.txt");
            //路径指向目的源
            fos = new FileOutputStream("E:\\File\\IO3.txt");
            byte[] b =new byte[1024];
            int len;
            while ((len = fis.read(b)) != -1){
                fos.write(b,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(fis,fos);
        }
    }
}

常见字符编码:

编码说明
ISO-8859-1收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
UTF-8针对Unicode的可变长度字符编码。
GB2312简体中文。
GBK简体中文、扩充。
BIG5台湾,繁体中文。

注:当编码方式和解码方式不一致时,会出现乱码。

2.4 字符流

FileWriter:

  • public void write(String str) 。
  • 一次写多个字符,将b数组中所有字符,写入输出流。

FileReader:

  • public int read(char[] c) 。
  • 从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
package Day16_IO1.charTest;/*
 * @author  pyh
 * @date  2020/12/7 0007 下午 4:50
 * @version 1.0
 * @since JDK1.8_241
        字符流的写法跟字节流类似

        输出流会自动创建一个.txt文件,根据你所写的命名
 */
import Day16_IO1.utils.IOUtils;
import org.junit.Test;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo01 {
    //读取单个字符
    @Test
    public void test1(){
        FileReader fr = null;
        try {
            fr = new FileReader("E:\\File\\IO4.txt");
            int read = fr.read();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            IOUtils.closeAll(fr);
        }
    }
    //读取多个字符
    @Test
    public void test2(){
        FileReader fr = null;
        try {
            fr = new FileReader("E:\\File\\IO4.txt");
            char[] c = new char[1024];
            int len;
            while ((len = fr.read(c)) != -1){
                System.out.println(new String(c,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(fr);
        }
    }
    //字符输出流 --  直接写String类型的数据
    @Test
    public void test3(){
        FileWriter fw = null;
        try {
            fw = new FileWriter("E:\\File\\IO4.txt");
            fw.write("good good study");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(fw);
        }
    }
    //字符流的拷贝
    @Test
    public void test4(){
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("E:\\File\\IO5.txt");
            fw = new FileWriter("E:\\File\\IO6.txt");
            int len;
            char[] c = new char[1024];
            while ((len = fr.read(c)) != -1){
                fw.write(c,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(fr,fw);
        }
    }
}

作业:

package Day16_IO1.charTest;
//删除文件夹,文件夹里有东西
import java.io.File;

public class Demo03 {
    public static void main(String[] args) {
        File file = new File("E:\\File\\File1");
        test1(file);
    }

    private static void test1(File file){
        //获取地址
        File[] files = file.listFiles();
        for (File f:files) {
            //判断是否为文件
            if (f.isFile()){
                f.delete();//删除文件
            }else {
                test1(f);//如果有没删完的就继续循环 -- 递归
            }
        }
        file.delete();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值