您的位置:首页 > 运维架构

day19 IO-2 包装流 标准输入输出流 打印流 Properties 对象流和序列化

2017-01-15 12:08 686 查看
文件流: 程序和文件做IO操作.

     FileInputStream

     FileOutputStream

     FileReader

     FileWriter

转换流: 把字节流转换为字符流.

     InputStreamReader

     OutputStreamWriter

内存流: 把数据先临时的缓存在内存中,(收集数据).先不讲.

     ByteArrayInputStream

     ByteArrayOutputStream

     CharArrayReader

     CharArrayWrier

-----------------------------------------------------

缓冲流:属于包装流,(内部提高了8Kb的缓冲区)

   包装流(缓冲流):使用该流对象的时候,需要包裹另一个流,来提高IO性能.

   节点流:没有使用其他包转流的流.

   在IO中存在一个装饰设计模式(包装设计模式),大神班讲非法文字过滤.

   装饰设计模式的目的:在不改变原有对象的基础之上,对原有对象做增强操作.

   BufferedInputStream: 字节输入流的缓冲流,专门用来包装InputStream的.

   BufferedOutputStream:                  ,专门用来包装 OutputStream的.

   BufferedReader:

   BufferedWriter:

字节包装流

package _01_Buffer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class BufferDemo {
public static void main(String[] args) throws Exception {
String src = "123.txt";
String dest = "456.txt";

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
int len = -1;
byte[] buffer = new byte[1024];
while((len=bis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
}

}
字符包装流以及readline()

package _01_Buffer;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class BufferReadLineDemo {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("123.txt"));
//读取一行,如果没有了则会返回null
//System.out.println(br.readLine());
char[] buffer = new char[1024];
int len= -1;
while((len=br.read(buffer)) != -1){
System.out.println(new String(buffer,0,len));
}
/*  readLine的使用
System.out.println("----------------------------------------");
String str = null;
while((str = br.readLine()) != null){
System.out.println(str);
}
*/
br.close();
}

}
标准输入输出流

标准的输入和输出流:System类有常量:

 标准输入流: 通过键盘录入的数据的方式.InputStream input  =System.in;//接受键盘录入的数据

 标准输出流: 在控制台输出结果的方式.   OutputStream output = System.out;//在控制台中输出数据

 标准输入流的重定向:

    标准输入流表示从键盘接受输入数据, 把接收的位置变成一个文件.

    System.setIn(...);

 标准输出流的重定向:

    标准输出流表示把数据输出在控制台中,我可以改变输出方向到一个文件中去.  

    System.setOut(...);

打印流

打印流: 令人最Happy的一点,可以输出任意的数据类型.

   PrintStream: 字节打印流.

   PrintWriter: 字符打印流.

package _02_printstream;

import java.io.PrintStream;
import java.io.PrintWriter;

public class Demo1 {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
PrintStream ps = new PrintStream("qixi.txt");
ps.write("传统的打印方式".getBytes());
//执行后会打印到文件qixi.txt
ps.print("新颖的方式");
System.out.println("----------------------------------------");
//下面是字符打印
PrintWriter pw = new PrintWriter("qixi2.txt");
pw.print("我是谁!!!");
//字符流必须关闭,不然没内容
pw.close();
}

}

package _02_printstream;

public class Demo2 {

/**
* @param args
*/
public static void main(String[] args) {
String name = "tt";
int age = 19;
System.out.printf("我是%s,今年%s", name,age);
}

}

Properties类

Hashtable类是Map的实现类,而Properties类又是Hashtable的子类.

---->Properties本身就是Map接口的实现类,体现着key-value.

然而我们一般称之为属性类.

我们把key称之为属性名,把value称之为属性值.

和Hashtable相比:

Hashtable中的key和value都可以是Object类型.

而在Properties类中所有的属性名和属性值都是String类型.

package _03_Properties;

import java.util.Properties;

public class Demo1 {

/**
* @param args
*/
public static void main(String[] args) {
Properties pro = new Properties();
pro.setProperty("name", "wqy");
String name = pro.getProperty("name");
System.out.println(name);
System.out.println(pro);
}

}

为什么需要使用配置文件--->为了避免硬编码:

所谓硬编码,可以简单的理解为在代码中把某一个或多个数据给写死了(若需要修改必须修改源代码).

比如:学习数据库,数据库有账号和密码,我们做开发就需要在Java中去连接数据库.

String username = "root";

String password = "admin";

...省略的代码....

此时若实施人员,需要修改密码,只能修改源代码.

解决方案:把这种写死的数据,提取到专门的配置文件中来,即使需要修改,只需要修改配置文件即可.

-------------------------------------------------------

在Java中:配置文件(XML/properties).

--------------------------------------------------------

文件名.properties文件,我们称之为属性文件,是Java中配置文件的一种.

属性名=属性值

package _03_Properties;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Properties;

public class DbProperties {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
InputStream in = new FileInputStream("db.properties");
pro.load(in);

String username = pro.getProperty("username");
System.out.println(username);
System.out.println(pro);
}

}
对象流和序列化

什么是序列化:

             把对象值的数据信息以二进制的格式保存起来.

反序列化:    把二进制的对象信息,恢复成对象.

为什么要做序列化:

             1):方便网络传输.

             2):把对象数据持久化在磁盘中.

序列化和对象流有何关系:

            为了方便把对象信息存储到磁盘,java的IO就提供了对象流,专门用来操作对象和二进制之间的转换操作.

            ObjectOutputStream: 把对象转换为二进制.

            ObejctInputStream:  把二进制数据读进程序,恢复成对象.

-----------------------------------------------------------------------------

怎么做序列化:

  注意:被对象流操作的对象,必须实现java.io.Serializable接口.

  实现java.io.Serializable接口的类中:

   若字段使用static,或者transient修饰,则不会被序列化.

   static:因为static表示类的成员,不是对象的成员.

   transient:限定某个字段不被序列化的,比如密码.

-----------------------------------------------------------------------------

为了检验对象和二进制文件中的数据的一致性,习惯生产出一个序列化ID.
这里有个User类是实现了Serializable接口的,提供了三个变量的有参构造器和无参构造器

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐