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