IO流

在这里插入图片描述
对文件读写应该哪种流合适?

文件是一个普通的文本文件,字符缓冲流(BufferedReader和BufferedWriter)

文件是一个图片,视频,压缩文件等,非文本文件,用字节流(FileInputStream 和 FileOutputStream)

存或取对象,用对象流 (ObjectInputStream和 ObjectOutputStream)

File类

概念:表示操作系统磁盘上的文件或者是文件夹
常用方法:
createNewFile() 创建一个新文件。
mkdir() 创建一个新目录。如果父目录不存在,则无法创建
mkdirs() 创建一个新目录。如果父目录不存在,则一起创建
delete() 删除文件或空目录。
exists() 判断File对象所对象所代表的对象是否存在。
length() 获取文件(夹)的大小(字节)
getAbsolutePath() 获取文件的绝对路径。 返回String
getAbsoluteFile() 获取文件(夹)的绝对路径:(返回File)
*getName() *获取当前file对象的文件名或者是文件夹名
getParent() 获取当前file对象的父目录(返回String)
isDirectory() 是否是目录。
isFile() 是否是文件。
getPath() 获取文件(夹)的相对路径:(返回String)
listFiles() 列出目录中的所有内容。
list() 列出目录中的所有内容。
lastModified() 获取文件的最后修改时间(毫秒数)
endWith() 以什么结尾

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //创建文件
        File file = new File("a.txt");
        System.out.println(file.createNewFile());
        //创建文件目录
        File file1 = new File("a");
        System.out.println(file1.mkdir());
        //创建一个新目录,如果父目录不存在一起创建
        File file2 = new File("c/d");
        System.out.println(file2.mkdirs());

        //删除文件或空文件夹
        File file3 = new File("c/c.txt");
        System.out.println(file3.delete());

        //判断file所代表的对象是否存在
        System.out.println(file2.exists());

        //获取文件大小(返回字节数)
        File file4 = new File("b/b.txt");
        System.out.println(file4.length());
        //获取绝对路径
        System.out.println(file4.getAbsolutePath());

        //获取绝对路径,返回file对象
        System.out.println(file4.getAbsoluteFile());

        //返回文件名
        System.out.println(file4.getName());

        //获取父目录
        System.out.println(file4.getParent());
        //判断是否为目录
        System.out.println(file4.isDirectory());

        //判断是否为文件
        System.out.println(file4.isFile());

        //获取相对路径
        System.out.println(file4.getPath());

        //列出目录中的所有内容
        File file5 = new File("b");
        File[] files = file5.listFiles();
        for (File f:files){
            System.out.println(f);
        }

        //获取最后一次文件修改时间
        long l = file4.lastModified();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:dd:ss");
        System.out.println(sdf.format(l));


    }
}

查找以***结尾的文件

public class Demo3 {
    public static void main(String[] args) {
        File file = new File("D:\\qf\\code\\java");
//        getFileName(file);
//        getFileName1(file);
        getFileName2(file);
    }
    //listFiles()
    //递归查找文件
    public static void getFileName(File file){
//        File file = new File("D:\\qf\\code\\java");
        File[] files = file.listFiles();
        for (File f:files){
            if (f.isFile()){
                if (f.getName().endsWith("java")){
                    System.out.println(f.getName());
                }
            }else {
                getFileName(f);
            }
        }
    }
    //list()
    public static void getFileName1(File file){
//        File file = new File("D:\\qf\\code\\java");
        String[] list = file.list();
        for (String s:list){
            if (s.endsWith("java")){
                System.out.println(s);
            }
        }
    }
    //匿名内部类重写accept()方法
    //返回以***结尾的文件
    public static void getFileName2(File file){
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith("java");
            }
        });
        for (File f:files){
            System.out.println(f.getName());
        }
    }
}

删除文件夹

public class Test1 {
    public static void main(String[] args) {
        File file = new File("D:\\qf\\a");
        deleteFile(file);

    }
    //删除文件夹
    public static void deleteFile(File file){
        //判断文件夹是否为空
        if (file!=null){
            //获取文件数组
            File[] files = file.listFiles();
            //如果文件数组长度为0,则说明file是个空文件夹,直接删除
            if (files.length==0){
                file.delete();
            }else {
                //文件数组长度不为0,则遍历
                for (File f:files){
                    //判断遍历的文件是否为文件,是文件直接删除,不是文件则递归文件夹,进行删除
                    if (f.isFile()){
                        f.delete();
                    }else {
                        deleteFile(f);
                    }
                }
                //全部遍历删除,然后再删除最外层的文件夹
                file.delete();
            }


        }
    }
}

IO流

流的分类:
按方向:
输入流:将<存储设备>中的内容读入到<内存>中
输出流:将<内存>中的内容写入到<存储设备>中。
按单位:
字节流:以字节为单位,可以读写所有数据 。 读写任意格式的文件
字符流:以字符为单位,只能读写文本数据 。 读写文本类型的文件
按功能
节点流:具有实际传输数据的读写功能。
过滤流:在节点流的基础之上增强功能

文件字节流

public class Demo5 {
    public static void main(String[] args) {
//        File file = new File("a.txt");
        FileOutputStream fileOutputStream =null;
        FileInputStream fileInputStream=null;
        try {
            fileInputStream = new FileInputStream(new File("a.txt"));
            fileOutputStream = new FileOutputStream(new File("b.txt"));
            //写一个字符
//            fileOutputStream.write(97);

            //写入一个字节数组
//            byte[] bytes="hahhahahahahha".getBytes();
//            fileOutputStream.write(bytes);
            //截取写入
//            byte[] bytes="hahhahahahahha".getBytes();
//            fileOutputStream.write(bytes,0,bytes.length);
            byte[] bytes=new byte[1024];
            int len=0;
            //读取
            while ((len=fileInputStream.read(bytes,0,len))!=-1){
            //写入
                fileOutputStream.write(bytes);
//                bytes=new byte[1024];

            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fileOutputStream!=null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream!=null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件输入输出流注意事项:

  • 1、在使用文件输出流的时候如果文件不存在会自动创建,但是要保证其父目录存在
  • 2、在使用文件输出流的时候,如果想要向文件中追加内容,那么需要将构造参数append设置为true
  • 3、在使用IO读写的时候,读写的操作应当写在try代码块中,关闭资源的代码写在finally代码块中 --推荐
  • 4、将IO流的创建写在try()中,这样IO流在使用完成之后无需关闭 —不推荐

字节缓冲流【重点】
缓冲流:BufferedOutputStream/BufferedInputStream
提高IO效率,减少访问磁盘的次数
数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close。

//文件复制
public class Demo1{
    public static void main(String[] args) throws IOException {
        long l = System.currentTimeMillis();
        FileInputStream fis = new FileInputStream("D:\\qfe\\qfe.zip");
        BufferedInputStream bis = new BufferedInputStream(fis);

        FileOutputStream fos = new FileOutputStream("D:\\qfe\\1.zip");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        byte[] bytes = new byte[1024];
        int len=0;
        //读取
        while ((len=bis.read(bytes))!=-1){
        //写入
            bos.write(bytes,0,len);
        }

        bos.close();
        fos.close();
        bis.close();
        fis.close();
        System.out.println(System.currentTimeMillis()-l);


    }
}

对象流【重点】
对象流:ObjectOutputStream/ObjectInputStream

  • 增加了缓冲区功能。
  • 增加了读写8种基本数据类型和字符串功能。
  • 增加了读写对象的功能:
    • readObject() 从流中读取一个对象。
    • writeObject(Object obj) 向流中写入一个对象

对象流读写基本类型+String类型

//============对象流读写基本类型+String类型============
		
//一、创建流对象
FileOutputStream fos = new FileOutputStream("e.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//二、通过对象流进行读写
oos.writeInt(97);         //Integer
oos.writeDouble(100.25);  //Double
oos.writeUTF("对象流");    //String
//三、关闭流资源
oos.close();
fos.close();

//一、创建流对象
FileInputStream fis = new FileInputStream("e.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//二、通过对象流进行读写  (读取的顺序和写入的顺序要一致)
System.out.println(ois.readInt());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
//三、关闭流资源
ois.close();
fis.close();

对象流写操作(序列化)

//============对象流写对象============

//写入对象
FileOutputStream fos = new FileOutputStream("f.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);  //对象输出流

User user = new User("cxk", 30);
oos.writeObject(user);

oos.close();
fos.close();

对象流写操作(反序列化)

//读取对象
FileInputStream fis = new FileInputStream("f.txt");
ObjectInputStream ois = new ObjectInputStream(fis);  //对象输入流

User user1 = (User) ois.readObject();
System.out.println(user1);

ois.close();
fis.close();

实体类(必须要实现序列化接口) 实现Serializable接口
class User implements Serializable{
String name;
int age;
//…
}
对象流细节
readObject() id
writeObject() id
序列化的细节:

  • 1、对象流读到流的末尾,会抛出异常EOFException
  • 2、如果属性不想被序列化,那么可以使用transient关键字修饰
  • 3、类实现了Serializable接口,会自动生成一序列化id(序列化和反序列的id要保证一致)

字符流【重点】
Reader:字符输入流
Writer:字符输出流

文件字符流【重点】

public class Demo4 {
    public static void main(String[] args) throws IOException {
        //字符流
        FileReader fr = new FileReader("a.txt");
        System.out.println(fr.read());
        char[] chars=new char[1024];
		
		//字符输出流
        fr.read(chars);
        System.out.println(Arrays.toString(chars));
        fr.close();

        //
        FileWriter fw = new FileWriter("a.txt");
        //字符输出流
        fw.write(99);
        fw.write("abcdef");
        fw.close();

    }
}

字符缓冲流【重点】
1文件是文本文件(.txt) 用字符缓冲流读写
2文件是多媒体(图片,视频,压缩包),用字节流(FileInputStream和FileOutputStream)

缓冲流:BufferedWriter/BufferedReader

public class Demo5 {
    public static void main(String[] args) throws IOException {
        //字符缓冲流
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
//        char[] chars=new char[1024];
        String s=null;
        //读一行,读取不到返回null
        while ((s=br.readLine())!=null){
            //写入一行
            bw.write(s);
            //新的一行
            bw.newLine();
        }

        bw.close();
        br.close();

    }
}

转换流

public class Demo6 {
    public static void main(String[] args) throws IOException {
        //字节流
        FileInputStream fis = new FileInputStream("c.txt");
        //字节转换字符流
        InputStreamReader isr = new InputStreamReader(fis,"GBK");
        //字符流
        BufferedReader bufferedReader = new BufferedReader(isr);

        String s = bufferedReader.readLine();
        System.out.println(s);
        bufferedReader.close();
        isr.close();
        fis.close();

        //
        FileOutputStream fos = new FileOutputStream("d.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bufferedWriter = new BufferedWriter(osw);
        bufferedWriter.write("哈哈哈哈哈哈哈");

        bufferedReader.close();
        osw.close();
        fos.close();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值