黑马程序员——IO流

  ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


1.打印流


java io.PrintSream


java io.PrintWriter


打印流的特点:打印流只操作数据目的,不操作数据源。打印流永远不会抛出io异常。


System.out 获取到打印流对象PrintSream
 
PrintStrean 构造方法,传递的是打印流的输出目的


File对象


字节输出流对象


字符串文件名


PrintWrtier类实现了PrintStream类的所有print方法,区别在于构造方法不同


File对象

字节输出流 


字符串文件名


字符输出流


/*
 * 打印流对象
 */
import java.io.*;
public class PrintWriterDemo {
public static void main(String[] args) throws IOException{

//直接转换流,字符流的缓冲区,实现键盘输入
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
//数据目的是一个文本文件,写文本文件FileWriter
//创建打印流对象,传递字符输出流
PrintWriter pw = new PrintWriter(new FileWriter("c:\\print.txt"),true);
String line = null;
while((line = bfr.readLine())!=null){
if("over".equals(line))break;
//读一行,将数据通过打印流,打印到目的文件中
pw.println(line);
}
pw.close();
bfr.close();
}
}
打印流中,实现换行输出,使用Print()方法。打印流自动刷新


打印流中,构造方法可以写boolean值,如果是true,开启自动刷新,但是开启自动刷新
打印流中传递的对象,必须是流对象才行。


new Printwriter(输出流对象,true)


必须调用Println,Printf,format三个方法,才能实现自动刷新


特点:简单,方便,自动刷新,不出异常,用在java的服务器端程序,可以把数据使用打印流写在客户端浏览器上
打印流案例:
使用打印流对象PrintWrtier,替代转换流,字符转成字节,


OutputStreamWriter,实现数据的打印功能,OutputStreamWriter(System.out)
代码:


/*
 * 打印流替换转换流,OutputStreamWriter
 */
import java.io.*;
public class PrintWriterDemo1 {
public static void main(String[] args)throws IOException {
BufferedReader bfr = new
BufferedReader(new InputStreamReader(System.in));
/*BufferedWriter bfw = new
BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:\\11.txt")));*/
//打印流,替换转换流
File file = new File("c:\\ffffff.txt");
PrintWriter pw = new PrintWriter(new FileWriter(file),true);

String line = null;
while((line = bfr.readLine())!=null){
if("over".equals(line))break;
    pw.println(line.toUpperCase());
}
pw.close();
bfr.close();
}
}
//PrintWriter类属于Writer的子类,字节流,只能操作文本数据,如果操作的不是文本数据,纯字节流


2. 对象的序列化:
序列化
将对象的数据保存到硬盘,ObjectOutputStream字节流


ObjectOutputStream构造方法中,传递一个字节输出流对象,字节输出流对象肯定封装一个文件,对象就会写进这个文件


  写对象的方法 void writeObject(Object obj)


反序列化
将硬盘中的对象数据读取出来 -- ObjectInputStream,字节流


ObjectInputStream构造方法中,传递一个字节输入流对象,字节输入流对象封装一个文件,读取封装的文件中的对象


读取对象的方法 Object readObject() 抛出IO异常,抛出类中不到异常


找不到类异常,肯能没有对应的class文件


  类必须实现java.io.Serializable接口,启用序列化功能
序列化和反序列化案例;
代码:


/*
 * 演示对象的序列化,反序列化
 */
import java.io.*;
public class ObjectStream {
public static void main(String[] args)throws Exception {
//writeObj();
readObj();
}
//ObjectInputStream读取一个对象,反序列化
private static void readObj()throws Exception{
//创建读取对象的流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:\\person.txt"));
//读取对象的方法readObject()
Object obj = ois.readObject();
System.out.println(obj);
}


//ObjectOutputStream写一个对象,序列化
private static void writeObj()throws IOException{


//创建写对象的流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:\\person.txt"));
Person p = new Person("lisi",18);
System.out.println(p);
//调用写对象的方法
oos.writeObject(p);
oos.close();
}
}
Serializable接口:
接口没有任何抽象方法,实现接口后,不需要重写方法。凡是以后我们在看到没有抽象方法接口,这样的接口,标记型接口。


java.io.InvalidClassException,序列号冲突。


产生原因:Person类,写好后,进行了对象的序列化,Person.clas,person.txt生产了,同样都存储了一个序列号。


可是我么将Person类的原始代码进行了修改,从新的编译,生成了一个新的Person.class文件。


记录的序列号,person.txt中,记录的序列号已经不一致了,我们又进行了反序列化,Person.class中的号person.txt中的序列号出现冲突问题。


序列号产生:public static 内存不认识,JVM也不认识,只认识10101,比如修饰符,名字,都一个数字进行表示,1000表示public 2000 private ,


序列号根据数字签名计算出来的程序修改了源代码后,并不会影响正常的使用,不影响对象序列化,编译是的时候,不从新计算序列号,


对于Person类,不从新计算序列号,自定义序列号。


static final long serialVersionUID = 自定义的long型数据


3.Properties IO结合
Properties是双列的集合 , Hashtable的子类,线程安全的


完全可以使用操作Map的方法和步骤,操作Properties类


Properties自己的特性:  getProperty()  setProperty()方法的参数定死为String


Properties如何与IO流结合使用


自己的方法load(字节输入流)   load(字符输入流) 


load将读取到到文件中的键值对,存储到 Properties集合中


IO和集合的关联,操作的文件,配置文件


应用程序运行的时候,读取配置文件,怎么配置的,程序就必须运行


配置文件中的书写都是死规定


将文本中的键值对,读取存储到集合load


将集合中的键值对,修改后,存储会文本文件 store(字节输出流,"") store(字符输出流,"")


集合有一个方法list(打印流对象)


  自己定义功能,实现集合中的load方法,两种重载形式
代码案例:


import java.util.*;
import java.io.*;
public class PropertiesDemo {
public static void main(String[] args) throws IOException{
method_2();
}
//集合中的list方法
private static void method_2()throws IOException{
Properties pro = new Properties();
FileReader fr = new FileReader("c:\\pro.txt");
pro.load(fr);
//创建打印流对象
PrintWriter pw = new PrintWriter(System.out);
//调用集合的list方法,传递打印流
   pro.list(pw);
   pw.close();
   fr.close();
}

//使用load方法,把文本中的键值对,存储到集合,修改集合,将修改后的键值对,store写回文本文件
private static void method_1()throws IOException{
Properties pro = new Properties();
FileReader fr = new FileReader("c:\\pro.txt");
pro.load(fr);
System.out.println(pro);
pro.setProperty("abc", "012");
pro.setProperty("def", "xixi");
System.out.println(pro);
//输出流
FileWriter fw = new FileWriter("c:\\pro.txt");
//集合的store方法
pro.store(fw, "");
fr.close();
fw.close();

}


//使用load方法,让集合和IO关联起来
private static void method()throws IOException{
Properties pro = new Properties();
FileReader fr = new FileReader("c:\\pro.txt");
pro.load(fr);
System.out.println(pro);
//只获取一个值 abc
String value = pro.getProperty("abc");
System.out.println(value);

pro.setProperty("name", "xiexie");
System.out.println(pro);
fr.close();
}
}
以上都是在传智学习的内容,只是把上课时的内容整理了下,如果有什么不对,请老师谅解!


没有学不好,只有不努力~~——至自己!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值