IO流案例以及特殊操作流/对象对象序列化流/Properties集合
文章目录
- IO流案例
- 复制单级文件夹
- 复制多级文件夹
- IO特殊操作流
- 标准输入流
- 字节打印流
- 字符打印流
- 对象序列化流
- serialVersionUID&transient
- Properties集合
- Properties作为Map集合的使用
- Properties作为Map集合的特有方法
- Properties和IO流相结合的方法
- CET4P228
IO流案例
复制单级文件夹
单级文件夹也就是一个文件夹里面有多个文件
步骤
- 创建数据源目录File对象
- 获取数据源目录File对象的名称
- 创建目的地目录File对象,路径自定义,文件名就用源目录对象的文件名
- 判断第3步创建的File是否存在,如果不存在,就创建
- 获取数据源目录下所有文件的File数组
- 遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件
- 获取数据源文件File对象的名称
- 创建目的地文件File对象,路径由(目的地目录+第7步获取的名称)组成
- 复制文件
由于不清楚数据源目录下的文件都是什么类型的,所以采用字节流复制文件采用参数为File的构造方法
import java.io.*;public class example_2 {public static void main(String[] args) throws IOException {File srcFile = new File("D:\\JavaSE\\src\\day_19"); //1. 创建数据源目录File对象String fileSourceName = srcFile.getName(); //2. 获取数据源目录File对象的名称File destFolder = new File("D:\\", fileSourceName); //3. 创建目的地目录File对象if (!destFolder.exists()) {//4. 判断第3步创建的File是否存在,如果不存在,就创建destFolder.mkdir(); //创建目录}File[] listFiles = srcFile.listFiles(); //5. 获取数据源目录下所有文件的File数组for (File f : //6. 遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件listFiles) {String srcFiles = f.getName(); //7. 获取数据源文件File对象的名称File deskFile = new File(destFolder, srcFiles);//8. 创建目的地文件File对象copyFile(f, deskFile); //9.复制文件}}public static void copyFile(File srcFile, File deskFile) throws IOException {BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(deskFile));BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(srcFile));byte[] bytes = new byte[1024]; //使用数组方法输入输出int len;while ((len = bufferedInputStream.read(bytes)) != -1) {bufferedOutputStream.write(bytes, 0, len);}bufferedInputStream.close();bufferedOutputStream.close();}
}
复制多级文件夹
多级文件夹就是一个文件夹里面包含另一个文件夹等
步骤
- 创建数据源File对象
- 创建目的地File对象,路径自定义
- 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
- 判断数据源File是否是文件
是文件:直接复制,用字节流
不是文件:
在目的地下创建该目录
遍历获取该目录下的所有文件的File数组,得到每一个File对象
回到3继续(递归
)
import java.io.*;public class example_3 {public static void main(String[] args) throws IOException {File srcFile = new File("D:\\JavaSE");File destFile = new File("E:\\");copyFolder(srcFile, destFile);}private static void copyFolder(File srcFile, File destFile) throws IOException {if (srcFile.isDirectory()) { //判断是否为目录String srcFileName = srcFile.getName();File newFolder = new File(destFile, srcFileName);if (!newFolder.exists()) { //判断该文件夹是否存在newFolder.mkdir();}File[] listFiles = srcFile.listFiles();for (File file :listFiles) {copyFolder(file, newFolder); //递归}} else { //不是目录直接复制文件File newFile = new File(destFile, srcFile.getName());copyFile(srcFile, newFile);}}public static void copyFile(File srcFile, File deskFile) throws IOException {BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(deskFile));BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(srcFile));byte[] bytes = new byte[1024]; //使用数组方法输入输出int len;while ((len = bufferedInputStream.read(bytes)) != -1) {bufferedOutputStream.write(bytes, 0, len);}bufferedInputStream.close();bufferedOutputStream.close();}
}
IO特殊操作流
标准输入流
System类中有两个静态的成员变量
- public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的
另一个输入源 - public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的
另一个输出目标
由于自己实现键盘录入数据太麻烦了,所以Java提供了一个类
Scanner sc = new Scanner(System.in)
字节打印流
打印流分类
- 字节打印流:
PrintStream
- 字符打印流:
PrintWriter
打印流的特点
- 只负责输出数据,不负责读取数据
永远不会抛出IOException
- 有自己的特有方法
字节打印流
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
- 可以改变输出语句的目的地
public static void setOut(PrintStream out):重新分配“标准”输出流
字符打印流
字符打印流构造方法
方法名 | 说明 |
---|---|
PrintWriter(String fileName) | 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新 |
PrintWriter(Writer out, boolean autoFlush) | 创建一个新的PrintWriter out:字符输出流 autoFlush: 一个布尔值,如果为真,则println , printf ,或format方法将刷新输出缓冲区 |
import java.io.PrintWriter;public class example_8 {public static void main(String[] args) {// PrintWriter printWriter = new PrintWriter(System.out); //输出到控制台
// printWriter.print("hello");
// printWriter.flush(); //如果不刷新的话是不会显示的
// printWriter.close();PrintWriter printWriter1 = new PrintWriter(System.out, true); //自动刷新printWriter1.print("Java");printWriter1.close();}
}
对象序列化流
对象序列化介绍
- 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
- 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
- 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
- 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
对象序列化流: ObjectOutputStream
- 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。
如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
构造方法
方法名 | 说明 |
---|---|
ObjectOutputStream(OutputStream out) | 创建一个写入指定的OutputStream的ObjectOutputStream |
序列化对象的方法
方法名 | 说明 |
---|---|
void writeObject(Object obj) | 将指定的对象写入ObjectOutputStream |
注意事项
- 一个对象要想被序列化,该对象
所属的类必须必须实现Serializable 接口
Serializable是一个标记接口,实现该接口,不需要重写任何方法
import java.io.*;class Student implements Serializable { //实行接口// private static final long serialVersionUID = 42L;private String name;public Student() {}public Student(String name) {this.name = name;}
serialVersionUID&transient
serialVersionUID
- 用对象序列化流
序列化
了一个对象后
,假如我们修改
了对象所属的类文件,读取数据会不会出问题呢?- 会出问题,会抛出InvalidClassException异常
- 如果出问题了,如何解决呢?
- 重新序列化
- 给对象所属的类加一个serialVersionUID
private static final long serialVersionUID = 42L
;
transient
- 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
- 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
class Student implements Serializable {private static final long serialVersionUID = 42L;private String name;private transient int age; //不参与序列化过程public Student() {}public Student(String name) {this.name = name;}
Properties集合
Properties作为Map集合的使用
Properties介绍
- 是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
- 属性列表中的每个键及其对应的值都是一个字符串
Properties基本使用
import java.util.Properties;
import java.util.Set;public class example_5 {public static void main(String[] args) {Properties properties = new Properties();properties.setProperty("abc001","老师");properties.setProperty("abc002","小明");properties.setProperty("abc003","小红");properties.setProperty("abc004","小刚");
// Set<Object> objects = properties.keySet(); //获取键的集合
// for (Object k: //遍历键的集合
// objects) {// Object v = properties.get(k);
// System.out.println(k+","+v);
// }Set<String> stringSet = properties.stringPropertyNames();for (String k :stringSet) {String v = properties.getProperty(k);System.out.println(k+v);}}
}
Properties作为Map集合的特有方法
方法名 | 说明 |
---|---|
Object setProperty (String key,String value)
|
设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |
String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
Set stringPropertyNames()
|
从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
|
使用的例子在上面
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)方法的格式写入输出字符流 |
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class example_6 {public static void main(String[] args) throws IOException {// myStore(); //把集合中的数据保存到文件中myLoad(); //把文件中的数据加载到集合中}private static void myLoad() throws IOException {Properties properties = new Properties();FileReader fileReader = new FileReader("D:\\JavaSE\\bw.txt");properties.load(fileReader); //从文件中输入fileReader.close();System.out.println(properties);}private static void myStore() throws IOException {Properties properties = new Properties();properties.setProperty("abc001","老师");properties.setProperty("abc002","小明");properties.setProperty("abc003","小红");FileWriter fileWriter = new FileWriter("D:\\JavaSE\\bw.txt");properties.store(fileWriter,null); //第二个参数是描述信息fileWriter.close();}
}
CET4P228
- climax
- battalion
- implicit
- preview
- climax
- baby boom
- proclaim
- ward
- chorus
- badminton
- coherent
- biochemist
IO流案例以及特殊操作流/对象对象序列化流/Properties集合相关推荐
- 对象的序列化流_ObjectOutputStream
package com.learn.demo04.ObjectStream;import java.io.FileOutputStream; import java.io.IOException; i ...
- 集合到文件 文件到集合 点名器 集合到文件数据排序版 标准输入流 打印流 对象序列化流 对象返序列化流 Properties 游戏次数 进程和线程 线程 多线程的实现方式 设置和获取线程名称
文章目录 集合到文件 文件到集合 点名器 集合到文件数据排序版 标准输入流 打印流 对象序列化流 对象返序列化流 Properties 游戏次数 进程和线程 线程 多线程的实现方式 设置和获取线程名称 ...
- java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...
一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...
- [Java基础]对象(反)序列化流
对象序列化流: 代码如下: package ObjectOutputStreamPack;import java.io.Serializable;public class Student implem ...
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties...
你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新 ...
- Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties
你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新 ...
- (java)IO流对象(六)集合Properties类、序列化流、反序列化流、打印流
[Properties特点] /** 集合对象Properties类特点:* 1. 继承Hashtable,实现Map接口* 2. 该集合无泛型,键值都是字符串* 3. 键值可以存储到集合中,也可以存 ...
- io包下 文件类 字节流 字符流 缓冲流 转换流 序列化流 打印流
第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.2 构造方法 public File(String pat ...
- File类与IO流知识总结(三):缓冲流、转换流、序列化流
一 :缓冲流 在上篇文章中学习了基本的一些流,作为IO流的入门,而现在我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等.这些功能更为强大的流, ...
最新文章
- 数学符号正三角形△和倒三角形▽的意思
- Web Service入门简介(一个简单的WebService示例)
- 逆向入门--简单win32CK逆向手记
- php ismethod,结合php类三种属性说明is_callable和method_exists简单区别
- c#中Task线程的用法
- 深度学习TF—6.神经网络过拟合及reduce overfitted
- mac上捕获Dock截图的方法
- 科学计算与可视化python_Python科学计算和可视化
- CGLIB 动态代理使用
- Netty websocket 推送数据压缩以 js解压
- 电机系列(1) - foc最基本原理、clark变换 、park变换、附代码
- 《C》C语言实现FFT算法
- 学3D建模的电脑配置
- 深度学习结合SLAM的研究思路/成果整理之(二)语义SLAM 端到端
- 以下数据库收录外文文献全文的有_【讲座】外文文献的检索与获取
- 将数组分成两部分使得两部分的和的差最小
- 区块链是什么?华为云学院带你领略区块链的前世今生
- 基于Matlab的数字水印设计
- Java学习笔记(五):Complex类的设计及加减乘除运算的实现
- 八千字,带你看示波器的发展史。