10java进阶——IO2
1. Properties类
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特点:
- Hashtable的子类,map集合中的方法都可以用。
- 该集合没有泛型。键值都是字符串。
- 它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
- 有和流技术相结合的方法。
- load(InputStream) 把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中
store(OutputStream,commonts)把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

package cn.jxufe.java.chapter09.demo05; import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set; /*
* 集合对象Properties类,继承Hashtable,实现Map接口
* 可以和IO对象结合使用,实现数据的持久存储
*/
public class Test01Property { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("使用Properties集合,存储键值对:");
function();
System.out.println("\nProperties集合特有方法 load:");
function_1();
System.out.println("\nProperties集合的特有方法store:");
function_2(); } /*
* Properties集合的特有方法store
* store(OutputStream out)
* store(Writer w)
* 接收所有的字节或者字符的输出流,将集合中的键值对,写回文件中保存
*/
public static void function_2() throws IOException {
Properties properties = new Properties();
properties.setProperty("name", "zhaosi");
properties.setProperty("age", "31");
properties.setProperty("email", "13657914425@163.com"); // 键值对,存回文件,使用集合的方法store传递字符输出流
FileWriter fr = new FileWriter("d:\\pro.properties");
properties.store(fr, "byZhao"); } /*
* Properties集合特有方法 load
* load(InputStream in)
* load(Reader r)
* 传递任意的字节或者字符输入流
* 流对象读取文件中的键值对,保存到集合
*/
public static void function_1() throws IOException {
Properties properties = new Properties();
FileReader fileReader = new FileReader("d:\\pro.properties");
// 调用集合的方法load,传递字符输入流
properties.load(fileReader);
fileReader.close();
System.out.println(properties);
} /*
* 使用Properties集合,存储键值对
* setProperty等同与Map接口中的put
* setProperty(String key, String value)
* 通过键获取值, getProperty(String key)
*/
public static void function() {
Properties properties = new Properties();
properties.setProperty("a", "1");
properties.setProperty("b", "2");
properties.setProperty("c", "3");
System.out.println(properties); String value = properties.getProperty("a");
System.out.println(value);
// 方法stringPropertyNames,将集合中的键存储到Set集合,类似于Map接口的方法keySet
Set<String> set = properties.stringPropertyNames();
for (String key : set) {
System.out.println(key + " " + properties.getProperty(key));
}
}
}


2.序列化流与反序列化流
用于从流中读取对象的
操作流 ObjectInputStream 称为 反序列化流
用于向流中写入对象的操作流 ObjectOutputStream 称为 序列化流
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

2.1实例
package cn.jxufe.java.chapter09.demo05; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; public class Test02ObjectStream { public static void main(String[] args) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
writeObject();
readObject();
} /*
* ObjectInputStream
* 构造方法:ObjectInputStream(InputStream in)
* 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
* Object readObject() 读取对象
*/
public static void readObject() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("d:\\person.txt");
// 创建反序列化流,构造方法中,传递字节输入流
ObjectInputStream ois = new ObjectInputStream(fis);
// 调用反序列化流的方法 readObject()读取对象
Object object = ois.readObject();// ClassNotFoundExcept,因为要有person.class文件
System.out.println(object);
ois.close();
} /*
* ObjectOutputStream
* 构造方法: ObjectOutputStream(OutputSteam out)
* 传递任意的字节输出流
* void writeObject(Object obj)写出对象的方法
*/
public static void writeObject() throws IOException {
// 创建字节输出流,封装文件
FileOutputStream fos = new FileOutputStream("d:\\person.txt");
// 创建写出对象的序列化流的对象,构造方法传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person person = new Person("lisi", 20); oos.writeObject(person);
oos.close(); }
} class Person implements Serializable {
public String name;
public int age;
// public transient int age;/*transient阻止成员变量序列化*/
// 类,自定义了序列号,编译器不会计算序列号
// private static final long serialVersionUID = 1478652478456L; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public Person() {
} 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;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }

2.2静态不能序列化
package cn.jxufe.java.chapter09.demo05; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; public class Test02ObjectStream { public static void main(String[] args) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
// writeObject();
readObject();
} /*
* ObjectInputStream
* 构造方法:ObjectInputStream(InputStream in)
* 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
* Object readObject() 读取对象
*/
public static void readObject() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("d:\\person.txt");
// 创建反序列化流,构造方法中,传递字节输入流
ObjectInputStream ois = new ObjectInputStream(fis);
// 调用反序列化流的方法 readObject()读取对象
Object object = ois.readObject();// ClassNotFoundExcept,因为要有person.class文件
System.out.println(object);
ois.close();
} /*
* ObjectOutputStream
* 构造方法: ObjectOutputStream(OutputSteam out)
* 传递任意的字节输出流
* void writeObject(Object obj)写出对象的方法
*/
public static void writeObject() throws IOException {
// 创建字节输出流,封装文件
FileOutputStream fos = new FileOutputStream("d:\\person.txt");
// 创建写出对象的序列化流的对象,构造方法传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person person = new Person("lisi", 19); oos.writeObject(person);
oos.close(); }
} class Person implements Serializable {
public String name;
// public int age;
public static int age;
// public transient int age;/*transient阻止成员变量序列化*/
// 类,自定义了序列号,编译器不会计算序列号
// private static final long serialVersionUID = 1478652478456L; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public Person() {
} 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;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }

注:此处的序列化是针对对象的,而静态成员是属于类的,所以不能序列化。
2.3序列化接口
当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。
同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下:
- 该类的序列版本号与从流中读取的类描述符的版本号不匹配
- 该类包含未知数据类型
- 该类没有可访问的无参数构造方法
Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。
2.4序列化数组
package cn.jxufe.java.chapter09.demo05; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class Test03ObjectStreamForArray { public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
// TODO Auto-generated method stub
int[] numbers = { 1, 2, 3, 4, 5 };
String[] strings = { "John", "Susan", "Kim" };
try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("d:\\array.dat", true));) {
output.writeObject(numbers);
output.writeObject(strings); }
try (ObjectInputStream input = new ObjectInputStream(new FileInputStream("d:\\array.dat"));) {
int[] newNumbers = (int[]) (input.readObject());
String[] newStrings = (String[]) (input.readObject());
for (int number : newNumbers) {
System.out.print(number + " ");
}
System.out.println(); for (String string : newStrings) {
System.out.print(string + " ");
} }
} }

3. 打印流
3.1打印流的概述
打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
打印流根据流的分类:
- 字节打印流 PrintStream
- 字符打印流 PrintWriter
方法:
- void print(String str): 输出任意类型的数据,
- void println(String str): 输出任意类型的数据,自动写入换行操作
package cn.jxufe.java.chapter09.demo05; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter; /*
* 打印流
* PrintStream
* PrintWriter
* 打印流的特点:
* 1. 此流不负责数据源,只负责数据目的
* 2. 为其他输出流,添加功能
* 3. 永远不会抛出IOException
* 但是,可能抛出别的异常
*
* 两个打印流的方法,完全一致
* 构造方法,就是打印流的输出目的端
* PrintStream
* 构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream
* PrintWriter
* 构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer
*
*/
public class Test04PrintWriter { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
function();
function_1();
function_2();
} /*
* 打印流,输出目的,是流对象
* 可以是字节输出流,可以是字符的输出流
* OutputStream Writer
*/
public static void function_2() throws IOException {
FileOutputStream fos = new FileOutputStream("d:\\3.txt");
OutputStreamWriter output = new OutputStreamWriter(fos, "utf-8");
PrintWriter pw = new PrintWriter(output);
pw.println("打印流");
pw.close();
} /*
* 打印流,输出目的,String文件名
*/
public static void function_1() throws FileNotFoundException {
PrintWriter pw = new PrintWriter("d:\\2.txt");
pw.println(3.5);
pw.close();
} /*
* 打印流,向File对象的数据目的写入数据
* 方法print println 原样输出
* write方法走码表
*/
public static void function() throws FileNotFoundException {
File file = new File("d:\\1.txt");
PrintWriter printWriter = new PrintWriter(file);
printWriter.print(true);
printWriter.print(100);
printWriter.close();
} }
3.2打印流完成数据自动刷新
可以通过构造方法,完成文件数据的自动刷新功能
构造方法:
开启文件自动刷新写入功能
- public PrintWriter(OutputStream out, boolean autoFlush)
- public PrintWriter(Writer out, boolean autoFlush)
package cn.jxufe.java.chapter09.demo05; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter; public class Test05PrintWriter { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
function();
} /*
* 打印流,可以开启自动刷新功能
* 满足2个条件:
* 1. 输出的数据目的必须是流对象
* OutputStream Writer
* 2. 必须调用println,printf,format三个方法中的一个,启用自动刷新
*/
public static void function() throws IOException {
// File f = new File("XXX.txt");
FileOutputStream fos = new FileOutputStream("d:\\4.txt");
PrintWriter pw = new PrintWriter(fos, true); //true 开启自动刷新
pw.println("i");
pw.println("love");
pw.println("java");
pw.close();
}
}
3.3文件复制
package cn.jxufe.java.chapter09.demo05; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; /*
* 打印流实现文本复制
* 读取数据源 BufferedReader+File 读取文本行
* 写入数据目的 PrintWriter+println 自动刷新
*/
public class Test06PrintWriterCopy { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("d:\\a.txt"), true);
String line = null;
while ((line = bfr.readLine()) != null) {
pw.println(line);
}
pw.close();
bfr.close();
} }
10java进阶——IO2的更多相关文章
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- nodejs进阶(5)—接收请求参数
1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...
- nodejs进阶(1)—输出hello world
下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var http = require ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...
随机推荐
- POJ 1363 Rails(栈)
题目代号:POJ 1363 题目链接:http://poj.org/problem?id=1363 题目原题: Rails Time Limit: 1000MS Memory Limit: 100 ...
- 6.20校内考试整理——大美江湖&&腐草为萤&&锦鲤抄题解
先安利一下题目作者:一扶苏一 先看第一题: 这道题就是一道简单的模拟题,只要不管一开始的位置,模拟移动与格子对应的触发事件就行了.话不多说,看代码: #include<iostream> ...
- <知识整理>2019清北学堂提高储备D4
今天主要讲一下数学的知识. 一.进制转换: 十进制到k进制:短除法:顺除至0,逆序取余. k进制转十进制:乘权相加. 常见进制:四进制(对应2位二进制).八进制(对应3位二进制).十六进制(对应4位二 ...
- SpringCloud 教程 (五) 断路器监控(Hystrix Dashboard)
一.Hystrix Dashboard简介 在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型.断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标.Hystrix ...
- [CSP-S模拟测试]:矩阵游戏(数学)
题目描述 $LZK$发明一个矩阵游戏,大家一起来玩玩吧,有一个$N$行$M$列的矩阵.第一行的数字是$1,2,...,M$,第二行的数字是$M+1,M+2,...,2\times M$,以此类推,第$ ...
- win7 注册删除postgresql服务
注册服务 删除服务 备注:都以管理员身份运行dos
- SeaJS基本开发原则
SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则.使用SeaJS开发JavaScript的基本原则就是:一切皆为模块.引入SeaJS后,编写JavaScr ...
- vue-methods方法与computed计算属性的差别
好吧,我就是单纯的举个例子:实现显示变量 message 的翻转字符串 第一种:methods:我们可以通过在表达式中调用方法来达到同样的效果: 第二种:computed:计算属性 上面的2中方法都实 ...
- vue登录注册实践
步骤一 1.安装脚手架:npm install vue-cli -g2.wepack生成html模版:vue init webpack ' 文件名'3.安装axios.js-cookie.elemen ...
- js 正则整理
//严格验证身份证格式方法function idCardNo(value){ //验证身份证号方法 var area = { 11: "北京", 12: "天津" ...