day17-缓冲流&转换流&序列化流&打印流&Properties(三)

简介: day17-缓冲流&转换流&序列化流&打印流&Properties

day17-缓冲流&转换流&序列化流&打印流&Properties(二)https://developer.aliyun.com/article/1433718


打印流

平时我们在控制台打印输出,是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

打印流的分类

名称 类名
字节打印流 PrintStream
字符打印流 PrintWriter

打印流的特点

- 只负责输出数据,不负责读取数据
- 永远不会抛出IOException
- 有自己的特有方法

PrintWriter特点

* 自动换行 println()
* 不能输出字节 可以输出字节以外的内容
* 必须是通过配置 自动刷新 (println,printf,format)
  boolean autoFlush: true 自动刷新 false,不自动刷新
* 包装流本身没有写出功能
* 将字节输出流转换字符输出流

PrintWriter构造方法

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

PrintWriter特有方法

方法名 说明
void write(String s) 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新
void print(String s) 输出字符串, 没有换行
void println(String s) 输出字符串并换行. 如果启动了自动刷新, 则会执行自动刷新写入数据
void printf(Locale l, String format, Object… args) 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据
void format(Locale l, String format, Object… args) 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据

字符打印流特点

/*
 * 打印流
 * 字节打印流   PrintStream
 * 字符打印流   PrintWriter
 *
 * 打印流的特点:
 *        A:只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
 *        B:可以操作任意类型的数据。
 *        C:如果启动了自动刷新,能够自动刷新。
 *        D:该流是可以直接操作文本文件的。
 *           哪些流对象是可以直接操作文本文件的呢?
 *           FileInputStream
 *           FileOutputStream
 *           FileReader
 *           FileWriter
 *           PrintStream
 *           PrintWriter
 *           看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的。
 *
 */
public static void main(String[] args) throws IOException {
    //字符打印流对象
    PrintWriter pw = new PrintWriter("pw.txt");
    //A:只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
    pw.write("hello");
    pw.write("world");
    pw.write("java");
    //为什么没有写进去呢?
    //字符流并不会像字节流一样直接操作数据,字符流会先存入缓存区中,并没有直接写入文本中,需要刷新
    //close相当于启动了自动刷新,能够自动刷新
    pw.close();
}
字符 打印流自动刷新
/*
 * 1:可以操作任意类型的数据。
 *        print()
 *        println()
 * 2:启动自动刷新: PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
 *    调用println()才可以自动刷新
  其实等价于于:
 *            bw.write();
 *            bw.newLine();
 *            bw.flush();
 */
public static void main(String[] args) throws IOException {
    // 创建打印流对象,启动自动刷新:PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
    PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
    //可以操作任意类型的数据。
  // print()这个方法不会自动刷新
    pw.print(true);
    pw.print(100);
    pw.print("hello");
    pw.close();
    // 创建打印流对象
    PrintWriter pw2 = new PrintWriter(new FileWriter("pw3.txt"), true);
    //println() 这个方法不仅仅自动刷新了,还实现了数据的换行。
    pw2.println("world");
    pw2.println(false);
    pw2.println(200);
    //pw2.close();
}

字节打印流

public static void main(String[] args) throws IOException {
        //创建字节打印流对象
        PrintStream ps = new PrintStream(new FileOutputStream("c.txt"));//c.txt位于项目根目录
        ps.write(97);
        ps.write("hello".getBytes());
        ps.print("hello");
        ps.print(1314);
        ps.print(true);
        ps.println("hello");
        ps.println("1314");
        ps.println(true);
        //关闭流
        // ps.close();
    }

标准输入输出流

获取标准输出流PrintStream

/*
 * 标准输入输出流
 * System类中的两个成员变量:
 *        public static final InputStream in “标准”输入流。
 *        public static final PrintStream out “标准”输出流。
 *
 *        InputStream is = System.in;
 *        PrintStream ps = System.out;
 */
public static void main(String[] args) throws IOException {
    // 有这里的讲解我们就知道了,这个输出语句其本质是IO流操作,把数据输出到控制台。
    System.out.println("helloworld");
    // 获取标准输出流对象
    PrintStream ps = System.out;
    ps.println("helloworld");
    ps.println();
    // ps.print();//空参方法不存在
    System.out.println();
    // System.out.print();//所以空参不能使用
}

获取标准输入流InputStream

/*
 * System.in 标准输入流。是从键盘获取数据的
 *
 * 键盘录入数据:
 *        A:main方法的args接收参数。
      java hello.java
 *           java Hello hello world java
 *        B:Scanner
 *           Scanner sc = new Scanner(System.in);
 *           String s = sc.nextLine();
 *           int x = sc.nextInt()
 *        C:通过字符缓冲流包装标准输入流实现
 *           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 */
public static void main(String[] args) throws IOException {
    //获取标准输入流
    // InputStream is = System.in;
    // BufferedReader br = new BufferedReader(new InputStreamReader(is));
    //通过字符缓冲流包装标准输入流实现,但只能读字符串,因为有scnner对象,提供了很多方法
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("请输入一个字符串:");
    String line = br.readLine();
    System.out.println("你输入的字符串是:" + line);
    System.out.println("请输入一个整数:");
    line = br.readLine();
    int i = Integer.parseInt(line);
    System.out.println("你输入的整数是:" + i);
}

Properties集合

Properties集合概述

- 是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
- 属性列表中的每个键及其对应的值都是一个字符串

Properties基本使用

public class PropertiesDemo01 {
    public static void main(String[] args) {
        //创建集合对象
//        Properties<String,String> prop = new Properties<String,String>(); //错误
        Properties prop = new Properties();
        //存储元素
        prop.put("itfxp001", "林青霞");
        prop.put("itfxp002", "张曼玉");
        prop.put("itfxp003", "王祖贤");
        //遍历集合
        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 getProperty(String key) 使用此属性列表中指定的键搜索属性
Set stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串

代码演示

/*
 * 特殊功能:
 * public Object setProperty(String key,String value):添加元素
 * public String getProperty(String key):获取元素
 * public Set<String> stringPropertyNames():获取所有的键的集合
 */
public static void main(String[] args) throws IOException, ClassNotFoundException {
    // 创建集合对象
    Properties prop = new Properties();
    // 添加元素
    prop.setProperty("张三", "30");
    prop.setProperty("李四", "40");
    prop.setProperty("王五", "50");
    // public Set<String> stringPropertyNames():获取所有的键的集合
    Set<String> set = prop.stringPropertyNames();
    for (String key : set) {
        String value = prop.getProperty(key);//获取元素(value)
        System.out.println(key + "---" + value);
    }
}

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)方法的格式写入输出字符流

代码示例

/*
 * 这里的集合必须是Properties集合:
 * public void load(Reader reader):把文件中的数据读取到集合中
 * public void store(Writer writer,String comments):把集合中的数据存储到文件
 */
public static void main(String[] args) throws IOException, ClassNotFoundException {
    // myLoad();
    myStore();
}
//读数据
private static void myStore() throws IOException {
    // 创建集合对象
    Properties prop = new Properties();
    prop.setProperty("江一燕", "27");
    prop.setProperty("jack", "30");
    prop.setProperty("肉丝", "18");
    //public void store(Writer writer,String comments) 把集合中的数据存储到文件
    FileWriter w = new FileWriter("name.properties");
    //写
    prop.store(w, "写入文件的说明:因为我要学习所有我要写入");//comments:信息的描述
    w.close();
}
//写数据
private static void myLoad() throws IOException {
    Properties prop = new Properties();
    // public void load(Reader reader) 把文件中的数据读取到集合中
    // 注意:这个文件的数据必须是键值对形式
    FileReader r = new FileReader("name.properties");
    //读
    prop.load(r);
    r.close();    
    System.out.println("prop:" + prop);
}

nts) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |

| void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |

代码示例

/*
 * 这里的集合必须是Properties集合:
 * public void load(Reader reader):把文件中的数据读取到集合中
 * public void store(Writer writer,String comments):把集合中的数据存储到文件
 */
public static void main(String[] args) throws IOException, ClassNotFoundException {
    // myLoad();
    myStore();
}
//读数据
private static void myStore() throws IOException {
    // 创建集合对象
    Properties prop = new Properties();
    prop.setProperty("江一燕", "27");
    prop.setProperty("jack", "30");
    prop.setProperty("肉丝", "18");
    //public void store(Writer writer,String comments) 把集合中的数据存储到文件
    FileWriter w = new FileWriter("name.properties");
    //写
    prop.store(w, "写入文件的说明:因为我要学习所有我要写入");//comments:信息的描述
    w.close();
}
//写数据
private static void myLoad() throws IOException {
    Properties prop = new Properties();
    // public void load(Reader reader) 把文件中的数据读取到集合中
    // 注意:这个文件的数据必须是键值对形式
    FileReader r = new FileReader("name.properties");
    //读
    prop.load(r);
    r.close();    
    System.out.println("prop:" + prop);
}


目录
相关文章
|
7月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
7月前
|
存储 自然语言处理 Java
java缓冲流、转换流、序列化流、打印流
java缓冲流、转换流、序列化流、打印流介绍
|
7月前
|
存储 自然语言处理 Java
day17-缓冲流&转换流&序列化流&打印流&Properties(二)
day17-缓冲流&转换流&序列化流&打印流&Properties
68 1
|
7月前
|
存储
day17-缓冲流&转换流&序列化流&打印流&Properties(一)
day17-缓冲流&转换流&序列化流&打印流&Properties
82 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
48 0