您的位置:首页 > 职场人生

黑马程序员--转换流、打印流、序列化流、Properties类

2015-08-21 17:05 239 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------

转换流
1:标准的输入输出流
public static final InputStream in
System.in
--
InputStream (字节输出流) 底层是 BufferedInputStream

public static final PrintStream out
System.out
--
PrintStream (字节输入流)

注意:必须通过 标准输入流 才能从控制台录入数据
     必须通过 标准输出流 才能把数据写入控制台显示

2.字节输入流转成字符输入流

需求:想自己封装一个键盘录入数据,并存储到文本文件中

问题:如果实现键盘录入数据就必须通过标准输入流
     而标准输入流是字节流,如果用字节流,无法判断每一行的结束
     如果想一行一行的录入,就要用到BufferedReader的readLine方法
     因为BufferedReader需要的是一个字符流,而你现在有的确实一个字节流。
     这就需要字节流转字符流

方法:

字节流通向字符流的桥梁
InputStream -->  InputStreamReader   --> BufferedReader

代码:
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 封装目的地
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

String line = null;
while((line=br.readLine())!=null){
//只要是键盘录入,就的自己定义结束条件
if("over".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}

bw.close();
br.close();
理解:字符流读写数据的底层其实还是调用的字节流,只不过把字节流按照编码顺序排成了字符,
从而读出来的是字符
     所以说既然底层调用的是字节流,那么字节流通过InputStreamReader就可以转成字符流,
(其实就是把字节加入了一些编码顺序)
     所以说 万流之根源乃字节流,根源演变成了其他流,所以说 字节流可以转字符流,而反过
来就不可以

3:字节输出流转字符输出流

需求:把文本文件的数据通过标准输出流的方式显示在控制台。

问题:如果显示到控制台就必须使用 标准输出流,而标准输出流是字节输出流
     这个时候,往控制台写数据的时候,我们又的方式一次写一个字节,或者一次写一个字节数
组。
     但是,我们获取到的确实一个字符串数据。
     所以,我们就想能不能直接写一个字符串在控制台呢?
     使用字符缓冲流写出一个字符串。
     所以就需要把字节输出流转成字符输出流
方法:
OutputStream  -- >  OutputStreamWriter   -->  BufferedWriter

理解:这句话 "OutputStreamWriter 是字符流通向字节流的桥梁" 难理解,因为不知道为什么字
符流是字节流的桥梁,
     (按字节的流向,字符流读进来文字,按照字符流写入文件,底层还是调用字节流写入文件
的,所以是字符流通向字节流的桥梁)
     
4:编码问题
流的编码问题:
字符流=字节流+编码表

如果你想在IO流中使用指定编码下数据,用转换流。 
编码问题其实很简单,永远使用同一种编码即可。 
打印流

PrintStream:字节打印流
PrintWriter:字符打印流
打印流特点:
  A:可以写入任意类型的数据。
  B:可以自动刷新。必须先启动,并且是使用println,printf及format方法才有效。
  C:可以直接对文件进行写入。

注意:打印流只有写数据的,没有读取数据的。
构造方法:
  PrintWriter(String fileName) 

PrintWriter的print()可以写任意类型数据:
PrintWriter 自动刷新功能(必须开启了自动刷新 然后还得是调用println,printf及format方法,
才能自动刷新)。
PrintWriter pw = new PrintWriter(new FileWriter("d.txt"), true);
PrintWriter的println()能够自动换行。
案例:用打印流复制文本文件

// 封装数据源
BufferedReader br = new BufferedReader(new FileReader(
"PrintWriterDemo.java"));
// 封装目的地
PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);

String line = null;
while((line=br.readLine())!=null){
pw.println(line);
}

pw.close();
br.close();

注意:
  A:读取文件的时候,如果是文件夹,会出现:FileNotFoundException: test (拒绝访问。)
  B:写文件的时候,如果没有后缀名,它也会自动生成一个文件,而这个种类型的文件通过记事本类
  型的软件是可以打开的。
序列化流

序列化:把对象按照流一样的方式传输或者存储。
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
  void writeObject(Object obj)
反序列化:把网络中的流数据或者文件中的流数据还原成对象。
ObjectInputStream:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象
进行反序列化
 
Object readObject()
注意问题:
 如果类的对象想被序列化流操作,请实现序列化接口。
 
类通过实现 java.io.Serializable 接口以启用其序列化功能。
该接口被称为序列化接口,是一个标记接口。没有任何功能需要实现。
类一旦实现了该接口,那么,该类的对象就可以被序列化流进行操作。
Properties

Properties:是一个表示属性集的集合。可以从流中加载数据或者把数据保存到流中。键和值都是字符串。
       是唯一一个可以和IO流结合使用的集合类。
  
Properties的父亲是Hashtable,所以,我们知道它是一个Map体现的。那么,我们就存储数据并遍历。

Properties作为集合的特殊功能:
1:修改功能

public Object setProperty(String key,String value)
2:获取功能
public String getProperty(String key)
public String getProperty(String key,String defaultValue)
public Set<String> stringPropertyNames()

System类的一个方法:  public static Properties getProperties():系统属性

Properties作为和IO流结合使用的集合的特殊功能:

public void list(PrintStream out):把集合中的数据按照键值对的形式存储到文本文件中。
public void list(PrintWriter out):把集合中的数据按照键值对的形式存储到文本文件中。

public void load(InputStream inStream):从文本文件中把数据加载到集合中。
public void load(Reader reader):从文本文件中把数据加载到集合中。
注意:
对文本文件是有要求的,要求数据必须是键值对形式。

public void store(OutputStream out,String comments):把集合中的数据保存到文本文件中。
public void store(Writer writer,String comments):把集合中的数据保存到文本文件中。
注意:store和list方法的区别 list的参数值能是PrintWriter或PrintStream
而store的参数是PrintStream或者Writer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: