1.标准输入流
public class App
{
public static void main( String[] args ) throws IOException {
// //public static final InputStream in;标准输入流
// InputStream is = System.in;
// int by;
// while ((by=is.read())!=-1){
// System.out.println((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);
//自己实现键盘录入数据太麻烦,所以Java提供了一个类Scanner类
Scanner sc = new Scanner(System.in);
}
}
2.标准输出流
3.打印流
字节打印流
父类方法:write() 特有方法:print()、 println()
字符打印流
案例:复制java文件(打印流)
4.对象序列化流
public static void main( String[] args ) throws IOException {
//构造方法:ObjectOutputStream(OutputStream out)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Faker\\Desktop\\study\\testc.txt"));
Student s = new Student("林青霞",30);
//NotSerializableException:抛出一个实例需要一个Serializable接口。序列化运行时的实例和类可能会抛出此异常
oos.writeObject(s);
oos.close();
}
4.对象反序列化流
public static void main( String[] args ) throws IOException, ClassNotFoundException {
//构造方法:ObjectOutputStream(OutputStream out)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Faker\\Desktop\\study\\testc.txt"));
Object obj = ois.readObject();
Student s = (Student)obj;
System.out.println(s.getUsername()+","+s.getAge());
ois.close();
}
5.serialVersionUID&transient
1.用对象序列化序列化一个对象后,加入修改对象所属的类文件,读取数据会不会出现问题?
出现异常如下:
序列化运行时将每个可序列化的类与称为serialVersionUID的版本号相关联,该序列号在反序列化期间用于验证序列化对象的发送者
和接收者是否已加载与该序列化兼容的对象的类。 如果接收方加载了一个具有不同于相应发件人类的serialVersionUID的对象的类,则反序列
化将导致 InvalidClassException 。
2.如何解决?
一个可序列化的类可以通过声明一个名为"serialVersionUID"的字段来显式地声明它自己的serialVersionUID,该字段必须是静态的,
最终的,类型是long :
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据Java(TM)对象序列化规范中所述的类的各个方面计算该类的
默认serialVersionUID值。 但是, 强烈建议所有可序列化的类都明确声明serialVersionUID值,因为默认的serialVersionUID计算对
类详细信息非常敏感,这可能会因编译器实现而异,因此可能会在反InvalidClassException化期间导致InvalidClassException的
InvalidClassException。 因此,为了保证不同Java编译器实现之间的一致的serialVersionUID值,一个可序列化的类必须声明一个显式
的serialVersionUID值。 还强烈建议,显式的serialVersionUID声明在可能的情况下使用private修饰符,因为这种声明仅适用于立即声
明的类 - serialVersionUID字段作为继承成员无效。 数组类不能声明一个显式的serialVersionUID,所以它们总是具有默认的计算值,
但是对于数组类,放弃了匹配serialVersionUID值的要求。
给对象所属的类加一个private static final long serialVersionUID = 42L;
如:
3.如果一个对象中某个成员变量的值不想被序列化,又该如何实现呢?
用transient关键字修饰
总结
6.Properties
public class App
{
public static void main( String[] args ) throws IOException, ClassNotFoundException {
//创建集合对象
// Properties<String,String> prop = new Properties<String,String>(); //错误写法,Properties不能使用泛型
Properties prop = new Properties();
//存储元素
prop.put("itheima001","林青霞");
prop.put("itheima002","张曼玉");
prop.put("itheima003","王祖贤");
//遍历集合
Set<Object> keySet = prop.keySet();//得到prop键的集合
for (Object key:keySet){
Object value = prop.get(key);
System.out.println(key+","+value);
}
}
}
Properties作为集合的特有方法:
public class App
{
public static void main( String[] args ) throws IOException, ClassNotFoundException {
//创建集合对象
// Properties<String,String> prop = new Properties<String,String>(); //错误写法,Properties不能使用泛型
Properties prop = new Properties();
// setProperty
prop.setProperty("itheima001","林青霞");
prop.setProperty("itheima002","张曼玉");
prop.setProperty("itheima003","王祖贤");
System.out.println(prop.getProperty("itheima001"));
Set<String> set = prop.stringPropertyNames();
//遍历集合
for (String key:set){
System.out.println(key+","+prop.getProperty(key));
}
}
}
Propertiel和IO流相结合的方法:
public class App
{
public static void main( String[] args ) throws IOException, ClassNotFoundException {
//把集合中的数据保存到文件
myStore();
//把文件中的数据加载到集合
myload();
}
private static void myload() throws IOException {
Properties prop = new Properties();
FileReader fr = new FileReader("C:\\Users\\Faker\\Desktop\\study\\testc.txt");
prop.load(fr);
fr.close();
System.out.println(prop);
}
private static void myStore() throws IOException {
Properties prop = new Properties();
prop.setProperty("itheima001","林青霞");
prop.setProperty("itheima002","张曼玉");
prop.setProperty("itheima003","王祖贤");
//void store(Writer writer,String comments)
FileWriter fw = new FileWriter("C:\\Users\\Faker\\Desktop\\study\\testc.txt");
prop.store(fw,null);
fw.close();
}
}