Java学习笔记33——特殊操作流

特殊操作流

特殊操作流

标准输入输出流

System类中有;两个静态的成员变量

  • public static final InputStream in:标准输入流。通常该流对应于键盘输入或者主机环境或者用户指定的一个另一个输入源
  • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标。

打印流

只负责输出数据,不负责读数据

字节打印流

PrintStream

使用继承父类的write 写数据,查看时会自动转码,使用特有方法(print和println)则不会

字符打印流

PrintWriter

方法名 说明
PrintWriter(String fileName) 使用指定的文件名创建一个新的PrintWriter,而不会自动执行刷新
PrintWriter(Writer out, boolean autoFlush) 创建一个新的PrintWriter out:字符输出流 autoFlush:一个布尔值,为真则print、println或format方法将自动刷新缓冲区

用字符打印流改进复制Java文件

java 复制代码
public class PrintStreamDemo {
    public static void main(String[] args) throws IOException {
        /*
        BufferedReader br=new BufferedReader(new FileReader("test.java"));
        BufferedWriter bw=new BufferedWriter(new FileWriter("copy05.java"));
        String line;
        while((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();
        */
        //打印流只能写不能读
        BufferedReader br=new BufferedReader(new FileReader("test.java"));
        PrintWriter pw=new PrintWriter(new FileWriter("copy06.java"),true);
        String line;
        while((line=br.readLine())!=null){
            pw.println(line);
        }
        br.close();
        pw.close();

    }
}

对象序列化流

对象序列化 :指的是将对象保存到磁盘中,或者在网络中传输对象。这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件后,相当于在文件中持久保存一个对象的信息。
该字节序列还可以从文件中读取回来,重构对象,进行反序列化

对象序列化流

ObjectOutputStream
将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流,则可以在另一个主机或者进程中重构对象

  • 构造方法

    ObjectOutputStream(Outputstream out):创建一个写入指定的OutputStream的ObjectOutputStream

  • 序列化对象的方法

    void writeObject(Object obj):将指定的对象写入ObjectOutputStream

对象序列化

java 复制代码
public class ObjectOutputStreamDemo  {
    public static void main(String[] args) throws IOException{
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("src\\com\\itheima02\\oos.txt"));
        //创建对象
        Student s=new Student("杨天伦",24);
        /*
            需要实现Serializable接口不然无法序列化和反序列化
            标识接口不需要重写方法
         */
        //写入文件
        oos.writeObject(s);
        oos.close();
    }

}

注意!!!

  • ---个对象要想被序列化,该对象所属的类必须必须实现Serializable接口
  • Serializable是个标记接口,实现该接口,不需要重写任何方法

对象反序列化流

ObjectInputStream

  • ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数居和对象

  • 构造方法

    ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectlnputStream

  • 反序列化方法

    Object readObject(): 从ObjectlnputStream读取一个对象

java 复制代码
public class ObjectInputStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\com\\itheima02\\oos.txt"));
        Object obj = ois.readObject();
        Student s = (Student) obj;
        System.out.println(s.getName()+","+s.getAge());
        ois.close();
    }

}

对象序列化流的三个问题

  1. 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
    会出问题。抛出 InvalidClassException
  2. 如果出问题了,如何解决呢?
    显式声明序列化id值,对象所属的类加 private static final long serialVersionUID
  3. 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
    给成员变量加上关键字 transicent
    transicent修饰的关键字不参与序列化。会赋上默认值。

Properties

Properties作为Map集合的使用

java 复制代码
public class PropertiesDemo {
    public static void main(String[] args){
        Properties prop=new Properties();
        prop.put("001","杨天伦");//没泛型,默认是Object类型的
        prop.put("002","李昊");
        prop.put("003","朱长坤");
        Set<Object> keySet=prop.keySet();
        for (Object key:keySet) {
            Object value = prop.get(key);
            System.out.println(key+","+value);
        }
    }
}

Properties作为集合的特有方法

方法名 说明
Object setProperty(String key,String value) 设置集合的键和值,都是String类型,底层调用Hashtable方法put
String getPorperty(String key) 使用此属性列表中的指定的键搜索属性
Set stringPorpertyNames() 从该属性列表返回一个不可修改的键集,其中键及其对应的值都是字符串
java 复制代码
public class PropertiesDemo {
    public static void main(String[] args){
        Properties prop=new Properties();
        prop.setProperty("001","杨天伦");
        prop.setProperty("002","李昊");
        prop.setProperty("003","朱长坤");
        System.out.println(prop.getProperty("0011"));
        System.out.println(prop);
        Set<String> names=prop.stringPropertyNames();
        System.out.println(names);
        for (String key:names) {
            System.out.println(prop.getProperty(key));
        }
        
    }
}

Properties和IO流结合的方法

方法名 说明
void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)
void load(Reader reader) 从输入字符流读取属性列表(键和元素对)
void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(lnputStream)方法的格式写入输出字节流
void store(Writer writer,String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适:使用load(Reader)方法的格式写入输出字符流
java 复制代码
public class PropertiesDemo {
    public static void main(String[] args) throws IOException {

        myStore();
        myLoad();
    }

    private static void myLoad() throws IOException {
        Properties prop=new Properties();
        FileReader fr=new FileReader("src\\com\\itheima02\\fw.txt");
        prop.load(fr);
        fr.close();
        System.out.println(prop);
    }

    public static void myStore() throws IOException {
        Properties prop=new Properties();
        prop.setProperty("001","杨天伦");
        prop.setProperty("002","李昊");
        prop.setProperty("003","朱长坤");

        FileWriter fw=new FileWriter("src\\com\\itheima02\\fw.txt");
        prop.store(fw,null);
        fw.close();
    }
}
相关推荐
Jinkxs12 分钟前
Java 架构 02:DDD 领域模型设计实战(限界上下文划分)
java·开发语言·架构
百锦再15 分钟前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
走在路上的菜鸟18 分钟前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
爱笑的眼睛1123 分钟前
文本分类的范式演进:从统计概率到语言模型提示工程
java·人工智能·python·ai
周杰伦_Jay36 分钟前
【Go/Python/Java】基础语法+核心特性对比
java·python·golang
sszdlbw38 分钟前
后端springboot框架入门学习--第一篇
java·spring boot·学习
小鹿学程序41 分钟前
jdk配置完之后java -version还是默认的jdk版本如何更改
java·开发语言·python
她说彩礼65万44 分钟前
C# 反射
java·算法·c#
秋深枫叶红1 小时前
嵌入式第三十五篇——linux系统编程——exec族函数
linux·前端·学习
hhy_smile1 小时前
Android 与 java 设计笔记
android·java·笔记