Javaday22 杂七杂八流

本文深入讲解Java中的IO流概念及应用,包括数据输入输出流、内存操作流、打印流、键盘录入、随机访问流、序列化与反序列化流以及properties的使用。详细介绍了各种流的特性、操作方法及实例,帮助读者全面掌握Java IO流的运用。

Javaday22 杂七杂八流

一 数据输入输出流的概述和使用

数据输入流 :DateInputStream

数据输出流:DateOutputStream

特点: 可以写基本数据类型,可以读取基本数据类型

public static void main(String[] args) throws IOException {
        //数据输入输出流的特点,就是能够读写基本数据类型
       // DataInputStream
       // DataOutputStream
        //writeData();
        //怎么写的就怎么读,顺序不要乱
        DataInputStream in = new DataInputStream(new FileInputStream("a.txt"));
        boolean b = in.readBoolean();
        double v = in.readDouble();
        int i = in.readInt();
        String s = in.readUTF();
        System.out.println(b);
        System.out.println(v);
        System.out.println(i);
        System.out.println(s);

        in.close();


    }

    private static void writeData() throws IOException {
        DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
        out.writeBoolean(true);
        out.writeDouble(3.14);
        out.writeInt(100);
        out.writeUTF("你好世界");
        out.close();
    }
}
二 内存操作流的概述和使用

1.内存操作流的概述

a 操作字节数组
ByteArrayOutputStream
ByteArrayInputStream
此流关闭无效,所以无需关闭
b 操作字符数组
CharArrayWrite
CharArrayReader
c 操作字符串
StringWriter
StringReader

public class 内存操作流 {
    public static void main(String[] args) throws IOException {
        
        byte[] allBytes = out.toByteArray();
        String s = new String(allBytes);
        System.out.println(s);

      
        ByteArrayInputStream in= new ByteArrayInputStream(allBytes);
        byte[] bytes=new byte[1024*8];
        int len = in.read(bytes);
        String s1 = new String(bytes, 0, len);
        System.out.println(s1);

    }
}
public static void main(String[] args) throws IOException {
        // CharArrayWrite
        //CharArrayReader
        CharArrayWriter writer = new CharArrayWriter();
        writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        //取出缓冲区中的数据
        char[] chars = writer.toCharArray();
        System.out.println(String.valueOf(chars));
        System.out.println(new String(chars));

        System.out.println(writer.toString());

三 打印流的概述和特点以及作为Weiter的子类使用

1.打印流的特点
打印流只能操作目的地,不能操作数据源(不能进行读取数据)

​ 可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型

​ 如果我们启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新

​ 通过以下构造创建对象 能够启动自动刷新 然后调用println、printf 或 format 方法中的一个方法的时候,会完 成自动刷新

​ public PrintWriter(OutputStream out, boolean autoFlush) 启动 自动刷新

​ public PrintWriter(Writer out, boolean autoFlush) 启动自动刷新
​ 这个流可以直接对文件进行操作(可以直接操作文件的流: 就是构造方法的参数可以传递文件或者文件路径)

public class 字节打印流 {
    public static void main(String[] args) throws IOException {
        //打印流:只操作目的地,不关联源文件
      //  PrintStream 字节打印流
        PrintStream printStream = new PrintStream(new FileOutputStream("b.txt"));
        printStream.write("字节打印流".getBytes());
        printStream.print(true);
        printStream.println(100);

        printStream.close();

        PrintStream out = System.out;
        out.write("abc".getBytes());
        out.println(3.14);
        System.out.println("abc");

    }
}
public class 字符打印流 {
    public static void main(String[] args) throws IOException {
        //参数2:true 自动刷新
        //如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
        PrintWriter writer = new PrintWriter(new FileOutputStream("c.txt"),true);
        //writer.write("字符打印流");
        writer.println("abc");
        writer.println("abc");
        writer.println("abc");
        writer.println("abc");
        writer.println("abc");
        writer.println("abc");
        writer.println("abc");
       writer.flush();
       writer.close();
    }
}
public class 打印流复制文本文件 {
    public static void main(String[] args) throws IOException {
        //A:
        //案例演示:
        //打印流复制文本文件
        BufferedReader reader = new BufferedReader(new FileReader("内存操作流.java"));

        PrintWriter printWriter = new PrintWriter(new FileOutputStream("aa.java"),true);
        String line=null;
        while ((line=reader.readLine())!=null){
          printWriter.println(line);
        }
        reader.close();
        printWriter.close();
        System.out.println("----------------------------------");
        Scanner scanner = new Scanner(new File("内存操作流.java"));
        PrintWriter printWriter2 = new PrintWriter(new FileOutputStream("bb.java"), true);
        while (scanner.hasNextLine()){
            String s = scanner.nextLine();
            printWriter2.println(s);
        }
        scanner.close();
        printWriter2.close();


    }
}
四 两种方式实现键盘录入
public class 键盘录入的第二种方式 {
    public static void main(String[] args) throws IOException {
        //Scanner scanner = new Scanner(System.in);
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            System.out.println("请输入数据");
            String s = reader.readLine();
            //自定义一个结束标记
            if("886".equals(s)){
                break;
            }
            System.out.println(s);
        }
    }
}
五 随机访问流概述和写出数据

一 随机访问流概述

  1. ​ RandomAccessFile概述 最大特点 能读能写
  2. ​ RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功 能。
  3. ​ 支持对随机访问文件的读取和写入。
  4. 我们可以通过getFilePointer方法获取文件指针,并且可以通过seek方法设置文件指针
public class MyTest {
    public static void main(String[] args) throws IOException {
       // RandomAccessFile 随机访问流,此流的特点,能读能写,有一个文件指针,能够记录文件读写的位置
       // 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;
        //rw 模式,可读可以写
       // writeData();
       //你怎么写的,就怎么读取 顺序不要乱
        RandomAccessFile ra = new RandomAccessFile(new File("e.txt"), "rw");
        boolean b = ra.readBoolean();
        //获取文件指针的位置
        long filePointer = ra.getFilePointer();
        System.out.println(filePointer);//1
        double v = ra.readDouble();
        filePointer = ra.getFilePointer();
        System.out.println(filePointer);//9
        int i = ra.readInt();
        filePointer = ra.getFilePointer();
        System.out.println(filePointer);//13
        char c = ra.readChar();
        filePointer = ra.getFilePointer();
        System.out.println(filePointer);//15
        String s = ra.readUTF();
        filePointer = ra.getFilePointer();
        System.out.println(filePointer);//
        System.out.println(b);
        System.out.println(v);
        System.out.println(i);
        System.out.println(s);

        //设置指针的位置
        ra.seek(15);
        String s1 = ra.readUTF();
        System.out.println(s1);


    }

    private static void writeData() throws IOException {
        RandomAccessFile ra = new RandomAccessFile(new File("e.txt"), "rw");
        ra.writeBoolean(true);
        ra.writeDouble(3.14);
        ra.writeInt(100);
        ra.writeChar('a');
        ra.writeUTF("字符串");

        ra.close();
    }
}
public class MyTest2 {
    public static void main(String[] args) throws IOException {

        RandomAccessFile ra = new RandomAccessFile("许巍 - 曾经的你.mp3", "rw");
        File file = new File("曾经的你.mp3");
        RandomAccessFile ra2 = new RandomAccessFile(file, "rw");
        if(file.exists()){
            String s = new BufferedReader(new FileReader("临时.txt")).readLine();
            int i = Integer.parseInt(s);
            ra.seek(i);
           ra2.seek(i);
        }else{
            ra.seek(0);
            ra2.seek(0);
        }

        try {
            int len = 0;
            byte[] bytes = new byte[1];
            int index=1;
            while ((len = ra.read(bytes)) != -1) {
                    ra2.write(bytes,0,len);
            }
        }catch (Exception e){
            //一旦遇到异常,我得记录当前指针的位置
            long filePointer = ra.getFilePointer();
            System.out.println(filePointer);
            PrintWriter printWriter = new PrintWriter("临时.txt");
            printWriter.println(filePointer);
            printWriter.flush();
            
        }
    }
}
六 序列化流和反序列化流的概述和使用

序列化流的概述

所谓序列化就是把对象通过流的方式储存到文件中(此对象要重写serializable接口才能被序列化)

反序列化:就是把文件中存储的对象以流的方式还原成对象

序列化流:objectoutputStream

反序列化 :objectinputsSream

像这样一个接口中如果没有方法,那么这样的接口我们将其称之为标记接口

一个对象可以被序列化的前提是这个对象对应的类必须实现serialiable接口

 public static void main(String[] args) throws IOException, CloneNotSupportedException, ClassNotFoundException {
        
        readObj();

    }

    private static void readObj() throws IOException, ClassNotFoundException {
        ObjectInputStream objin = new ObjectInputStream(new FileInputStream("student.txt"));
        Object obj = objin.readObject();
        Student student= (Student) obj;
        System.out.println(student.getName());
        System.out.println(student.getAge());
    }

    private static void writeObj() throws IOException {
        Student student = new Student("zhangsan",23);
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("student.txt"));
        out.writeObject(student);
        out.close();
    }
}
public class Student implements Serializable,Cloneable {

    private static final long serialVersionUID = -7602640005373026150L;
    //public static final long serialVersionUID = 42L;
    private String name;
    //transient 某个成员变量不想序列化可以使用transient来修饰一下
    public transient int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

如何解决序列化的时候黄色警告线的问题

  • 我一个类可以被序列化的前提是需要这个类实现Serializable接口,就需要给这个类添加一个标记.
  • 在完成序列化以后,序列化文件中还存在一个标记,然后在进行反序列化的时候,
    会验证这个标记和序列化前的标记是否一致,如果一致就正常进行反序列化
  • 不一致就报错了. 而现在这个类做了修改,将相当于更改了标记,而导致这两个标记不一致,就报错了.
  • 解决问题: 只要让这个两个标记一致,就不会报错了
  • alt+enter, 生成出来
    private static final long serialVersionUID = -7602640005373026150L;
七 properties的概述和作为map集合的使用

properties类表示一个持久的属性集,可以保存在流中或从流中加载

​ 属性列表中每一个键及其对应值都是一个字符串

properties的父类是Hashtable,属于双列集合,这个集合的键和值都是字符串proper不能指定泛型

 public static void main(String[] args) {
            // Properties 属性集合,经常用它来读写配置文件 属于双列集合
            Properties properties = new Properties();//他规定了键值 是String类型
            //properties.put("aaa","bbb");
            //Object aaa = properties.get("aaa");
            //System.out.println(aaa);
            //用它特有的方法,来存储键值
            properties.setProperty("陈羽凡","白百合");
            String value = properties.getProperty("陈羽凡");
            System.out.println(value);
            //参数2,默认值,如果键没有找到对应的值,就返回默认值
            String property = properties.getProperty("陈羽凡", "李小璐");
            System.out.println(property);

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
在全球电动汽车产业快速扩张的背景下,充电基础设施的规划与运营效率成为影响交通能源转型的关键环节。充电站作为电动汽车能源补给的核心节点,其电力负荷的波动特性直接关系到电网稳定与用户服务体验。因此,构建精确的负荷预测模型已成为提升充电网络智能化管理水平的重要基础。 为支持相关研究与应用开发,专门针对充电站电力消耗预测所构建的数据集合,系统整合了多维度变量,旨在揭示负荷变化的潜在规律。这类数据通常涵盖以下结构化信息:时序用电记录,以固定间隔(如每小时或每日)记载充电站总能耗;充电过程明细,包括各充电单元的功率曲线、充电持续时间及结束时刻;用户行为特征,例如用户群体分类、充电周期规律与时段偏好;外部环境参数,如气象指标(气温、降水、风力)及法定假期安排,这些因素共同作用于出行需求与充电决策;站点属性数据,涉及地理位置、充电设备型号与规模、服务容量上限等,用于评估站点运行效能。 数据质量与覆盖范围显著影响预测算法的可靠性。完备且精准的数据有助于识别负荷波动的驱动要素,进而支持电网侧与运营侧的协同优化。例如,基于负荷预测结果,运营商可实施动态定价机制,引导用户在低谷时段充电,以平抑电网峰值压力;电力部门则可依据预测趋势提前规划配电网络扩容,保障供电安全。 当前,随着机器学习与人工智能方法的不断成熟,将其引入充电负荷预测领域,不仅能够提升模型预测精度,还可推动充电站运营向自动化、自适应方向演进,从而促进电动汽车生态体系的长期可持续发展。总体而言,充电站负荷预测数据集为学术研究与工程实践提供了关键的数据基础,助力实现负荷精准预估、资源优化配置与能源高效利用,进一步加速电动汽车的规模化应用。 资源来源于网络分享,仅用于学习交使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值