IO(02)--属性集、缓冲流、转换流
属性集【Properties】
java.util.Properties类继承于Hashtable,用来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应的值都是一个字符串。
构造方法
- public Properties():创建一个空的属性集列表。
共性的api方法
- public Object setProperty(String key,String value):保存一对属性。
- public String getProperty(String key):使用此属性列表中的指定的键搜索对应的值。
- public Set stringPropertyNames():获取所有键的名称并封装到Set集合中。
public static void main(String[] args) {
// 创建属性集对象
Properties properties = new Properties();
// 添加键值对元素
properties.setProperty("name", "abc.txt");
properties.setProperty("size", "12000");
properties.setProperty("destination","D:\\abc.txt");
properties.put("data","小孙");
System.out.println(properties);// {destination=D:\abc.txt, name=abc.txt, size=12000}
// 通过键来获取值
String data = properties.getProperty("data");
System.out.println(data); // 小孙
String size = properties.getProperty("size");
System.out.println(size);// 12000
// 遍历该属性集
// public Set<String> stringPropertyNames():获取所有键的名称并封装到Set集合中。
Set<String> keys = properties.stringPropertyNames();
// 遍历keys
for (String key : keys) {
// 通过key获取value
String value = properties.getProperty(key);
System.out.println(key + "=" + value);
}
}
与流相关的方法
- public void load(InputStream input):从字节输入流中读取键值对
参数中使用了字节输入流,通过流对象,可以关联到某个文件上,这样既可以加载文件中的数据。文件中的数据的格式:key=value
例如:
data=小孙
size=12000
name=abc.txt
代码演示:
public static void show01() throws IOException {
// 0.构建一个流对象
FileReader fr = new FileReader("day29_IO\\abc.txt");
// 1.创建Properties集合
final Properties properties = new Properties();
// 2.使用Properties集合中的方法load读取保存在输入流中的数据
properties.load(fr);
// 3.遍历Properties集合
final Set<String> set = properties.stringPropertyNames();
for (String key : set) {
// 通过key获取value值
final String value = properties.getProperty(key);
System.out.println(key + "=" + value);
}
/*
name=abc.txt
size=12000
data=小孙
目的地=D:\abc.txt
*/
}
- public void store(OutputStream out,String comments):把集合当中数据写入字节输出流中
可以使用Properties集合当中的方法store,把集合当中的临时数据,持久化写入到硬盘文件中保存。
代码示例:
public static void show02() throws IOException {
// 1. 创建Properties集合对象,添加数据
final Properties properties = new Properties();
properties.setProperty("四大名著1","红楼梦");
properties.setProperty("四大名著2","西游记");
properties.setProperty("四大名著3", "水浒传");
properties.setProperty("四大名著4", "三国演义");
// 2. 创建字节输出流/字符输出流对象,构造方法中绑定需要写入数据的目的地
final FileWriter fw = new FileWriter("day29_IO\\abcd.txt", true);
// 3. 使用Properties集合中的方法store,把集合当中的临时数据,持久化写入到硬盘当中存储
properties.store(fw, "si da ming zhu");
// 4.释放资源。
fw.close();
}
缓冲流【Buffered】
缓冲流我们理解为对原来的使用数组方式进行数据传输的一种增强
按照类型分为:
- 字符缓冲流:BufferedReader,BufferedWriter
- 字节缓冲流:BufferedInputStream,BufferedOutputStream
缓冲流的基本原理,是在创建流对象的时候,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写数据,减少系统IO操作的次数,减少开销,提高程序的读写的效率。
字节缓冲流
构造方法
- public BufferedInputStream(InputStream input):创建一个新的缓冲输入流
- public BufferedOutputStream(OutputStream output):创建一个新的缓冲输出流
代码示例:
public class Demo02 {
public static void main(String[] args) throws IOException {
// 1.创建一个FileOutputStream流对象,构造方法中标的需要绑定写入数据的数据源
FileInputStream fis = new FileInputStream("day29_IO\\one.txt");
// 2.创建BufferedInputStream对象,构造方法中传递FileInputStream流对象
BufferedInputStream bis = new BufferedInputStream(fis);
//3.使用BufferedInputStream对象指定方法read,把数据读取到内存中
/*int len = 0;
while ((len=bis.read())!=-1){
System.out.println((char)len);
}*/
byte[]bytes = new byte[1024];
int len = 0;
while ((len=bis.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
//4.释放资源
bis.close();
}
}
字符缓冲流
构造方法
public BufferedWriter(Writer out):创建一个 新的字符缓冲输出流
public BufferedReader(Reader in):创建一个新的字符缓冲输入流。
特有方法:
BufferedReader: public String readLine():读取整行的文本信息
BufferedWriter: public void newLine():写入一行的行分隔符,由系统属性定义换行符号。
字符缓冲输入流代码演示:
public static void main(String[] args) throws IOException {
//1.创建一个字符缓冲输入流对象,构造方法中传入一个字符输入流
BufferedReader br = new BufferedReader(new FileReader("day29_IO\\abc.txt"));
//2.使用字符缓冲流对象中的read/readLine,
/* String str = br.readLine();
System.out.println(str);*/
//循环结束条件readLine()返回值是null的时候
String str = null;
while ((str=br.readLine())!=null){
System.out.println(str);
}
//3.释放资源。
br.close();
}
字符缓冲输出流代码演示:
public static void main(String[] args) throws IOException {
// 1.创建一个字符缓冲输出流对象,构造方法中传递一个字符输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("day29_IO\\two.txt"));
//2.调用字符流对象中的writer,把数据写入到内存存储区中
bw.write("我今天学习了PS,虽然没学会");
bw.newLine();
bw.write("3D软件mmd");
bw.newLine();
bw.write("c4d");
// 3.调用字符缓冲输出流对象的flush方法,把你想缓冲区的数据刷新到文件中
bw.flush();
//4.释放资源
bw.close();
}
练习:
public static void show02() throws IOException {
long start = System.currentTimeMillis();
//1.构建字节缓冲输入流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\0.jpg"));
//2.构建个字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\code\\java31\\day29_IO\\0.jpg"));
//3.用字节缓冲输入流对象中的方法read(byte[] b)读取文件
byte[]bytes = new byte[1024];
int len = 0;//记录读取到有效字节个数
while ((len = bis.read(bytes))!=-1){
//节内容再次写入到目的地文件中,调用write
bos.write(bytes,0,len);
}
bos.close();
bis.close();
long end= System.currentTimeMillis();
System.out.println("文件复制耗费的时间为:"+(end-start));
}
转换流【字节流<-->字符流】
字符编码:
按照某种规则将字符存储到计算机中,称为编码;反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。在进行编码或者解码的过程中,我们采用的是同一种规则,才能数据正常,否则,就会导致乱码现象。就是一套自然语言中的字符与二进制数直接的对应规则。字符集:
是一个系统可支持的所有字符的集合,包括各国文字,标点符号,图形符号,数字等,也叫编码表。
计算机中要准确的存储和识别各种文字的字符符号,需要进行字符编码,一套字符集至少有一套字符编码。
常见的字符编码集有ASCII字符集,GBK字符集、Unicode字符集。
ASCII字符集:
ASCII是基于拉丁字母的一套编码系统,用于显示现代英语。
基本的ASCII字符集,使用7位(bit)表示一个字符,共128个字符。ASCII的扩展字符集使用8位(bit)表示一个字符,共25
6个字符。
ISO—8859-1字符集
拉丁码表,别名--Lanlin-1,用于显示欧洲使用的语言,包括荷兰,丹麦,德语,意大利语,西班牙语等。
ISO-8859-1使用单字节编码,兼容ASCII编码。
GB系列符集
CB2312:称为简体中文码表里面大概含有7000多个简体汉字,此外数字符号。罗马希腊的字母,日本的假名都编进去了,连在ASCII里的原来就有的数字、标点、字母都统统重新用两个字节编写进去了。
GBK:最常用的中文码表。是在原来的GB2312码表基础上进行了扩展。也是使用双字节编码。共收录了21000多个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
GB18030:最新的中文码表,共收录了7万多个汉字,采用多字节编码,每个字可以由1个字节、2个字节或者是4个字节组成,支持国内少数民族的文字。同时也支持繁体字以及日韩汉字等。
Unicode字符集:
Unicode编码系统为表达任意语言的任意字符而设计的,是业界的一种标准,也称为统一编码,标准万国码表
它最多使用4个字节的数字来表示某个字母、符号、汉字文字,有三种常见的编码方案:UTF-8,UTF-6,UTF-32.
UTF-8编码表,用来表示Unicode标准中的任意字符,编码规则:
1.128个US-ASCII字符,使用的是一个字节编码
2.拉丁字的字母,需要两个字节编码
3.大部分常见的汉字,使用的是三个字节编码
4.其他极少数的辅助字符,采用的四个字节编码。
编码会引发的问题
由于编码规则不一致,导致引发乱码现象。
那么如何读取GBK编码的文件呢?
InputStreamReader类
转换流 java.io.InputStreamReader 是Reader的子类,它是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,或者可以使用平台默认的字符集。
构造方法
public InputStreamReader(InputStream in):创建一个使用默认的字符集的字符流。
public InputStreamReader(InputStream in,String charseName):创建一个指定字符集的字符流
代码演示:
public static void show01() throws IOException {
//1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
InputStreamReader isr = new InputStreamReader(new FileInputStream("day29_IO\\新建文本文档.txt"), "GBK");
//2.使用InputStreamReader对象中的方法read读取文件中的信息
int len = 0;
while ((len=isr.read())!=-1) {
System.out.println((char)len);
}
//3.释放资源。
isr.close();
}
OutStreamWriter类
转换流java.io.OtputSreamWiter是Writer的子类,它是字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以手动指定,也可以使用平台默认的字符集。
构造方法:
public OutputStreamWriter(OutputStream out): 创建一个使用普通默认的字符集的字符流。
public OutputStreamWriter(OutputStream out,String charseName):创建一个指定的字符集字符流。
IO(02)--属性集、缓冲流、转换流的更多相关文章
- Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)
IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...
- IO异常--缓冲流--转换流--序列化流( IO流2 )
1.IO异常的处理 JDK7前处理:使用try...catch...finally 代码块,处理异常部分 // 声明变量 FileWriter fw = null; try { //创建流对象 fw ...
- Java 基础 IO流(转换流,缓冲)
一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStr ...
- IO流----转换流、缓冲流
打开一个文本文件,另存为: Ansi就是系统默认编码(就是gbk) 建一个编码是utf-8的txt文件, 例: import java.io.FileWriter; import java.io.IO ...
- IO流——转换流、缓冲流
一.转换流 1. OutputStreamWriter类 属于字符输出流,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节. 它的作 ...
- Java IO学习笔记(三)转换流、数据流、字节数组流
转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...
- Java IO 流 -- 转换流: InputStreamReader OutputStreamWriter
java 中 转换流是以字符流的形式操作字节流,需要注意一下两点: 1.操作内容必须是纯文本 2.指定字符集避免乱码 操作控制台输入输出: try (BufferedReader br = new B ...
- IO流(File类--递归--过滤器--IO字节流--IO字符流--Properties集合--缓冲流--转换流--序列化流--打印流)
一.File类 1.1概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.1.1相对路径与绝对路径 相对路径从盘符开始的路径,这是一个完整 ...
- Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)
1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...
随机推荐
- nginx 负载均衡设置
upstream lucky5{ server 127.0.0.1:3000 weight=10; server 127.0.0.1:3001 weight=5; } server{ location ...
- CTF-Web-强网杯 2019-随便注
题目链接 题目链接-supersqli FUZZ测试 fuzz出,order by测出数据库查询列数2列,注释符号#,select|update|delete|drop|insert|where|被过 ...
- NO.A.0002——Git简史及安装教程/创建本地仓库/提交项目到本地仓库/误删还原
一.Git简史及同类产品对比: 1.git简史: 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linu ...
- 如何用pdfFactory新建打印机并设置属性
今天我们来讲一讲,在pdfFactory中如何去修改PDF文件打印页面的页边距.页面大小.页面清晰度等属性参数. pdfFactory是一款Windows平台上的虚拟打印机,在没有打印机可以安装的情况 ...
- Echo Delay:FL中好用的声音制作处理方法
今天来一起研究FL Studio的Echo Delay的作用,Echo Delay可以从MIDI输入创建回声,并允许我们通过音量,声像,切除和共振,音高和时间来操纵延迟. 图1:Echo Dealy ...
- 为什么企业需要CRM系统?CRM的作用及其重要性分析
客户管理系统(CRM)是企业核心应用软件之一,对于提高企业业绩起着至关重要的作用,现在很多企业都在客户发展方面投入大量的资金,以求获得更好的回报. 关于CRM CRM是一个客户数据中心,在CRM中,你 ...
- recovery.sh
#!/bin/bash source /etc/profile Time=`date +%F-%H-%M` Dir=/data/any.service.recovery if [ ! -d $Dir ...
- python画猫并打包成EXE文件
因python自带有海龟画图库,尝试给爱猫的小仙女来画个猫咪. 1.代码如下 from turtle import * #两个函数用于画心 def curvemove(): for i in rang ...
- 知识点:C语言进阶提高篇,自定义数据类型:枚举
一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型.比如,你可以用一个枚举类型的变量来表示季节,因 ...
- sentinel配置
登陆接口 QPS5,异常0.8,熔断10s 1.异地登陆同省逻辑降级security 2.可疑用户判断certification 3.是否是危险设备判断account 4.是否是自动化imei,ime ...