Java进阶11 IO流、功能流

Java进阶11 IO流-功能流

一、字符缓冲流

字符缓冲流在源代码中内置了字符数组,可以提高读写效率

1、构造方法

方法说明
BufferedReader(new FileReader(文件路径))对传入的字符输入流进行包装
BufferedWriter(new FileWriter(文件路径))对传入的字符输出流进行包装

注意:缓冲流不具备读写功能,它们只是对普通的流对象进行包装,正真和文件建立关联的,还是普通流对象

1.1 字符缓冲流的使用
public class BufferedStreamDemo1 {
    /*
       1、字符缓冲流的基本使用
     */
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("day10\\A.txt"));
​
        //单个读取
        int i;
        while((i=br.read())!=-1){
            System.out.println((char)i);
        }
​
        //读取字符数组的一部分
        int len;
        char[] chs = new char[1024];
        while((len=br.read())!=-1){
            String s = new String(chs,0,len);
            System.out.println(s);
        }
​
        br.close();
​
        //字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\A.txt"));
        bw.write("写入数据......")
        bw.close();
    }
}
1.2 拷贝文件Demo
public class BufferedStreamDemo {
    /*
       字符缓冲流+自定义数组  拷贝文件
     */
    public static void main(String[] args) throws IOException {
        //字符流只能拷贝纯文本文件
        BufferedReader br = new BufferedReader(new FileReader("day11\\FileReaderDemo1.java"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("day11\\copy.java"));
​
        int len;
        char[] chs = new char[1024];
        while((len=br.read())!=-1){
            bw.write(chs,0,len);
        }
        br.close();
        bw.close();
    }
}

2、成员方法(特有)

2.1 BufferedReader
方法说明
public String readLine()一次性读取整行字符串,读取到末尾返回null
2.2 BufferedWriter
方法说明
public void newLine()写出换行符(具有兼容性)兼容各个操作系统的换行符
2.3 特有方法使用Demo
public class BufferedStreamDemo2 {
    /*
        拷贝本项目中A.txt文件到本项目copy.txt;
        一整行一整行地拷贝
     */
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("day11\\A.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("day11\\copy.txt"));
​
        String line;
        while((line=br.readLine())!=null){
            //readLine读不到换行符
            bw.write(line);
            //写出换行符
            bw.newLine();
        }
        br.close();
        bw.close();
    }
}

二、转换流

1、按照指定的字符编码读写操作

构造方法说明
InputStreamReader(InputStream in,String charsetName)按照指定的字符编码读取
OutputStreamWriter(OutputStream out,String charsetName)按照指定的字符编码写出
public class ChangeStreamDemo {
    /*
        转换流的使用Demo
     */
    public static void main(String[] args) throws IOException {
        //使用GBK字符编码向路径D:\itheima\Resource\A.txt文件写入你好呀
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\itheima\\Rescouce\\A.txt"),"GBK");
        osw.write("你好呀");
        osw.close();
​
        //使用gbk字符编码从路径D:\itheima\Resource\A.txt文件中读取字符
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\itheima\\Resource\\A.txt"),"gbk");
        //单个读取
        int i;
        while((i=isr.read())!=-1){
            System.out.print((char)i);
        }
        isr.close();
    }
}

2、将字节流转换为字符流进行操作

  • 应用场景

三、序列化流

可以在流中,以字节的形式直接读写对象

1、构造方法

方法说明
public ObjectInuputStream(InputStream in)对象输入流关联文件,关联方式使用字节输入流
public ObjectOutputStream(OutoutStream out)对象输出流关联文件,关联方式使用字节输出流

2、成员方法

方法说明
Object readObject()从流中读取对象(反序列化)
void writeObject(Object obj)在流中将对象写出(序列化)

3、方法使用案例

需求:现有3个学生对象,并将对象序列化到流中,随后完成反序列化操作

public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        readObject();
​
        //用流读对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day11\\obj.txt"));
        ArrayList<Student> stuList  = (ArrayList<Student>) ois.readObject();
        System.out.println(stuList);
        ois.close();
    }
​
    //将对象写入流
    private static void readObject() throws IOException {
        //为了一次读写三个学生对象,创建list集合存储
        ArrayList<Student> stu = new ArrayList<>();
        stu.add(new Student("张三",23));
        stu.add(new Student("李四",24));
        stu.add(new Student("王五",25));
​
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day11\\obj.txt"));
        oos.writeObject(stu);
        oos.close();
    }
}

注意事项

  • 类需要实现Serializable接口才可以序列化

  • 实现接口后,类就会自带一份序列版本号。序列化操作的时候,会将对象信息和版本号一并保存到文件,反序列化的时候,会拿着版本号和流中的版本号进行对比,不一致就会抛异常,起到提醒作用。为了避免这个问题,推荐手动写死serialVersionUID

    在IDEA中设置快捷添加serialVersionUID的快捷键

  • 如果类中的属性被transient进行修饰,将不会参与序列化操作

  • 建议:对象的读写操作只进行一次

四、打印流

打印流可以实现方便、高效的打印数据到文件中去(打印什么数据就是什么数据)

1、PrintStream字节打印流(重点)

构造器说明
public PrintStream(OutputStream os)打印流直接通向字节输出流管道(想要追加时可在os对象的第二个参数位置打开append追加开关)
public PrintStream(File f)打印流直接通向文件对象
public PrintStream(String filepath)打印流直接通向文件路径
成员方法说明
public void print\println(Xxx xxx)打印任意类型的数据出去

2、PrintWriter字符打印流(了解即可)

构造器说明
public PrintWriter(OutputStream os)打印流直接通向字节输出流管道
public PrintWriter(Writer w)打印流直接通向字符输出流管道
public PrintWriter(File f)打印流直接通向文件对象
public PrintWriter(String filepath)打印流直接通向文件路径
方法说明
public void print\println(Xxx xxx)打印任意类型的数据出去

五、Properties集合

1、Properties作为集合使用

构造器说明
Properties()创建一个没有默认值的空属性列表
方法说明
Object setProperty(String key,String value)添加(修改)一个键值对
String getPreperty(String key,String defaultValue)根据键获取值
Set<String> stringPropertyNames()获取集合中所有的键
public class PropertiesDemo1 {
    /*
       properties作为集合的使用
     */
    public static void main(String[] args) {
        //1、创建集合容器(不需要指定泛型,键和值都是String类)
        Properties prop = new Properties();
        //2、添加数据到集合(类似于put方法,当key相同时,新value会覆盖旧value)
        prop.setProperty("username","admin");
        prop.setProperty("passward","123456");
​
        //3、获取集合数据,根据键找值
        String username = prop.getProperty("username");
        String passward = prop.getProperty("passward");
        System.out.println(username+"----"+passward);
​
        System.out.println("-------------------------------");
​
        //4、类似Map集合中keySet方法,获取所有的键
        Set<String> keySet = prop.stringPropertyNames();
        //5、遍历集合+根据键找值拿到properties集合中的所有键值对
        for (String key : keySet) {
            System.out.println(key+"----"+prop.get(key));
        }
    }
}

2、Properties和IO有关的方法

方法说明
void load(InputStream inStream)从输入字节流读取属性列表(键和元素对)
void load(Reader reader)从输入字符流读取属性列表(键和元素对)
void store(OutputStream out,String comments)将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(InputStream)方法的格式写入输出字符流
void store(Writer writer,String comments)将次属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输出字符流
public class PropertiesDemo2 {
    /*
       以字节输入输出流为例
    */
    public static void main(String[] args) throws IOException {
        store();
        load();
    }
​
    //读取方法
    private static void load() throws IOException {
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("day11\\config.properties");
        //将读取到的内容存入prop集合
        prop.load(fis);
        System.out.println(prop);
        fis.close();
​
        /**
        经常需要修改的值(如用户名密码、数据库连接密码等)写在配置文件里,到时候只要执行这个代码就能直接加载配置文件里的一些设置,免去了频繁修改代码的繁琐
        */
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
​
        System.out.println(username);
        System.out.println(password);
    }
​
    //写入方法
    private static void store() throws IOException {
        Properties prop = new Properties();
        prop.setProperty("username","admin");
        prop.setProperty("password","123456");
​
        FileOutputStream fos = new FileOutputStream("day11\\cpnfig.properties");
​
        //第二个参数为备注内容,可传null,也可以传入字符串值
        prop.store(fos,"null");
​
        fos.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/625330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot+Vue的Java项目-宠物商城网站系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

暗区突围TWITCH掉宝领测试资格后,steam激活显示是无效激活码

自《暗区突围》测试启动以来&#xff0c;吸引了大量玩家关注&#xff0c;特别是通过在Twitch平台上观看直播即可获得测试资格的活动&#xff0c;更是掀起了热潮。然而&#xff0c;部分玩家在成功获得激活码后&#xff0c;在Steam平台激活时遭遇了“无效激活码”的问题。本文将提…

勒索软件漏洞?在不支付赎金的情况下解密文件

概述 在上一篇文章中&#xff0c;笔者对BianLian勒索软件进行了研究剖析&#xff0c;并且尝试模拟构建了一款针对BianLian勒索软件的解密工具&#xff0c;研究分析过程中&#xff0c;笔者感觉构建勒索软件的解密工具还挺有成就感&#xff0c;因此&#xff0c;笔者准备再找一款…

排序-归并排序(merge sort)

归并排序&#xff08;Merge Sort&#xff09;是一种分而治之的算法&#xff0c;它将原始数组分成越来越小的子数组&#xff0c;直到每个子数组只有一个元素&#xff0c;然后将这些子数组两两合并&#xff0c;过程中保持排序状态&#xff0c;最终合并成一个完全有序的数组。归并…

windows和Linux卸载移动磁盘

文章目录 Linux卸载磁盘target is busy.window卸载磁盘打开事件查看器 Linux卸载磁盘target is busy. #查看有哪些进程访问挂载点 lsof /media/lei/repository/#杀死进程 pkill node window卸载磁盘 #提示 #该设备正在使用中. 请关闭可能使用该设备的所有程序或窗口,然后重试…

ZL-016D多通道小鼠主动跑轮系统主要研究动物生活节律

简单介绍&#xff1a; 多通道小鼠主动跑轮系统是由动物本身自发运动来推动跑轮转动。在这种构型中&#xff0c;笼内动物长期活动的信息&#xff0c;如跑轮转动方向、转数、累计总行程等&#xff0c;能够使用编码器进行长度计记录。此装置由转轮组件、笼体、以及转动方向速度传…

国产分布式数据库高可用故障检测实现

在分布式数据库架构下&#xff0c;当数据库节点异常时&#xff0c;数据库管理组件能够自动感知到异常并触发节点隔离或者自动切换&#xff0c;是数据库高可用容灾的基本能力。在节点服务器异常、网络异常或进程异常等场景下&#xff0c;各数据库产品本身已经具备了可靠的检测能…

前端连续发送同一个请求时,终止上一次请求

场景&#xff1a;几个tab页之间快速的切换&#xff08;tab页只是参数不同&#xff0c;下边的数据渲染给同一个data&#xff09;就会导致如果我在1,2,3&#xff0c;tab页按照顺序快速点击&#xff0c;发送三个请求&#xff0c;我想要展示的是3但是如果1或者2请求响应的时间比3长…

超简洁的todolist工具,电脑桌面高效计划管理软件

对于上班族来说&#xff0c;在电脑上使用一款高效计划管理软件至关重要。这样的工具不仅能帮助我们清晰地规划和追踪工作任务&#xff0c;还能有效提高工作效率&#xff0c;减少遗漏和延误。例如&#xff0c;当我们面临多个项目并行时&#xff0c;通过管理软件可以一目了然地查…

web入门练手案例(二)

下面是一下web入门案例和实现的代码&#xff0c;带有部分注释&#xff0c;倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 数字变色Logo 案例描述 “Logo”是“商标”的英文说法&#xff0c;是企业最基本的视觉识别形象&#xff0c;通过商标的推广可以让消费者了解企…

【考研数学】强化阶段,张宇《1000题》正确率达到多少算合格?

首次正确率在60%以上就算是合格&#xff01; 张宇老师的1000题真挺难的&#xff0c;所以如果第一次做正确率不高&#xff0c;不要太焦虑&#xff0c;1000题不管是难度&#xff0c;综合度还是计算量&#xff0c;都比其他的题集高一截。 大家真实的做题情况下&#xff0c;如果正…

OmniDrive:具有 3D 感知推理和规划功能的自动驾驶整体 LLM-智体框架

24年5月北理工、Nvidia和华中科大的论文“OmniDrive&#xff1a;A Holistic LLM-Agent Framework for Autonomous Driving with 3D Perception Reasoning and Planning”。 多模态大语言模型&#xff08;MLLMs&#xff09;的进展导致了对基于LLM的自动驾驶的兴趣不断增长&…

Lumina-T2X 一个使用 DiT 架构的内容生成模型,可通过文本生成图像、视频、多视角 3D 对象和音频剪辑。

Lumina-T2X 是一个新的内容生成系列模型&#xff0c;统一使用 DiT 架构。通过文本生成图像、视频、多视角 3D 对象和音频剪辑。 可以在大幅提高生成质量的前提下大幅减少训练成本&#xff0c;而且同一个架构支持不同的内容生成。图像质量相当不错。 由 50 亿参数的 Flag-DiT …

零样本身份保持:ID-Animator引领个性化视频生成技术新前沿

在最新的研究进展中&#xff0c;由Xuanhua He及其团队提出的ID-Animator技术&#xff0c;为个性化视频生成领域带来了突破性的创新。这项技术的核心在于其零样本&#xff08;zero-shot&#xff09;人物视频生成方法&#xff0c;它允许研究者和开发者根据单一的参考面部图像生成…

人工神经网络(科普)

人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN &#xff09;&#xff0c;是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象&#xff0c; 建立某种简单模型&#xff0c;按不同的连接方式组成不同的网络。在工程…

Python 全栈体系【四阶】(四十二)

第五章 深度学习 九、图像分割 3. 常用模型 3.2 U-Net&#xff08;2015&#xff09; 生物医学分割是图像分割重要的应用领域。U-Net是2015年发表的用于生物医学图像分割的模型&#xff0c;该模型简单、高效、容易理解、容易定制&#xff0c;能在相对较小的数据集上实现学习…

利用KMeans进行遥感NDWI进行聚类分割

&#xff08;1&#xff09;解释 KMeans算法是一种非监督式的聚类算法&#xff0c;于1967年由J. MacQueen提出&#xff0c;聚类的依靠是欧式距离&#xff0c;其核心思想就是将样本划分为几个类别&#xff0c;类里面的数据与类中心的距离最小。类的标签采用类里面样本的均值。 这…

第16节 实战:文件转shellcode

我最近做了一个关于shellcode入门和开发的专题课&#x1f469;&#x1f3fb;‍&#x1f4bb;&#xff0c;主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料&#xff0c;内容里面的每一个环境我都亲自测试实操过的记录&#xff0c;有需要的小伙伴可以参考…

《告别重复:Spring AOP让你的代码花园绽放》

厌倦了在代码花园中重复种植相同的植物&#xff08;代码&#xff09;吗&#xff1f;Spring AOP将是你的园艺师&#xff0c;帮助你修剪和优化代码&#xff0c;让花园更加丰富多彩&#xff01; 文章目录 面向切面编程&#xff08;AOP&#xff09;主题文章一. 引言1.1 引入面向切面…

添砖Java之路(其八)——继承,final关键字

继承&#xff1a; 意义&#xff1a;让类于类之间产生父类于子类的关系&#xff0c;子类可以直接使用父类中的非私有成员(包括方法与成员变量) 。 extends关键字就是定义声明父类。 格式&#xff1a;public class 子类 extends 父类。 对于基础的我就不赘述了&#xff0c;我…