标准输入输出流 打印流 特殊操作流:(对象(反)序列化流) Properties

标准输入输出流

image.png

标准输入流

自己实现键盘录入数据

InputStream is = System.in;
//InputStream是字节输入流的抽象基类

//字节流读数据
int by;
while((by = is.read())!=-1){
    sout(char(by));
}
//读取数据来自键盘输入

//把字节流转换为字符流读数据 用转换流
InputStreamReader isr = new InputStreamReader(is);
//使用字符流一次读一行数据 可以 但是一次读取一行数据的方法是字符缓冲输入流的特有方法
BufferedReader br = new BufferedReader(isr); //字符流包装为字符缓冲输入流


//上面三个步骤可以用一个步骤实现
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));

String line = br.readLine();// 字符串

int i = Integer.parseInt(br.readLine());//字符串转换为整数

image.png
image.png
上面优化 自己实现键盘录入太麻烦了,Java提供了一个类供我们使用Scanner

Scanner sc = new Scanner(System.in);

image.png

标准输出流

PrintStream ps = System.out;
//能够方便的打印各种数值
ps.print("hello");
ps.println("hello");
//等同于
System.out.print("hello");
//System.out本质是一个字节输出流

image.png

打印流

字节打印流

image.png
image.png

//使用指定的文件名创建新的打印流
PrintStream ps = new PrintStream(fileName:"MyOtherStream\\ps.txt");
//写数据
//字节输出流有的方法
ps.write(b:97);/显示a 继承的方法
//使用特有方法写数据
ps.print(97); //显示97
//释放资源
ps.close();

image.png

字符打印流

image.png

//使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新
PrintWriter pw = new PrintWriter(fileName:"MyOtherStream\\pw.txt");//写数据
//字符输出流有的方法
pw.write(s:"hello");/不显示东西 因为是字符打印流,字符流的数据是不能直接到文件的,需要刷新一下
pw.write(s:"r\n");
pw.flush();
//使用特有方法写数据
pw.println("hello"); //只有自己也不显示
pw.flush();

//创建一个新的PrintWriter 可自动刷新 根据那个true做
PrintWriter pw = PrintWriter(new FileWriter(fileName:"MyOtherStream\\pw.txt"),autoFlush:true);
pw.println("hello"); //数据可以直接进来 true自动刷新  false不会自动刷新

//释放资源
ps.close();

image.png
image.png

案例 复制java文件 打印流改进版

image.png

//数据源创建字符输入流对象 字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader(fileName:"MyOtherStream\\PrintStreamDemo.java"));
//目的地创建字符输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName:"MyOtherStream\\Copy.java"));

//读写数据复制文件
//使用字符缓冲流特有功能实现
String line;
while((line = br.readLine())!=null){
    bw.write(line);//不包含换行符 所有数据都在同一行
    bw.newwLine();
    bw.flush();
}

//释放资源
bw.close();
br.close();
//上面三步可以用一步实现

//数据源创建字符输入流对象 字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader(fileName:"MyOtherStream\\PrintStreamDemo.java"));
//打印流只能写数据 不能读数据 
PrintWriter pw = PrintWriter(new FileWriter(fileName:"MyOtherStream\\Copy.java"),autoFlush:true);
//读写数据复制文件
//使用字符缓冲流特有功能实现
String line;
while((line = br.readLine())!=null){
    pw.println(line);
}
//释放资源
pw.close();
br.close();

特殊操作流

image.png

对象序列化流

就是将对象保存到磁盘中,或者再网络中传输对象
image.png

//创建对象序列化流的对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(name:"MyOtherStream\\oos.txt"));
//创建对象
Student s = new Student(name:"林青霞",age:30);
//将指定的对象写入ObjectOutputStream
oos.writeObject(s);
//释放资源
oos.close();

类要实现implements Serializable
image.png
image.png
序列化接口仅仅是一个标识接口,如果一个类实现了这个接口,这个类的对象可以被序列化和反序列化
image.png

对象反序列化流

image.png

//创建对象反序列化流的对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(name:"MyOtherStream\\oos.txt"));
//从ObjectInputStream读取一个对象
Object obj = ois.readObject();
//做一个向下转型
Student s = (Student) obj;
sout(s.getName()+","+s.getAge());
//释放资源
ois.close();

image.png

对象序列化流问题

重写toSring方法会报错
image.png
image.png
给定了一个固定的序列化ID值

private static final long SerialVersiousUID = 数字 

对象中的某个成员变量的值不想被序列化可以添加关键字transient

private transient int age; 

image.png

Properties

作为Map集合的特有方法

image.png
不能用泛型,类不是泛型类

//创建集合对象
Properties prop = new Properties();//这样不对
//应该如下
Properties prop = new Properties();
//存储元素
prop.put("itheima001","林青霞");
//遍历集合
set keySet = prop.keySet();//得到所有键的集合
for(Object key : keySet){
    Object value = prop.get(key);
    sout();
}

image.png

作为集合的特有方法

image.png

//创建集合对象
Properties prop = new Properties();
//设置集合的键盒值,都是String类型,底层调用Hashtable方法put
prop.setProperty("itheima001","林青霞");
//使用此属性列表中指定的键搜索属性
sout(prop.getProperty("itheima001"));//根据键得到对应的值
//从该属性列表中返回一个不可修改的键集,其中键对应的值是字符串
Set names = prop.stringPropertyNames();
for(String key :names){
    sout(key)//输出键
    String value = prop.getProperty(key);
    sout(key+value)//输出键和值
}

image.png

和IO流结合的方法

image.png

//把集合中的数据保存到文件
myStore();
//对应的方法
private static void myStore(){
    Properties prop = new Properties();
    prop.setProperty("itheima001","林青霞");
    //把集合中数据保存到文件
    FileWriter fw = new FileWriter(fileName:"MyOtherStream\\fw.txt");
    prop.store(fw,comments:null);
    //将属性列表的键和元素写入这个Properties表中,commenrts是一个描述信息 如果没有描述信息就是null
    
}


//文件中的数据加载到集合
myLoad();
//对应的方法
private static void myLoad(){
     Properties prop = new Properties();
     //将文件读取显示出来
      FileReader fr = new FileReader(fileName:"MyOtherStream\\fw.txt");
      prop.load(fr);//输入字符流读取属性列表
      fr.close();
      sout(prop);

案例 游戏次数

image.png
游戏类
image.png

//main方法
//从文件中读取数据到Properties集合,用load方法实现
Properties prop = new Properties();
FileReader fr = new FileReader(fileName:"MyOtherStream\\fw.txt");//调用文件
prop.load(fr);//输入字符流读取属性列表 把文件中的数据加载到集合中
fr.close();

//通过集合获取到玩游戏的次数
String count = prop.getProperty("count");//返回是一个字符串
//要转换为int类型
int number = Integer.parseInt(count);

//判断次数是否到三次了
if(number = 3){
    //如果到了给出提示,游戏已结束
    sout("游戏结束")
}else{
    //玩游戏
    GuessNumber.start();
    
    //次数+1 重新写回文件 用Properties的store()实现
    number++;
    prop.setProperty("count",String.valueOf(number));//文件中的数据要进行修改
    //修改后的数据重新写回文件
    FileWriter fw = new FileWriter(fileName:"MyOtherStream\\fw.txt");
    prop.store(fw,comments:null);
    fw.close();
}

你可能感兴趣的:(java)