IO_SXL


引言

做个俗人,贪财好色,一身正气。


一、File

1.1 File的基本使用

		// 系统默认;符号
        System.out.println(File.pathSeparator);
        // 系统默认\符号
        System.out.println(File.separator);

		// 替换系统默认符号
        String filePath = "E://dir";
        filePath = filePath.replace("//", File.separator);
        // 正常文件夹路径
        File dir = new File(filePath);
        // 创建文件夹 mkdirs能把中间缺失文件夹补全 mkdir缺少会报错
        dir.mkdirs();
        // 创建实例 dir上级文件夹
        File a = new File(dir,"a.txt");
        // 在test文件夹中创建test.txt文件
        a.createNewFile();

        // 创建实例 dir上级文件夹路径
        File b = new File(filePath,"b.txt");
        b.createNewFile();

        // 删除文件
        a.delete();
        b.delete();
        dir.delete();

1.2 File遍历

文件垃圾回收在相应地方添加delete删除,后缀慎重选择。

	public static void main(String[] args) throws IOException {

        File file = new File("D://SOFT");
        File[] files = file.listFiles();
        // 递归遍历
        listFiles(files);
    }

    private static void listFiles(File[] files) {
        if (files != null && files.length > 0) {
            // 循环
            for (File file : files) {
                // isFile 非文件夹文本
                if (file.isFile()) {
                    // 文件
                    if (file.getName().endsWith(".exe")) {
                        // 内存
                        if (file.length() > 1 * 1024 * 1024) {
                            System.out.println("test");
                        } else {
                            // 找到一个.exe文件
                            System.out.println("找到了一个.exe文件:" + file.getAbsolutePath());
                        }

                    }

                } else {
                    // 文件夹
                    File[] fileArr = file.listFiles();
                    // 递归
                    listFiles(fileArr);
                }
            }
        }

    }

1.3 File文件过滤器

	public static void main(String[] args) throws IOException {
        File file = new File("D://SOFT");
        listFiles(file);
    }

    private static void listFiles(File file) {
    	// 实现文件过滤接口的匿名内部类
        File[] files = file.listFiles(pathname -> {
            if (pathname.getName().endsWith(".exe") || pathname.isDirectory()) {
                return true;
            }
            return false;
        });

        for (File f : files) {
            if (f.isDirectory()) {
                listFiles(f);
            } else {
                System.out.println("找到了一个.exe文件:" + file.getAbsolutePath());
            }
        }
    }

二、流

IO流的分类:

  • 按照流的方向来分,分为输入流和输出流
  • 按照流的数据类型来分,分为字节流和字符流

字节流

  • 输入流:InputStream
  • 输出流:OutputStream

字符流

  • 输入流:Reader
  • 输出流:Writer

一切皆字节
计算机中任何数据(文本、图片、视频、音乐等等)都是以二进制形式存储的。
数据传输时(任何流),底层都是以二进制形式进行存储。

2.1 FileOutputStream

		// FileOutputStream
        // 第二个参数追加
        FileOutputStream fos = new FileOutputStream("E://a.txt", true);
        // byte[] bytes = {65, 66, 67, 68};
        byte[] bytes = "你好吗".getBytes();
        // 第二个参数是从第几个下标开始 第三个参数是长度
        fos.write(bytes, 1,2);
        // fos.write(65);
        fos.close();

2.2 FileInputStream

		// FileInputStream
        // 字节数组长度不够时可能存在读取一半字节产生乱码问题 可以用字符流或者转换流解决
        FileInputStream fis = new FileInputStream("E://a.txt");
        while(true) {
            byte[] bytes = new byte[1024];
            int len = fis.read(bytes);
            if (len == -1) {
                break;
            }
            System.out.println(new String(bytes, 0 , len));
        }
        fis.close();

2.3 FileWriter

		// FileWriter字符输出流 第二个参数追加模式可以不写,默认false
        FileWriter fw = new FileWriter("E://a.txt");
        // fw.write("121");
        fw.append("锄禾日当午\n\r").append("汗滴禾下土\n\r").append("谁知盘中餐\n\r")
                .append("粒粒皆辛苦");
        // 最好每输出一段文字刷新一下,close方法里有刷新操作
        // flush操作强制把缓存空间的字符输出到文本中去
        fw.flush();
        fw.close();

2.4 FileReader

		// FileReader 字符输入流
        FileReader fr = new FileReader("E://a.txt");
//        while (true) {
//            int len = fr.read();
//            if (len == -1) {
//                break;
//            }
//            System.out.print((char) len);
//        }

        // 与字节输入流类似
        char[] chars = new char[100];
        int len = fr.read(chars);
        System.out.println(new String(chars, 0, len));
        fr.close();

2.5 字节流转字符流

重点 转换流 将字节流转化为字符流。
字节流 ‘装饰’ 为字符流:使用了装饰者设计模式。

        FileInputStream fis = new FileInputStream("E://a.txt");
        // 将字节流输入转换为字符输入流
        // 参数1:要转化的字节流 参数2:指定编码名称
        InputStreamReader isr = new InputStreamReader(fis, "utf-8");
        while (true) {
            int len = isr.read();
            if (len == -1) {
                break;
            }
            System.out.print((char) len);
        }
        fis.close();
        isr.close();

		FileOutputStream fos = new FileOutputStream("E://a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
        osw.append("锄禾日当午\n\r").append("汗滴禾下土\n\r").append("谁知盘中餐\n\r")
                .append("粒粒皆辛苦1");
        osw.flush();
        fos.close();
        osw.close();

2.6 Print和BufferedReader

		// 字符打印流
        /*PrintStream ps = new PrintStream("E://c.txt");
        ps.println("good job;好工作");
        ps.println("good job;好工作");
        ps.println("good job;好工作");
        ps.close();*/

        // 与字节流区别,此方法是需要关流的
        /*PrintWriter pw = new PrintWriter("E://c.txt");
        pw.println("good job;好工作1");
        pw.println("good job;好工作2");
        pw.println("good job;好工作3");
        pw.flush();
        pw.close();*/

        // 转换打印流
        /*FileOutputStream fos = new FileOutputStream("E://d.txt");
        PrintWriter pw = new PrintWriter(fos);
        pw.println("good job;好工作1");
        pw.flush();
        fos.close();
        pw.close();*/

        // 缓存读取流,将字符流转换为带有缓存 可以一次读取一行的缓存字符读取流
        FileReader fw = new FileReader("E://a.txt");
        BufferedReader br = new BufferedReader(fw);
        while (true) {
            String text = br.readLine();
            if (text == null) {
                break;
            }
            System.out.print(text);
        }

        fw.close();
        br.close();

三、IO拓展

3.1 Properties

		// .properties文件 与 Properties();
        Properties ppt = new Properties();
        ppt.put("name", "admin");
        ppt.put("pwd", "admin");
        // 文件规范以properties结尾
        FileWriter fw = new FileWriter("e://dev.properties");
        // 参数2是文件中的注释 #开头
        ppt.store(fw, "用户密码");
        fw.close();

        // 读取配置
        Properties properties = new Properties();
        FileReader fr = new FileReader("e://dev.properties");
        properties.load(fr);
        System.out.println("name=" + ppt.getProperty("name"));
        System.out.println("pwd=" + ppt.getProperty("pwd"));

3.2 序列化技术

部分属性的序列化:

  • 使用transient修饰符。
  • 使用static修饰符。
  • 若类有默认writeObject和readObject方法,优先调用。
  • 类实现Externalizable接口,重写writeExternal和readExternal方法(与第三个相似)。
public class demo{

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 序列化
        User user = new User("admin", "admin");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E://userDev.properties"));
        // 实现序列化的类不进行实行序列化接口会报错
        // 包括对象中的属性均要实现序列化接口
        oos.writeObject(user);
        oos.close();

        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E://userDev.properties"));
        User u = (User) ois.readObject();
        System.out.println(u);
    }



}

class User implements Serializable {

    private String name;

    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

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

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

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

3.3 序列化工具类

package com.sxl.util;

import java.io.*;

/**
 * 序列化工具类
 */
public class MySerializeUtil {

    /**
     * 序列化对象到指定文件
     * @param obj
     * @param fileName
     * @throws IOException
     */
    public static void toSerialize(Object obj, String fileName) throws IOException {

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
        oos.writeObject(obj);
        oos.close();

    }

    /**
     * 从指定文件中反序列化对象
     * @param fileName
     * @throws IOException
     */
    public static Object deSerialize(String fileName) throws IOException, ClassNotFoundException {
        
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
        Object o = ois.readObject();
        ois.close();
        return o;
        
    }

}


总结

人生无限,缓缓起航,修正改错,在满足完成任务的条件下,追求完善,全身而退。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值