当前位置: 首页 > news >正文

Java特殊操作流

6 特殊操作流

6.1 标注输入输出流

  • System类中有两个静态的成员变量:
    • public static final InputStream in:标准输入流,通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
    • public static final PrintStream out:标准输出流,通常该流对应于显示输出或由主机环境或用户指定的另一个输入源
package test;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class Demo {public static void main(String[] args) throws  IOException {
/*        //public static final InputStream in:标准输入流InputStream is = System.in;int by;while((by=is.read()) != -1) {System.out.print((char)by);}//如何把字节流转换为字符流InputStreamReader isr = new InputStreamReader(is);//一次读一行,是字符缓冲输入流的特有方法BufferedReader br  =new BufferedReader(isr);*/BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入一个字符串");String line = br.readLine();System.out.println("你输入的字符串:"+line);br.close();}
}

6.2 打印流

  • 打印流分类
    • 字节打印流:PrintStream
    • 字符打印流:PrintWriter
  • 打印流特点
    • 只负责输出数据,不负责读取数据
    • 有自己特有方法
  • 字节打印流
    • PrintStream(String fileName):使用指定的文件名创建新的打印流
    • 使用继承父类的方法写数据,查看时会转码;使用自己特有方法写数据,查看的数据原样输出
package test;import java.io.*;public class Demo {public static void main(String[] args) throws  IOException {//PrintStream(String fileName):使用指定的文件名创建新的打印流PrintStream ps = new PrintStream("E:\\test\\java.txt");/*ps.print(1);ps.print(2);*///12没有换行ps.println(97);ps.println(87);//97//87ps.close();}
}
  • 字符打印流
方法名说明
PrintWriter(String fileName)使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新
PrintWriter(Writer out,boolean autoFlush)创建一个新的PrintWriter;out:字符输出流,autoFlush:一个布尔值,如果为true,则println,printf,或format方法将刷新输出缓冲区
package test;import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class Demo {public static void main(String[] args) throws IOException {//1,PrintWriter(String fileName)
/*        PrintWriter pw = new PrintWriter("E:\\test\\java.txt");*//*pw.write("hello");pw.write("\r\n");pw.flush();pw.write("hello");pw.write("\r\n");pw.flush();*//**//*hellohello*//*pw.println("hello"); //换行pw.flush();pw.println("hello");pw.flush();*///2,PrintWriter(Writer out,boolean autoFlush)PrintWriter pw = new PrintWriter(new FileWriter("E:\\test\\java.txt",true));pw.println("hello");pw.println("hello"); //构造方法自动刷新了pw.close();}
}

6.3 对象序列化

  • 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
    这种机制就是使用一个字节序列表示个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
    反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

  • 要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:

    • 对象序列化流: ObjectOutputStream
    • 对象反序列化流: ObjectlnputStream

6.3.1 对象序列化流

  • 对象序列化流:ObjectOutputStream

  • 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取 (重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流, 则可以在另一个主机上或另一个进程中重构对象

  • 构造方法

方法名说明
ObjectOutputStream(OutputStream out)创建一个写入指定的OutputStream的ObjectOutputStream
  • 序列化对象的方法
方法名说明
void writeObject(Object obj)将指定的对象写入ObjectOutputStream
  • 注意

  • 一个对象要想被序列化,该对象所属的类必须必须实现Serializable[ˈsɪərɪlaɪzbl]接口

  • Serializable是一个标记接口,实现该接口,不需要重写任何方法

  • 范例:

  • Student类

package test;import java.io.Serializable;
//NotSerializableException:一个对象要想被序列化,该对象所属的类必须必须实现Serializable接口
public class Student implements Serializable { private String name;private 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;}
}
  • 测试类
package test;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class ObjectOutputStreamDemo {public static void main(String[] args) throws IOException {//ObjectOutputStream(OutputStream out) 	创建一个写入指定的OutputStream的ObjectOutputStreamObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\test\\java.txt"));//创建对象Student s = new Student("小白",10);//void writeObject(Object obj) 	将指定的对象写入ObjectOutputStreamoos.writeObject(s);oos.close();/* sr test.Student蝄8kr<q I ageL namet Ljava/lang/String;xpt 灏忕櫧*/}
}

6.3.2 对象反序列化流

  • 对象反序列化流:ObjectInputStream
  • ObjectInputStream反序列化前先使用ObjectOutputStream编写的原始数据和对象
  • 构造方法
方法名说明
ObjectInputStream(InputStream in)创建从指定InputStream读取的ObjectInputStream
  • 反序列化对象的方法
方法名说明
Object readObject()从ObjectInputStream读取一个对象
  • 范例
package test;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;public class Demo {public static void main(String[] args) throws IOException, ClassNotFoundException {//ObjectInputStream(InputStream in) 	创建从指定InputStream读取的ObjectInputStreamObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\test\\java.txt"));//Object readObject() 	从ObjectInputStream读取一个对象Student s = (Student) ois.readObject();;System.out.println(s.getName()+","+s.getAge()); //小白,10ois.close();}
}

6.3.3 注意事项

1、用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?

  • 会出问题, 抛出InvalidClassException异常

2、如果出问题了,如何解决呢?

  • 给对象所属的类加一 个serialVersionUIDprivate static final long serialVersionUID = 42L;

3、如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?

  • 给该成员变量加transient [ˈtrænziənt] 关键字修饰,该关键字标记的成员变量不参与序列化过程:private transient int age; (age不会参加序列化)

6.4 Properties

6.4.1 Properties [ˈprɒpətiz]作为Map集合使用

  • Properties概述:
  • 是一个Map体系的集合
  • Properties可以保存到流或者从流加载
  • 范例:
package test;import javafx.beans.property.Property;import java.util.Properties;
import java.util.Set;public class Demo {public static void main(String[] args) {Properties prop = new Properties();//存储元素prop.put("001","小黑");prop.put("002","小白");prop.put("003","小灰");Set<Object> keySet = prop.keySet();for(Object key:keySet) {Object value = prop.get(key);System.out.println(key+","+value);
//            003,小灰
//            002,小白
//            001,小黑}}
}

6.4.2 Properties特有方法

方法名说明
Object setProperty(String key, String value)设置集合的键和值,都是String类型, 底层调用Hashtable方法 put
String getProperty(String key)使用此属性列表中指定的键搜索属性
Set<String> stringPropertyNames()从该属性列表中返回一个不可修改的键集,其中键及其应的值是字符串
  • 范例:
package test;import javafx.beans.property.Property;import java.util.Properties;
import java.util.Set;public class Demo {public static void main(String[] args) {Properties prop = new Properties();//1,Object setProperty(String key, String value) 	设置集合的键和值,都是String类型, 底层调用Hashtable方法 putprop.setProperty("001","小黑");/*public synchronized Object setProperty(String key, String value) {return put(key, value);}*/prop.setProperty("002","小白");prop.setProperty("003","小灰");/2String getProperty(String key) 	使用此属性列表中指定的键搜索属性System.out.println(prop.getProperty("003")); //小灰System.out.println(prop.getProperty("004")); //null//3,Set<String> stringPropertyNames() 	从该属性列表中返回一个不可修改的键集,其中键及其应的值是字符串Set<String> names = prop.stringPropertyNames();for(String key:names) {
//            System.out.println(key);
//            003
//            002
//            001String value = prop.getProperty(key);System.out.println(key+","+value);
//            003,小灰
//            002,小白
//            001,小黑}}
}

6.4.3 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)方法的格式写入输出字符流
  • 范例
package test;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class Demo {public static void main(String[] args) throws IOException{//把集合中的数据保存到文件myStore();//把文件中的数据保存到集合myLood();}private static void myLood() throws IOException{Properties prop = new Properties();FileReader fr = new FileReader("E:\\test\\java.txt");//2,void load(Reader reader)prop.load(fr);fr.close();System.out.println(prop); //{003=小灰, 002=小白, 001=小黑}}private static void myStore() throws IOException {Properties prop = new Properties();prop.setProperty("001", "小黑");prop.setProperty("002", "小白");prop.setProperty("003", "小灰");//4,void store(Writer writer, String comments)FileWriter fw = new FileWriter("E:\\test\\java.txt");prop.store(fw,null);fw.close();}
}

相关文章:

Java特殊操作流

6 特殊操作流 6.1 标注输入输出流 System类中有两个静态的成员变量&#xff1a; public static final InputStream in&#xff1a;标准输入流&#xff0c;通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out&#xff1a;标准输…...

如何用SCRM销售管理系统管理销售和做销售管理

每一家企业都在找适合自己公司的销售管理方法&#xff0c;实现销售目标和努力提高业绩。 我们常说&#xff0c;做好销售管理有很多路径和方法&#xff0c;但我们不知道从哪里开始&#xff1f;每个阶段我们该怎么办&#xff1f;如何有效管理销售团队&#xff1f;好的企企业微信…...

分享117个HTML婚纱模板,总有一款适合您

分享117个HTML婚纱模板&#xff0c;总有一款适合您 117个HTML婚纱模板下载链接&#xff1a;https://pan.baidu.com/s/1cC3I5cfh91-KmQj4nfSoPA?pwd9hod 提取码&#xff1a;9hod Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 import os import shutil import …...

VIVADO2022 sdk 工程创建流程

正点原子uart历程复现 create block design&#xff08;起名 为System&#xff09; -> open block design -> 号/IP catalog 中搜索zynq 双击打开&#xff0c; 将和pl相关的时钟都干掉 再auto 布线一下 把herarchy中的sources 中的system.bd右键、 无脑下一步导出 如…...

【MyBatis】源码学习 02 - Java 元注解以及 MyBatis @Param 注解分析

文章目录前言参考目录学习笔记1、Java 注解1.1、Java 元注解1.2、Java ElementType 枚举值1.3、自定义注解2、Param 注解分析2.1、Param 注解2.2、测试方法2.3、流程分析&#xff08;重点&#xff1a;ParamNameResolver&#xff09;前言 本文内容对应的是书本第 7 章的内容&am…...

贪心算法-蓝桥杯

一、贪心算法的优缺点优点&#xff1a;1.容易理解:生活常见。2.操作简单:在每一步都选局部最优。3.效率高: 复杂度常常是O(1)的。缺点&#xff1a;1.局部最优不一定是全局最优。二、例子: 最少硬币问题硬币面值1、2、5。支付13元&#xff0c;要求硬币数量最少。贪心法: (1) 5元…...

zookeeper 复习 ---- chapter03

zookeeper 复习 ---- chapter03如何创建 zookeeper 对象 要求&#xff1a; 1&#xff1a;知道这几个构造参数 2&#xff1a;知道每一个参数的含义 ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) ZooKeeper(String connectString, int sessionTimeout…...

1.PostgreSQL

文章目录LIMITWITH 和RECURSIVEPostgreSQL 约束PostgreSQL AUTO INCREMENT&#xff08;自动增长&#xff09;PostgreSQL PRIVILEGES&#xff08;权限&#xff09;GRANT语法LIMIT SELECT * FROM COMPANY LIMIT 3 OFFSET 2;WITH 和RECURSIVE WITH RECURSIVE t(a,b) AS (VALUES (…...

buu [UTCTF2020]basic-crypto 1

题目描述&#xff1a; 01010101 01101000 00101101 01101111 01101000 00101100 00100000 01101100 01101111 01101111 01101011 01110011 00100000 01101100 01101001 01101011 01100101 00100000 01110111 01100101 00100000 01101000 01100001 01110110 01100101 00100000 0…...

火山引擎数智平台的这款产品,正在帮助 APP 提升用户活跃度

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 你有没有关注过 APP 给你推送的消息&#xff1f; 出于提升用户活跃度的考虑&#xff0c;APP 会定期在应用内面向用户进行内通推送&#xff0c;推送形式既包括 APP …...

记录每日LeetCode 2341.数组能形成多少数对 Java实现

题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标…...

Ant Design Chart词云图

什么是词云图&#xff1f;词云图&#xff0c;也叫文字云&#xff0c;是对网络文本中出现频率较高的“关键词”予以视觉上的突出&#xff0c;出现越多&#xff0c;显示的字体越大&#xff0c;越突出&#xff0c;这个关键词也就越重要。让浏览者通过词云图一眼就可以快速感知最突…...

mysql索引

索引 mysql索引&#xff1a; 在MySQL中&#xff0c;索引是存储引擎实现的&#xff0c;所以没有统一的索引标准&#xff0c;不同存储引擎的索引工作方式也不一样&#xff0c;也不是所有的存储引擎都支持所有类型的索引即使是多个存储引擎都支持同一种类型的索引&#xff0c;他…...

Java中怎样将数据对象序列化和反序列化?

程序在运行过程中&#xff0c;可能需要将一些数据永久地保存到磁盘上&#xff0c;而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化。对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序…...

ffmpeg filter的理解

ffmpeg filter的理解 filter的简介 从整体看&#xff0c;filte rgraph包含filter chain&#xff0c;而filter chain又包含了filter&#xff0c;所以可以分为是三个层次去理解。 filterfilter chainfilter graph filter graph是链接多个filter的有向图。它可以包含循环&#…...

炔活化的生物素化试剂773888-45-2,Alkyne-Biotin,炔基生物素

【产品描述】炔活化的生物素化试剂&#xff0c;可通过铜催化的点击反应与叠氮化物反应&#xff0c;产生稳定的三唑键&#xff0c;生物素炔烃在结构上与生物素炔烃相同。用于通过点击化学制备各种生物素化共轭物的生物素炔烃。Alkyne activated biotinylation reagents can prod…...

了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?

进行系统安全安排的专业人员非常了解“僵尸网络”一词。通常用于被劫持的计算机/系统链&#xff0c;如果指示恢复性和健壮的系统&#xff0c;则应很好地理解“僵尸网络”一词&#xff0c;因为它们的错误使用会导致巨大的混乱。 文章目录前言一、僵尸网络定义僵尸网络如何工作&a…...

大学生博主-14天学习挑战赛活动-CSDN

还在为写文没有流量发愁吗&#xff1f;还沉浸在假期中无法恢复状态吗&#xff1f;赶快来参与面向CSDN的大学生博主而举办的活动吧&#xff01;本次活动为了避免刷量行为&#xff0c;也为了保持公平性&#xff0c;能够选出最优秀的文章&#xff0c;特意邀请了五位在C站具有一定影…...

如何自学芯片设计?

众所周知&#xff0c;芯片设计自学还是比较困难的&#xff0c;更不存在速成的。这里简单说一下学习的规划。 学会相应的知识 无论是科班毕业&#xff0c;还是理工科专业&#xff0c;想要入行IC&#xff0c;那就一定要具备相关的基础知识。尤其是在学校里&#xff0c;学习的很…...

通过中断控制KUKA机器人暂停与再启动的具体方法示例

通过中断控制KUKA机器人暂停与再启动的具体方法示例 中断程序的基本介绍:  当出现例如输入信号变化等事先定义的事件时,机器人控制器中断当前程序,并处理一个已定义好的子程序  由中断而调用的子程序称为中断程序  最多允许同时声明32个中断  同一时间最多允许有16个…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...