关于java:标准输入输出流-打印流-特殊操作流对象反序列化流-Properties

10次阅读

共计 4506 个字符,预计需要花费 12 分钟才能阅读完成。

规范输入输出流

规范输出流

本人实现键盘录入数据

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());// 字符串转换为整数



下面优化 本人实现键盘录入太麻烦了,Java 提供了一个类供咱们应用 Scanner

Scanner sc = new Scanner(System.in);

规范输入流

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

打印流

字节打印流


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

字符打印流

// 应用指定的文件名创立一个新的 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();


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

// 数据源创立字符输出流对象 字符缓冲输出流
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();

非凡操作流

对象序列化流

就是将对象保留到磁盘中,或者再网络中传输对象

// 创建对象序列化流的对象
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


序列化接口仅仅是一个标识接口,如果一个类实现了这个接口,这个类的对象能够被序列化和反序列化

对象反序列化流

// 创建对象反序列化流的对象
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();

对象序列化流问题

重写 toSring 办法会报错


给定了一个固定的序列化 ID 值

private static final long SerialVersiousUID = 数字 

对象中的某个成员变量的值不想被序列化能够增加关键字transient

private transient int age; 

Properties

作为 Map 汇合的特有办法


不能用泛型, 类不是泛型类

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

作为汇合的特有办法

// 创立汇合对象
Properties prop = new Properties();
// 设置汇合的键盒值,都是 String 类型,底层调用 Hashtable 办法 put
prop.setProperty("itheima001","林青霞");
// 应用此属性列表中指定的键搜寻属性
sout(prop.getProperty("itheima001"));// 依据键失去对应的值
// 从该属性列表中返回一个不可批改的键集,其中键对应的值是字符串
Set<String> names = prop.stringPropertyNames();
for(String key :names){sout(key)// 输入键
    String value = prop.getProperty(key);
    sout(key+value)// 输入键和值
}

和 IO 流联合的办法

// 把汇合中的数据保留到文件
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);

案例 游戏次数


游戏类

//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();}
正文完
 0