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);
}


目录
相关文章
|
4月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
3月前
|
存储 自然语言处理 Java
java缓冲流、转换流、序列化流、打印流
java缓冲流、转换流、序列化流、打印流介绍
|
3月前
|
存储 自然语言处理 Java
day17-缓冲流&转换流&序列化流&打印流&Properties(二)
day17-缓冲流&转换流&序列化流&打印流&Properties
43 1
|
3月前
|
存储
day17-缓冲流&转换流&序列化流&打印流&Properties(一)
day17-缓冲流&转换流&序列化流&打印流&Properties
55 0
|
2月前
|
存储 XML JSON
数据传输的艺术:深入探讨序列化与反序列化
数据传输的艺术:深入探讨序列化与反序列化
61 0
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
2月前
|
存储 Java 数据库
|
1月前
|
JSON 安全 Java
Spring Boot 序列化、反序列化
本文介绍了Spring Boot中的序列化和反序列化。Java提供默认序列化机制,通过实现Serializable接口实现对象到字节流的转换。Spring Boot默认使用Jackson处理JSON,可通过注解和配置自定义规则。然而,序列化可能引发安全问题,建议使用白名单、数据校验和安全库。最佳实践包括使用标准机制、自定义规则及注意版本控制。文章还提醒关注性能并提供了相关参考资料。
47 2
|
4天前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
9 0
|
5天前
|
JSON Java Linux
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
20 2