扬州网站建设icp备,泉州最专业手机网站建设哪家好,网站有源码之后怎么建设网站,网站基础模板6 特殊操作流
6.1 标注输入输出流
System类中有两个静态的成员变量#xff1a; public static final InputStream in#xff1a;标准输入流#xff0c;通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out#xff1a;标准输…6 特殊操作流
6.1 标注输入输出流
System类中有两个静态的成员变量 public static final InputStream in标准输入流通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out标准输出流通常该流对应于显示输出或由主机环境或用户指定的另一个输入源
package test;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class Demo {public static void main(String[] args) throws IOException {
/* //public static final InputStream in标准输入流InputStream is System.in;int by;while((byis.read()) ! -1) {System.out.print((char)by);}//如何把字节流转换为字符流InputStreamReader isr new InputStreamReader(is);//一次读一行是字符缓冲输入流的特有方法BufferedReader br new BufferedReader(isr);*/BufferedReader br new BufferedReader(new InputStreamReader(System.in));System.out.println(请输入一个字符串);String line br.readLine();System.out.println(你输入的字符串:line);br.close();}
}6.2 打印流
打印流分类 字节打印流PrintStream字符打印流PrintWriter 打印流特点 只负责输出数据不负责读取数据有自己特有方法 字节打印流 PrintStream(String fileName)使用指定的文件名创建新的打印流使用继承父类的方法写数据查看时会转码使用自己特有方法写数据查看的数据原样输出
package test;import java.io.*;public class Demo {public static void main(String[] args) throws IOException {//PrintStream(String fileName)使用指定的文件名创建新的打印流PrintStream ps new PrintStream(E:\\test\\java.txt);/*ps.print(1);ps.print(2);*///12没有换行ps.println(97);ps.println(87);//97//87ps.close();}
}字符打印流
方法名说明PrintWriter(String fileName)使用指定的文件名创建一个新的PrintWriter而不需要自动执行刷新PrintWriter(Writer out,boolean autoFlush)创建一个新的PrintWriterout字符输出流autoFlush一个布尔值如果为true则printlnprintf或format方法将刷新输出缓冲区
package test;import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class Demo {public static void main(String[] args) throws IOException {//1,PrintWriter(String fileName)
/* PrintWriter pw new PrintWriter(E:\\test\\java.txt);*//*pw.write(hello);pw.write(\r\n);pw.flush();pw.write(hello);pw.write(\r\n);pw.flush();*//**//*hellohello*//*pw.println(hello); //换行pw.flush();pw.println(hello);pw.flush();*///2,PrintWriter(Writer out,boolean autoFlush)PrintWriter pw new PrintWriter(new FileWriter(E:\\test\\java.txt,true));pw.println(hello);pw.println(hello); //构造方法自动刷新了pw.close();}
}6.3 对象序列化 对象序列化就是将对象保存到磁盘中或者在网络中传输对象 这种机制就是使用一个字节序列表示个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件之后相当于文件中持久保存了一个对象的信息 反之该字节序列还可以从文件中读取回来重构对象对它进行反序列化 要实现序列化和反序列化就要使用对象序列化流和对象反序列化流: 对象序列化流: ObjectOutputStream对象反序列化流: ObjectlnputStream
6.3.1 对象序列化流 对象序列化流ObjectOutputStream 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取 (重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流, 则可以在另一个主机上或另一个进程中重构对象 构造方法
方法名说明ObjectOutputStream(OutputStream out)创建一个写入指定的OutputStream的ObjectOutputStream
序列化对象的方法
方法名说明void writeObject(Object obj)将指定的对象写入ObjectOutputStream注意 一个对象要想被序列化该对象所属的类必须必须实现Serializable[ˈsɪərɪlaɪzbl]接口 Serializable是一个标记接口实现该接口不需要重写任何方法 范例 Student类
package test;import java.io.Serializable;
//NotSerializableException一个对象要想被序列化该对象所属的类必须必须实现Serializable接口
public class Student implements Serializable { private String name;private int age;public Student() { }public Student(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}
}测试类
package test;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class ObjectOutputStreamDemo {public static void main(String[] args) throws IOException {//ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStreamObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(E:\\test\\java.txt));//创建对象Student s new Student(小白,10);//void writeObject(Object obj) 将指定的对象写入ObjectOutputStreamoos.writeObject(s);oos.close();/* sr test.Student蝄8krq I ageL namet Ljava/lang/String;xpt 灏忕櫧*/}
}6.3.2 对象反序列化流
对象反序列化流ObjectInputStreamObjectInputStream反序列化前先使用ObjectOutputStream编写的原始数据和对象构造方法
方法名说明ObjectInputStream(InputStream in)创建从指定InputStream读取的ObjectInputStream
反序列化对象的方法
方法名说明Object readObject()从ObjectInputStream读取一个对象
范例
package test;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;public class Demo {public static void main(String[] args) throws IOException, ClassNotFoundException {//ObjectInputStream(InputStream in) 创建从指定InputStream读取的ObjectInputStreamObjectInputStream ois new ObjectInputStream(new FileInputStream(E:\\test\\java.txt));//Object readObject() 从ObjectInputStream读取一个对象Student s (Student) ois.readObject();;System.out.println(s.getName(),s.getAge()); //小白,10ois.close();}
}6.3.3 注意事项
1、用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件读取数据会不会出问题呢?
会出问题 抛出InvalidClassException异常
2、如果出问题了如何解决呢?
给对象所属的类加一 个serialVersionUIDprivate static final long serialVersionUID 42L;
3、如果一个对象中的某个成员变量的值不想被序列化又该如何实现呢?
给该成员变量加transient [ˈtrænziənt] 关键字修饰该关键字标记的成员变量不参与序列化过程private transient int age; age不会参加序列化
6.4 Properties
6.4.1 Properties [ˈprɒpətiz]作为Map集合使用
Properties概述是一个Map体系的集合Properties可以保存到流或者从流加载范例
package test;import javafx.beans.property.Property;import java.util.Properties;
import java.util.Set;public class Demo {public static void main(String[] args) {Properties prop new Properties();//存储元素prop.put(001,小黑);prop.put(002,小白);prop.put(003,小灰);SetObject keySet prop.keySet();for(Object key:keySet) {Object value prop.get(key);System.out.println(key,value);
// 003,小灰
// 002,小白
// 001,小黑}}
}6.4.2 Properties特有方法
方法名说明Object setProperty(String key, String value)设置集合的键和值都是String类型 底层调用Hashtable方法 putString getProperty(String key)使用此属性列表中指定的键搜索属性SetString stringPropertyNames()从该属性列表中返回一个不可修改的键集其中键及其应的值是字符串
范例
package test;import javafx.beans.property.Property;import java.util.Properties;
import java.util.Set;public class Demo {public static void main(String[] args) {Properties prop new Properties();//1Object setProperty(String key, String value) 设置集合的键和值都是String类型 底层调用Hashtable方法 putprop.setProperty(001,小黑);/*public synchronized Object setProperty(String key, String value) {return put(key, value);}*/prop.setProperty(002,小白);prop.setProperty(003,小灰);/2String getProperty(String key) 使用此属性列表中指定的键搜索属性System.out.println(prop.getProperty(003)); //小灰System.out.println(prop.getProperty(004)); //null//3SetString stringPropertyNames() 从该属性列表中返回一个不可修改的键集其中键及其应的值是字符串SetString names prop.stringPropertyNames();for(String key:names) {
// System.out.println(key);
// 003
// 002
// 001String value prop.getProperty(key);System.out.println(key,value);
// 003,小灰
// 002,小白
// 001,小黑}}
}6.4.3 Properties与IO流相结合方法
方法名说明void load(InputStream inStream)从输入字节流读取属性列表(键和元素对)void load(Reader reader)从输入字符流读取属性列表(键和元素对)void store(OutputStream out, String comments)将此属性列表(键和元素对)写入此Properties表中以适合于使用load(InputStream)方法的格式写入输出字节流void store(Writer writer, String comments)将此属性列表(键和元索对)写入此Properties表中以适合使用load(Reader)方法的格式写入输出字符流
范例
package test;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class Demo {public static void main(String[] args) throws IOException{//把集合中的数据保存到文件myStore();//把文件中的数据保存到集合myLood();}private static void myLood() throws IOException{Properties prop new Properties();FileReader fr new FileReader(E:\\test\\java.txt);//2,void load(Reader reader)prop.load(fr);fr.close();System.out.println(prop); //{003小灰, 002小白, 001小黑}}private static void myStore() throws IOException {Properties prop new Properties();prop.setProperty(001, 小黑);prop.setProperty(002, 小白);prop.setProperty(003, 小灰);//4,void store(Writer writer, String comments)FileWriter fw new FileWriter(E:\\test\\java.txt);prop.store(fw,null);fw.close();}
}