Java之高级IO,Properties
IO流(高级)
释放资源的标准代码
主要考虑的是在什么时候释放资源比较合适.而且在jdk1.7之前和之后是不同的.
package com.wzlove.demo;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 标准的IO格式处理
*
* @author WZLOVE
* @create 2018-07-23 9:54
*/
public class StandardIO {
// jdk7之前
public static void main(String[] args) {
// 初始赋值为null
FileReader fr = null;
FileWriter fw = null;
try {
// 创建字符流对象
fr = new FileReader("student.txt");
fw = new FileWriter("student.txt");
// 操作资源(边读编写,耗资源,仅作为示例)
int len;
while((len = fr.read()) != -1){
fw.write((char) len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判断输入流是否为null
if(fr != null){
// 关闭资源
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判断输入流是否为null
if(fw != null) {
// 关闭资源
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// jdk7之后
/**
* try(创建IO流对象的代码){
* 其他代码
* }catch(可能出现的异常){
* 打印异常信息
* }
* 上面的代码会自动调用close方法(也就是IO流对象都实现了Closeable接口(Closeable实现了AutoCloseable接口),
* 重写close方法).有兴趣的可以查看源码
*/
public static void main(String[] args) {
try (
// 创建字符流对象
FileReader fr = new FileReader("student.txt");
FileWriter fw = new FileWriter("student.txt");
){
// 操作资源(边读编写,耗资源,仅作为示例)
int len;
while((len = fr.read()) != -1){
fw.write((char) len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Properties
是Map下的一个子类(意味着map有的它都有).该类的key和value的类型都是String类型,
开发中Properties使用会结合IO流对文件进行操作,
特殊的方法:
- String getProperties(String key): 根据键获取对应的值
- Object setProperties(String key,String value): 给集合中添加键值对映射关系,返回值是被替换的值.
将Properties对象中的数据进行持久化保存(写数据到文件中):
- void store(OutputStream out, String comments):使用字节流将Properties对象中的内容写入到指定文件,
comments的意思是对文件的数据进行说明 - void store(Writer writer, String comments):使用字符流将Properties对象中的内容写入到指定文件,
comments的意思是对文件的数据进行说明
从文件中获取数据到Properties集合中
void load(InputStream inStream) : 将文件中的内容以字节流的方式写入到Properties的对象中.
void load(Reader reader) : 将文件中的内容以字符流的方式写入到Properties的对象中.
public static void main(String[] args) throws IOException {
// 创建属性集对象
Properties p = new Properties();
// 添加数据
/*p.put("001","迪丽热巴");
p.put("002","郑爽");
p.put("003","杨紫");*/
// 调用方法,写入文件
// p.store(new FileWriter("a.properties"),"测试文件"); // p.store(new FileWriter("a.txt"),"测试文件");
//p.store(new FileOutputStream("b.properties"),"测试文件"); // 调用方法,读取文件
/*p.load(new FileReader("a.properties"));
// map的子类,遍历的方法和map一样
Set<Map.Entry<Object, Object>> entries = p.entrySet();
for (Map.Entry<Object, Object> entry : entries) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}*/ p.load(new FileInputStream("b.properties"));
// map的子类,遍历的方法和map一样
Set<Map.Entry<Object, Object>> entries = p.entrySet();
Iterator<Map.Entry<Object, Object>> iterator = entries.iterator();
while(iterator.hasNext()){
Map.Entry<Object, Object> map = iterator.next();
System.out.println(map.getKey() + "=" + map.getValue()); } }
高效流
- 高效字节流:
- 高效字节输入流(BufferedInputStream)
- 高效字节输出流(BufferedOutStream)
- 高效字符流:
- 高效字符输入流(BufferedReader)
- 高效字符输出流(BufferedWriter)
高效字节流
构造方法:
- public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
- public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
常用方法:
方法与普通字节流的方法没有区别.下面用个例子测试一下两个的效率,文件大小是七十几兆
public static void main(String[] args) throws IOException {
// bufferedCopy();
byteCopy();
}
public static void bufferedCopy() throws IOException {
long startTime = System.currentTimeMillis();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\desktop\\Desktop\day09\\day09\\avi\\01-今日内容.itcast"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("abc.avi"));
int len;
while((len = bis.read()) != -1){
bos.write(len);
}
bos.close();
bis.close();
System.out.println(System.currentTimeMillis() - startTime); // 3171
}
public static void byteCopy() throws IOException {
long startTime = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("F:\\desktop\\Desktop\\day09\\day09\\avi\\01-今日内容.itcast");
FileOutputStream fos = new FileOutputStream("bcd.avi");
int len;
while((len = fis.read()) != -1){
fos.write(len);
}
fis.close();
fos.close();
System.out.println(System.currentTimeMillis() - startTime); // 297409
}
字符高效流
构造方法:
- public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
- public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
常用方法(父类有的它都有):
void newLine() : (高效输出字符流的方法)写出一个换行符,跨平台.
String readLine() : 读取一行数据(结束标志为null)
package com.wzlove.buffered;
import java.io.*;
import java.util.Scanner;/**
测试高效字符流
@author WZLOVE
@create 2018-07-23 15:32
*/
public class Demo1 {public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("c.txt"));
Scanner in = new Scanner(System.in);
String str;
while(true){
System.out.println("请输入您想要的内容:");
str = in.nextLine();
if(str.equals("ends")){
break;
}
bw.write(str);
bw.newLine();
}
bw.flush();
bw.close();System.out.println("您输入的内容是:");
BufferedReader br = new BufferedReader(new FileReader("c.txt"));
String str2;
while((str2 = br.readLine()) != null){
System.out.println(str2);
}
br.close();
}
}
转换流(字符流)
- InputStreamReader
- 构造方法
- InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
- InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。
- 常用方法
- int read() 读一个字符
- void close() 关闭流并释放与之相关联的任何系统资源。
- 构造方法
- OutputStreamWriter
- 构造方法
- OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
- OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。
- 常用方法:
- void close() 关闭流,先刷新。
- void flush() 刷新流。
- void write(int c) 写一个字符
- void write(String str) 写一个字符串
- 构造方法
什么时候使用?如果需要以指定的字符集进行数据的读写操作.
package com.wzlove.demo1;
import java.io.*;
import java.util.Scanner;
/**
* 测试转换流
* @author WZLOVE
* @create 2018-07-23 18:20
*/
public class Demo {
public static void main(String[] args) throws IOException {
// 创建高效输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d.txt"),"GBK"));
// 写入数据
Scanner in = new Scanner(System.in);
while(true){
System.out.println("请输出内容");
String str = in.nextLine();
if(str.equals("ends")){
break;
}
bw.write(str);
bw.newLine();
}
in.close();
// 关闭流
bw.flush();
bw.close();
// 创建高效输入流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("d.txt"),"GBK"));
String str;
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
}
}
回忆学过的IO流:
字节:
InputStream
|-- FileInputStream : 输入字节流
|-- FilterInputStream (不用管,没学)
|-- BufferedInputStream : 高效缓冲输入字节流
|-- ObjectInputStream : 对象输入字节流(反序列化流)
OutputStream
|-- FileOutputStream : 输出字符流
|-- FilterOutputStream (不用管,没学)
|-- BufferedOutputStream : 高效缓冲输出字节流
|-- ObjectOutputStream : 对象输出字节流(序列化流)
|-- PrintStream : 打印字节流
字符:
Reader
|-- BufferedReader : 高效缓冲字符输入流(读取字符串的时候使用,注意readLine读取一行数据,但不会读取换行符)
|-- InputStreamReader : 转换流,将字节流转化为字符流
|-- FileReader : 字符输入流
Writer
|-- BufferedWriter : 高效缓冲字符输出流(newLine方法是换行)
|-- OutputStreamWriter : 转换流,将字符流转化为字节流
|-- FileWriter : 字符输出流
|-- PrintWriter : 打印字符流(方便使用,自动刷新和自动换行)
转换流的使用场景:
- 读取数据需要指定字符编码集或者就是本身的意义,将字节流转化为字符流
- 写出数据需要指定字符编码集
注意字节流和字符流的使用场景- 对于文件的拷贝使用字节流
- 文本文件的数据的读取的话,使用字符流
- 文本文件的数据的写出的话,字符流和字节流都可以
Java之高级IO,Properties的更多相关文章
- Java IO(Properties/对象序列化/打印流/commons-io)
Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...
- java学习一目了然——IO
java学习一目了然--IO IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件.数据库等读取到内存中所 ...
- Java中的IO流(五)
上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...
- Java中的IO流(四)
上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...
- Java基础之IO和NIO补完
Java Stream,File,IO 关于NIO和IO的比较,参考:Java NIO系列教程(十二) Java NIO与IO java包之java.io 参考材料:菜鸟教材 NIO 由于下面的系列教 ...
- Java学习之==>IO文件操作体系
一.概述 在整个 Java.io 中最重要的就是5个类和一个接口.5个类指的是 File.InputStream.OutputStream.Reader.Writer,一个接口指的是Serializa ...
- Day14_85_通过反射机制修改Class的属性值(IO+Properties)动态修改
通过反射机制修改Class的属性值(IO+Properties)动态修改 import java.io.FileInputStream; import java.io.FileNotFoundExce ...
- src/main/Java路径下的properties文件丢失
在pom中加入代码: <build> <resources> <resource> <directory>src/main/java</direc ...
- java nio 与io区别
转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...
随机推荐
- 新手Python第一天(接触)
Python 变量 Python的变量由字母,数字,下划线组成不包含特殊字符,不能以数字开头 可以使用的名称 例如:name,name2,my_name 不可使用的名称 例如:if...(Python ...
- Yii2 创建新项目目录
默认的高级应用模板包括三个应用 backend – 应用的后台 frontend – 应用的前台 console – 应用的控制台应用 那么如果我们要在增加应用呢?比如在加一个手机端的应用,或者后台和 ...
- 使用OpenCV通过摄像头捕获实时视频并探测人脸
在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...
- sqlplus远程连接oracle
格式: sqlplus 用户名/密码@192.168.19.189:1521/MYTEST MYTEST 数据库名称
- PSP Daily软件beta版本——基于NABCD评论,及改进建议
1.根据(不限于)NABCD评论作品的选题: 此软件的用户人群较为明确,即:用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜在用户还有未来该课堂的学生和需要用PSP方法记录任务完 ...
- Scrum Meeting 11.08
成员 今日任务 明日计划 用时 徐越 赵庶宏 薄霖 卞忠昊 WebView和JavaScript交互基础 Bitmap(位图)全解析 Part1 3h 武鑫 设计 ...
- OO第一阶段作业总结
对于OO这门课,学长学姐偶尔提起,大家都略有耳闻,但是并没有将其和计组相提并论.因此,在刚开始接触的时候,并不认为其会比计组难到哪里去,然而事实证明,还是不要想当然去判断,以及不提前学好JAVA对于O ...
- Sprint10
进展:设置事件提醒部分已经完成,接下来是实现完成后在添加主界面显示已添加的事件及时间,并可设置可用与不可用.
- 调研ANDRIOD平台的开发环境的发展演变
在同学的推荐下,我选用学习eclipse这个软件,参考了这个网址的教程开始了一步一步的搭建之路. http://jingyan.baidu.com/article/bea41d437a41b6b4c5 ...
- DFS--障碍在指定时间会消失
哈利被困在了一个魔法花园里.魔法花园是一个 N*M 的矩形,在其中有着许多植物, 这些植物会在时刻 K 的倍数消失. 哈利每单位时间都会选择上.下.左.右四 个方向的其中一个进行移动. #includ ...