JAVA文件IO

这篇博客详细介绍了Java中的IO操作,包括文件的创建、删除、读写,目录的管理,文件过滤器,输入输出流,字符编码,字符流与字节流的转换,打印流与缓冲流,异常日志收集,Properties文件处理,以及对象的序列化和反序列化。通过实例展示了各种操作的方法和步骤。
摘要由CSDN通过智能技术生成

IO

常用文件操作File

package com.lyq.kaikeba.codeLearn.io;

import java.io.File;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D://test.txt");
        // 创建一个新的文件,如果存在返回false,不存在返回true
        boolean flag = file.createNewFile();
        // 创建新的文件夹,如果存在返回false,不存在返回true
        boolean dirFlag = file.mkdir();

        File file1 = new File("D://hah");

        // 构造方法1使用
        File a = new File(file1, "a.text");
        a.createNewFile();

        // 构造方法2使用
        File b = new File("D:hah", "b.text");
        b.createNewFile();

        // 删除
        a.delete();
        b.delete();

        // 获取文件路径
        a.getAbsolutePath();
        // 获取名称
        a.getName();

        a.isFile();

        a.isDirectory();

        a.exists();
        // 获取文件夹下所有文件对象
        a.listFiles();


        // 创建多层文件夹
        File f1 = new File("D://ha/ha/ha");
        f1.mkdirs();    // 创建多层文件夹只能用mkdirs而不能使用mkdir

        // 剪切至另一个文件下
        f1.renameTo(file1);

        /**
         * 分隔符
         */
        // 路径分隔符
        System.out.println(File.pathSeparator);
        // 名称分隔符
        System.out.println(File.separator);

    }
}

遍历文件

package com.lyq.kaikeba.codeLearn.io;

import java.io.File;

/**
 * 遍历文件
 */
public class Demo2 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        File[] files = file.listFiles();
        listFile(files);
    }

    private static void listFile(File[] files) {
        if(files != null && files.length > 0){
            for(File f : files){
                if(f.isFile()){
                    if(f.getName().endsWith(".avi")){
                        System.out.println(f.getAbsolutePath());
                    }
                }else {
                    listFile(f.listFiles());
                }
            }
        }
    }
}

文件过滤器

package com.lyq.kaikeba.codeLearn.io;

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

/**
 * 文件过滤器的使用
 */
public class Demo3 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        listFile(file);
    }

    private static void listFile(File file) {
        File[] files = file.listFiles(new FileFilter(){

            @Override
            public boolean accept(File pathname) {
                if(pathname.isDirectory() || pathname.getName().endsWith(".avi")){
                    return true;
                }
                return false;
            }
        });
        if(files != null && files.length > 0){
            for(File f : files){
                if(f.isFile()){
                    System.out.println(f.getName());
                }else {
                    listFile(f);
                }
            }
        }
    }
}

输入输出流

字节流(可能会出现乱码)

  • 输入流:InputStream
package com.lyq.kaikeba.codeLearn.io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 文件写出流
 */
public class Demo4 {
    public static void main(String[] args) throws IOException {
        // 是否追加
        FileOutputStream fos = new FileOutputStream("d:\\a.txt", true);

        fos.write(65);
        fos.write("afhd".getBytes(StandardCharsets.UTF_8));
        fos.write("dfdifd".getBytes(StandardCharsets.UTF_8), 1, 5);
        fos.close(); // 注意关闭
    }
}

  • 输出流:OutputStream
package com.lyq.kaikeba.codeLearn.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * FileInputStream
 */
public class Demo5 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("d:\\a.txt");

        // 每次读取一个字节
        while(true){
            byte b = (byte) fis.read();
            if(b==-1)
                break;
            System.out.println((char)b);
        }

        // 每次读取多个字节
        while(true){
            byte[] bytes = new byte[10];
            int len = fis.read(bytes);
            if(len == -1)
                break;
            String content = new String(bytes);
            System.out.println(content);
        }
        
        fis.close(); // 注意关闭
    }
}

字符编码

  • UTF-8 可变长度字符编码

字符流

  • 输入流:Reader
package com.lyq.kaikeba.codeLearn.io;

import java.io.FileWriter;
import java.io.IOException;

/**
 * Writer
 */
public class Demo6 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("d:\\a.txt", true);
        
        fw.write("fdjfid");
        
        fw.append("fdfd");
        
        fw.close();
        
    }
}

  • 输出流:Writer
package com.lyq.kaikeba.codeLearn.io;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Writer
 */
public class Demo6 {
    public static void main(String[] args) throws IOException {
        
        // 读字符
        FileReader fr = new FileReader("d:\\a.txt");
        
        // 每次读一个字符
        while(true){
            char c = (char) fr.read();
            if(c == -1)
                break;
            System.out.println(c);
        }
        
        // 每次读多个字符
        char[] chars = new char[100];
        int len = fr.read(chars);
        String s = new String(chars, 0, len);
        System.out.println(s);
        
        fr.close();

    }
}

对于字符输出流可用*flush()*方法刷新管道,将内存中的数据写入文件。

字节流转换

package com.lyq.kaikeba.codeLearn.io;

import java.io.*;

/**
 * 字节流转为字符流
 */
public class Demo7 {
    public static void main(String[] args) throws IOException {

        // 转换流
        // 字节流 '装饰' 为字符流    : 使用了装饰者模式

        // 1. 将读取的字节流转换为字符流
        FileInputStream fis = new FileInputStream("D:\\a.txt");
        /**
         * 输入字节流,转换为字符流
         * 参数1. 要转换的字符
         * 参数2. 编码方式
         */
        InputStreamReader isr = new InputStreamReader(fis, "GBK");

        while(true){
            int c =  isr.read();
            if(c == -1)
                break;
            System.out.println((char) c);
        }



        // 2.将要写入的字节以字符的方式写入
        FileOutputStream fos = new FileOutputStream("d:\\a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        osw.write("niaho ");
        osw.flush();
        osw.close();

    }
}

打印流和缓存流

package com.lyq.kaikeba.codeLearn.io;

import java.io.*;

/**
 * 打印流和缓冲流
 */
public class Demo8 {
    public static void main(String[] args) throws IOException {
        // 打印流
        // PrintStream
        PrintStream ps = new PrintStream("d:\\a.txt");
        ps.println("fdf");
        ps.close();


        PrintWriter pw = new PrintWriter("d:\\a.txt");
        pw.println("fdf");
        pw.close();


        FileOutputStream fos = new FileOutputStream("d:\\a.txt");
        PrintWriter pw1 = new PrintWriter(fos);
        pw1.write("fdfd");
        pw1.flush();
        pw1.close();


        // 缓冲流 将读到的字符流转换成一行一行输出
        FileReader fw = new FileReader("d:\\a.txt");
        BufferedReader br = new BufferedReader(fw);
        String text = br.readLine();
        System.out.println(text);

    }
}

收集错误日志到文件中

package com.lyq.kaikeba.codeLearn.io;

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 收集异常日志
 */
public class Demo9 {
    public static void main(String[] args) throws FileNotFoundException {
        try{
            String s = null;
            s.toString();
        }catch(Exception e){
            PrintWriter pw = new PrintWriter("  ");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            pw.println(sdf.format(new Date()));
            e.printStackTrace(pw);
            pw.close();
        }
    }
}

Properties文件与Properties类

package com.lyq.kaikeba.codeLearn.io;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

/**
 * Properties文件与Properties类
 */
public class Demo {
    public static void main(String[] args) throws IOException {

        // 存
        Properties ppt = new Properties();
        ppt.put("书名", "苹果乐园");
        ppt.put("hello", "world");
        FileWriter fw = new FileWriter("d://a.txt");
        ppt.store(fw, "test");
        fw.close();

        // 取
        Properties ppt1 = new Properties();
        FileReader fr = new FileReader("d://a.txt");
        ppt1.load(fr);
        System.out.println(ppt1.get("书名"));
        System.out.println(ppt1.getProperty("hello"));

    }
}

序列化和反序列化

  • 表示将对象存入文件和取出文件的操作
package com.lyq.kaikeba.codeLearn.io;

import java.io.*;

/**
 * 序列化和反序列化
 * 表示将对象存入文件和取出文件的操作
 */
public class Demo10 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://a.txt"));
        Book b1 = new Book("apple","appleInfo");
        oos.writeObject(b1);
        oos.close();

        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://a.txt"));
        Object o = ois.readObject();
        System.out.println(o);

    }
    static class Person implements Serializable{
        private String name;
    }
    // 序列化需要实现Serializable接口
    static class Book implements Serializable{
        private String name;
        private String info;
        private Person p;
        
        

        public Book() {
        }

        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", info='" + info + '\'' +
                    '}';
        }

        public Book(String name, String info) {
            this.name = name;
            this.info = info;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getInfo() {
            return info;
        }

        public void setInfo(String info) {
            this.info = info;
        }
    }

}

部分属性的序列化
  • 对属性加transient修饰后则对应属性不被反序列化

  • 对属性加static修饰后则则对应属性不被反序列化,但是可以对获取的对象进行set操作

  • 默认方法writeObjectreadObject

  • Extenalizable实现java序列化

try-with-resource

package com.lyq.kaikeba.codeLearn.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * try-with-resources
 */
public class Demo11 {
    public static void main(String[] args) throws FileNotFoundException {
        // 1.7
        try(FileReader f = new FileReader("d://a.txt")){
            int c = f.read();
            System.out.println(c);
        }catch(Exception e){
            e.printStackTrace();
        }

        // 1.9优化
        FileReader f = new FileReader("d://a.txt");
        try(f){
            int c = f.read();
            System.out.println(c);
        }catch(Exception e){
            e.printStackTrace();
        }
        
        
        // 注意:FileReader需要实现Closeable或AutoCloseable接口才会自动close()
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值