Java基础语法 day12

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值