day11-IO流,Properties集合,IO工具类

今日目标

  • IO流的介绍
  • IO流的分类
  • 字节输出流
  • 字节输入流
  • 字节缓冲区流
  • Properties集合

1 IO流的介绍

1.1 为什么要学习IO流

  • 通过变量,数组,或者集合存储数据

    • 都是不能永久化存储 , 因为数据都是存储在内存中
    • 只要代码运行结束,所有数据都会丢失
  • 使用IO流

    • 1,将数据写到文件中,实现数据永久化存储
    • 2,把文件中的数据读取到内存中(Java程序)

1.2 什么是IO流

  • I 表示intput ,是数据从硬盘进内存的过程,称之为读。
  • O 表示output ,是数据从内存到硬盘的过程。称之为写
  • IO的数据传输,可以看做是一种数据的流动,按照流动的方向,以内存为参照物,进行读写操作

    • 简单来说:内存在读,内存在写

1.3 IO流的分类

  • 按照流向区分

    • 输入流 : 用来读数据
    • 输出流 : 用来写数据
  • 按照类型区分

    • 字节流
    • 字符流
  • 注意 :

    • 字节流可以操作任意文件
    • 字符流只能操作纯文本文件
    • 用windows记事本打开能读的懂,那么这样的文件就是纯文本文件。

2 字节流输出流

2.1 字节输出流入门

  • FileOutputStream类 :
  • OutputStream有很多子类,我们从最简单的一个子类开始。
  • java.io.FileOutputStream类是文件输出流,用于将数据写出到文件
    • 构造方法 :
  • public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。

    1. public class FileOutputStreamConstructor throws IOException {
    2. public static void main(String[] args) {
    3. // 使用File对象创建流对象
    4. File file = new File("a.txt");
    5. FileOutputStream fos = new FileOutputStream(file);
    6. // 使用文件名称创建流对象
    7. FileOutputStream fos = new FileOutputStream("b.txt");
    8. }
    9. }
  • 字节输出流写数据快速入门
  • 创建字节输出流对象。
  • 写数据
  • 释放资源 ```java package com.itheima.outputstream_demo;

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

/ 字节输出流写数据快速入门 : 1 创建字节输出流对象。 2 写数据 3 释放资源 / public class OutputStreamDemo1 { public static void main(String[] args) throws IOException { // 创建字节输出流对象 // 如果指定的文件不存在 , 会自动创建文件 // 如果文件存在 , 会把文件中的内容清空 FileOutputStream fos = new FileOutputStream(“day11_demo\a.txt”);

  1. // 写数据
  2. // 写到文件中就是以字节形式存在的
  3. // 只是文件帮我们把字节翻译成了对应的字符 , 方便查看
  4. fos.write(97);
  5. fos.write(98);
  6. fos.write(99);
  7. // 释放资源
  8. // while(true){}
  9. // 断开流与文件中间的关系
  10. fos.close();
  11. }

}

  1. <a name="a913834a"></a>
  2. ### 2.2 字节输出流写数据的方法
  3. -
  4. 字节流写数据的方法
  5. - 1 void write(int b) 一次写一个字节数据
  6. - 2 void write(byte[] b) 一次写一个字节数组数据
  7. - 3 void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据
  8. ```java
  9. package com.itheima.outputstream_demo;
  10. import java.io.FileNotFoundException;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. /*
  14. 字节流写数据的3种方式
  15. 1 void write(int b) 一次写一个字节数据
  16. 2 void write(byte[] b) 一次写一个字节数组数据
  17. 3 void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据
  18. */
  19. public class OutputStreamDemo2 {
  20. public static void main(String[] args) throws IOException {
  21. // 创建字节输出流对象
  22. FileOutputStream fos = new FileOutputStream("day11_demo\\a.txt");
  23. // 写数据
  24. // 1 void write(int b) 一次写一个字节数据
  25. fos.write(97);
  26. fos.write(98);
  27. fos.write(99);
  28. // 2 void write(byte[] b) 一次写一个字节数组数据
  29. byte[] bys = {65, 66, 67, 68, 69};
  30. fos.write(bys);
  31. // 3 void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据
  32. fos.write(bys, 0, 3);
  33. // 释放资源
  34. fos.close();
  35. }
  36. }

2.3 写数据的换行和追加写入

  1. package com.itheima.outputstream_demo;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. /*
  5. 字节流写数据的换行和追加写入
  6. 1 字节流写数据如何实现换行呢?
  7. 写完数据后,加换行符
  8. windows : \r\n
  9. linux : \n
  10. mac : \r
  11. 2 字节流写数据如何实现追加写入呢?
  12. 通过构造方法 : public FileOutputStream(String name,boolean append)
  13. 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,不会清空文件里面的内容
  14. */
  15. public class OutputStreamDemo3 {
  16. public static void main(String[] args) throws IOException {
  17. // 创建字节输出流对象
  18. FileOutputStream fos = new FileOutputStream("day11_demo\\a.txt");
  19. // void write(int b) 一次写一个字节数据
  20. fos.write(97);
  21. // 因为字节流无法写入一个字符串 , 把字符串转成字节数组写入
  22. fos.write("\r\n".getBytes());
  23. fos.write(98);
  24. fos.write("\r\n".getBytes());
  25. fos.write(99);
  26. fos.write("\r\n".getBytes());
  27. // 释放资源
  28. fos.close();
  29. }
  30. }
  1. package com.itheima.outputstream_demo;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. /*
  5. 字节流写数据的换行和追加写入
  6. 1 字节流写数据如何实现换行呢?
  7. 写完数据后,加换行符
  8. windows : \r\n
  9. linux : \n
  10. mac : \r
  11. 2 字节流写数据如何实现追加写入呢?
  12. 通过构造方法 : public FileOutputStream(String name,boolean append)
  13. 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,不会清空文件里面的内容
  14. */
  15. public class OutputStreamDemo3 {
  16. public static void main(String[] args) throws IOException {
  17. // 创建字节输出流对象
  18. // 追加写数据
  19. // 通过构造方法 : public FileOutputStream(String name,boolean append) : 追加写数据
  20. FileOutputStream fos = new FileOutputStream("day11_demo\\a.txt" , true);
  21. // void write(int b) 一次写一个字节数据
  22. fos.write(97);
  23. // 因为字节流无法写入一个字符串 , 把字符串转成字节数组写入
  24. fos.write("\r\n".getBytes());
  25. fos.write(98);
  26. fos.write("\r\n".getBytes());
  27. fos.write(99);
  28. fos.write("\r\n".getBytes());
  29. // 释放资源
  30. fos.close();
  31. }
  32. // 写完数据换行操作
  33. private static void method1() throws IOException {
  34. // 创建字节输出流对象
  35. FileOutputStream fos = new FileOutputStream("day11_demo\\a.txt");
  36. // void write(int b) 一次写一个字节数据
  37. fos.write(97);
  38. // 因为字节流无法写入一个字符串 , 把字符串转成字节数组写入
  39. fos.write("\r\n".getBytes());
  40. fos.write(98);
  41. fos.write("\r\n".getBytes());
  42. fos.write(99);
  43. fos.write("\r\n".getBytes());
  44. // 释放资源
  45. fos.close();
  46. }
  47. }

3 字节输入流

3.1 字节输入流介绍

  • 字节输入流类
  • InputStream类 : 字节输入流最顶层的类 , 抽象类
    —- FileInputStream类 : FileInputStream extends InputStream
    • 构造方法
  • public FileInputStream(File file) : 从file类型的路径中读取数据
  • public FileInputStream(String name) : 从字符串路径中读取数据
    • 步骤
  • 创建输入流对象
  • 读数据
  • 释放资源
    • ``` package com.itheima.inputstream_demo;

import java.io.FileInputStream; import java.io.IOException;

/ 字节输入流写数据快速入门 : 一次读一个字节 第一部分 : 字节输入流类 InputStream类 : 字节输入流最顶层的类 , 抽象类 —- FileInputStream类 : FileInputStream extends InputStream 第二部分 : 构造方法 public FileInputStream(File file) : 从file类型的路径中读取数据 public FileInputStream(String name) : 从字符串路径中读取数据 第三部分 : 字节输入流步骤 1 创建输入流对象 2 读数据 3 释放资源 / public class FileInputStreamDemo1 { public static void main(String[] args) throws IOException { // 创建字节输入流对象 // 读取的文件必须存在 , 不存在则报错 FileInputStream fis = new FileInputStream(“day11_demo\a.txt”);

  1. // 读数据 , 从文件中读到一个字节
  2. // 返回的是一个int类型的字节
  3. // 如果想看字符, 需要强转
  4. int by = fis.read();
  5. System.out.println((char) by);
  6. // 释放资源
  7. fis.close();
  8. }

}

  1. <a name="e864e190"></a>
  2. ### 3.2 字节输入流读多个字节

package com.itheima.inputstream_demo;

import java.io.FileInputStream; import java.io.IOException;

/ 字节输入流写数据快速入门 : 读多个字节 第一部分 : 字节输入流类 InputStream类 : 字节输入流最顶层的类 , 抽象类 —- FileInputStream类 : FileInputStream extends InputStream 第二部分 : 构造方法 public FileInputStream(File file) : 从file类型的路径中读取数据 public FileInputStream(String name) : 从字符串路径中读取数据 第三部分 : 字节输入流步骤 1 创建输入流对象 2 读数据 3 释放资源 / public class FileInputStreamDemo2 { public static void main(String[] args) throws IOException { // 创建字节输入流对象 // 读取的文件必须存在 , 不存在则报错 FileInputStream fis = new FileInputStream(“day11_demo\a.txt”);

  1. // 读数据 , 从文件中读到一个字节
  2. // 返回的是一个int类型的字节
  3. // 如果想看字符, 需要强转

// int by = fis.read(); // System.out.println(by); // by = fis.read(); // System.out.println(by); // by = fis.read(); // System.out.println(by); // // by = fis.read(); // System.out.println(by); // by = fis.read(); // System.out.println(by); // by = fis.read(); // System.out.println(by);

  1. // 循环改进
  2. int by;// 记录每次读到的字节
  3. while ((by = fis.read()) != -1) {
  4. System.out.print((char) by);
  5. }
  6. // 释放资源
  7. fis.close();
  8. }

}

  1. <a name="d50d6463"></a>
  2. ### 3.3 图片的拷贝
  3. ```java
  4. package com.itheima.inputstream_demo;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. /*
  10. 需求 : 把 "图片路径\xxx.jpg" 复制到当前模块下
  11. 分析:
  12. 复制文件,其实就把文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
  13. 数据源:
  14. xxx.jpg --- 读数据 --- FileInputStream
  15. 目的地:
  16. 模块名称\copy.jpg --- 写数据 --- FileOutputStream
  17. */
  18. public class FileInputStreamDemo2 {
  19. public static void main(String[] args) throws IOException {
  20. // 创建字节输入流对象
  21. FileInputStream fis = new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg");
  22. // 创建字节输出流
  23. FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg");
  24. // 一次读写一个字节
  25. int by;
  26. while ((by = fis.read()) != -1) {
  27. fos.write(by);
  28. }
  29. // 释放资源
  30. fis.close();
  31. fos.close();
  32. }
  33. }

3.4 异常的捕获处理

  • JDK7版本之前处理方式 : 手动释放资源
  1. package com.itheima.inputstream_demo;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. /*
  6. 需求 : 对上一个赋值图片的代码进行使用捕获方式处理
  7. */
  8. public class FileInputStreamDemo4 {
  9. public static void main(String[] args) {
  10. FileInputStream fis = null ;
  11. FileOutputStream fos = null;
  12. try {
  13. // 创建字节输入流对象
  14. fis = new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg");
  15. // 创建字节输出流
  16. fos = new FileOutputStream("day11_demo\\copy.jpg");
  17. // 一次读写一个字节
  18. int by;
  19. while ((by = fis.read()) != -1) {
  20. fos.write(by);
  21. }
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. } finally {
  25. // 释放资源
  26. if(fis != null){
  27. try {
  28. fis.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. // 释放资源
  34. if(fos != null){
  35. try {
  36. fos.close();
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. }
  43. }
  • JDK7版本优化处理方式 : 自动释放资源
  • JDK7优化后可以使用 try-with-resource 语句 , 该语句确保了每个资源在语句结束时自动关闭。
    简单理解 : 使用此语句,会自动释放资源 , 不需要自己在写finally代码块了

  • 格式 : ```java 格式 :
    try (创建流对象语句1 ; 创建流对象语句2 …) { // 读写数据 } catch (IOException e) { 处理异常的代码… }

举例 : try ( FileInputStream fis1 = new FileInputStream(“day11_demo\a.txt”) ; FileInputStream fis2 = new FileInputStream(“day11_demo\b.txt”) ) { // 读写数据 } catch (IOException e) { 处理异常的代码… }

  1. -
  2. <a name="e8f77f2d"></a>
  3. ##### 代码实践
  4. ```java
  5. package com.itheima.inputstream_demo;
  6. import java.io.FileInputStream;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. /*
  10. JDK7版本优化处理方式
  11. 需求 : 对上一个赋值图片的代码进行使用捕获方式处理
  12. */
  13. public class FileInputStreamDemo5 {
  14. public static void main(String[] args) {
  15. try (
  16. // 创建字节输入流对象
  17. FileInputStream fis = new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg");
  18. // 创建字节输出流
  19. FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg")
  20. ) {
  21. // 一次读写一个字节
  22. int by;
  23. while ((by = fis.read()) != -1) {
  24. fos.write(by);
  25. }
  26. // 释放资源 , 发现已经灰色 , 提示多余的代码 , 所以使用 try-with-resource 方式会自动关流
  27. // fis.close();
  28. // fos.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }

3.4 字节输入流一次读一个字节数组

  • FileInputStream类 :

    • public int read(byte[] b) : 从输入流读取最多b.length个字节的数据, 返回的是真实读到的数据个数 ```java package com.itheima.inputstream_demo;

import javax.sound.midi.Soundbank; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;

/ FileInputStream类 : public int read(byte[] b): 1 从输入流读取最多b.length个字节的数据 2 返回的是真实读到的数据个数 / public class FileInputStreamDemo6 { public static void main(String[] args) throws IOException { // 创建字节输入流对象 FileInputStream fis = new FileInputStream(“day11_demo\a.txt”);

// public int read(byte[] b): // 1 从输入流读取最多b.length个字节的数据 // 2 返回的是真实读到的数据个数

  1. byte[] bys = new byte[3];

// int len = fis.read(bys); // System.out.println(len);// 3 // System.out.println(new String(bys));// abc // // len = fis.read(bys); // System.out.println(len);// 2 // System.out.println(new String(bys));// efc

  1. System.out.println("==========代码改进===============");

// int len = fis.read(bys); // System.out.println(len);// 3 // System.out.println(new String(bys, 0, len));// abc // // len = fis.read(bys); // System.out.println(len);// 2 // System.out.println(new String(bys, 0, len));// ef

  1. System.out.println("==========代码改进===============");
  2. int len;
  3. while ((len = fis.read(bys)) != -1) {
  4. System.out.print(new String(bys , 0 , len));
  5. }
  6. fis.close();
  7. }

}

  1. -
  2. 对复制图片的代码进行使用一次读写一个字节数组的方式进行改进
  3. ```java
  4. package com.itheima.inputstream_demo;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. /*
  10. 需求 : 对复制图片的代码进行使用一次读写一个字节数组的方式进行改进
  11. FileInputStream类 :
  12. public int read(byte[] b):
  13. 1 从输入流读取最多b.length个字节的数据
  14. 2 返回的是真实读到的数据个数
  15. */
  16. public class FileInputStreamDemo7 {
  17. public static void main(String[] args) throws IOException {
  18. // 创建字节输入流对象
  19. FileInputStream fis = new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg");
  20. // 创建字节输出流
  21. FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg");
  22. byte[] bys = new byte[1024];
  23. int len;// 每次真实读到数据的个数
  24. int by;
  25. while ((len = fis.read(bys)) != -1) {
  26. fos.write(bys, 0, len);
  27. }
  28. // 释放资源
  29. fis.close();
  30. fos.close();
  31. }
  32. }

4 字节缓冲区流

4.1 字节缓冲流概述

  • 字节缓冲流:

    • BufferOutputStream:缓冲输出流
    • BufferedInputStream:缓冲输入流
  • 构造方法:

    • 字节缓冲输出流:BufferedOutputStream(OutputStream out)
    • 字节缓冲输入流:BufferedInputStream(InputStream in)
  • 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

    • 字节缓冲流仅仅提供缓冲区,不具备读写功能 , 而真正的读写数据还得依靠基本的字节流对象进行操作

4.2 字节缓冲流案例

  1. package com.itheima.bufferedstream_demo;
  2. import java.io.*;
  3. /*
  4. 字节缓冲流:
  5. BufferOutputStream:缓冲输出流
  6. BufferedInputStream:缓冲输入流
  7. 构造方法:
  8. 字节缓冲输出流:BufferedOutputStream(OutputStream out)
  9. 字节缓冲输入流:BufferedInputStream(InputStream in)
  10. 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
  11. 字节缓冲流仅仅提供缓冲区,不具备读写功能 , 而真正的读写数据还得依靠基本的字节流对象进行操作
  12. 需求 : 使用缓冲流进行复制文件
  13. */
  14. public class BufferedStreamDemo1 {
  15. public static void main(String[] args) throws IOException {
  16. // 创建高效的字节输入流对象
  17. // 在底层会创建一个长度为8192的数组
  18. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg"));
  19. // 创建高效的字节输出流
  20. // 在底层会创建一个长度为8192的数组
  21. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day11_demo\\copy.jpg"));
  22. // 使用高效流 , 一次读写一个字节
  23. int by;
  24. while ((by = bis.read()) != -1) {
  25. bos.write(by);
  26. }
  27. // byte[] bys = new byte[1024];
  28. // int len;// 每次真实读到数据的个数
  29. // while ((len = bis.read(bys)) != -1) {
  30. // bos.write(bys, 0, len);
  31. // }
  32. // 释放资源
  33. // 在底层会把基本的流进行关闭
  34. bis.close();
  35. bos.close();
  36. }
  37. }

4.3 缓冲流一次读写一个字节原理

day10-字节流,递归 - 图1

4.4 缓冲流一次读写一个字节数组原理

day10-字节流,递归 - 图2

  • 四种方式复制视频文件
  1. package com.itheima.bufferedstream_demo;
  2. import java.awt.image.DataBufferDouble;
  3. import java.io.*;
  4. /*
  5. 需求:把“xxx.avi”复制到模块目录下的“copy.avi” , 使用四种复制文件的方式 , 打印所花费的时间
  6. 四种方式:
  7. 1 基本的字节流一次读写一个字节 : 花费的时间为:196662毫秒
  8. 2 基本的字节流一次读写一个字节数组 : 花费的时间为:383毫秒
  9. 3 缓冲流一次读写一个字节 : 花费的时间为:365毫秒
  10. 4 缓冲流一次读写一个字节数组 : 花费的时间为:108毫秒
  11. 分析 :
  12. 数据源 : "D:\a.wmv"
  13. 目的地 : "day11_demo\copy.wmv"
  14. */
  15. public class BufferedStreamDemo2 {
  16. public static void main(String[] args) throws IOException {
  17. long startTime = System.currentTimeMillis();
  18. // method1();
  19. // method2();
  20. // method3();
  21. method4();
  22. long endTime = System.currentTimeMillis();
  23. System.out.println("花费的时间为:" + (endTime - startTime) + "毫秒");
  24. }
  25. // 4 缓冲流一次读写一个字节数组
  26. private static void method4() throws IOException {
  27. // 创建高效的字节输入流
  28. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.wmv"));
  29. // 创建高效的字节输出流
  30. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day11_demo\\copy.wmv"));
  31. // 一次读写一个字节数组
  32. byte[] bys = new byte[1024];
  33. int len;// 每次真实读到数据的个数
  34. while ((len = bis.read(bys)) != -1) {
  35. bos.write(bys, 0, len);
  36. }
  37. // 释放资源
  38. bis.close();
  39. bos.close();
  40. }
  41. // 3 缓冲流一次读写一个字节
  42. private static void method3() throws IOException {
  43. // 创建高效的字节输入流
  44. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.wmv"));
  45. // 创建高效的字节输出流
  46. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day11_demo\\copy.wmv"));
  47. // 一次读写一个字节
  48. int by;
  49. while ((by = bis.read()) != -1) {
  50. bos.write(by);
  51. }
  52. // 释放资源
  53. bis.close();
  54. bos.close();
  55. }
  56. // 2 基本的字节流一次读写一个字节数组
  57. private static void method2() throws IOException {
  58. // 创建基本的字节输入流对象
  59. FileInputStream fis = new FileInputStream("D:\\a.wmv");
  60. // 创建基本的字节输出流对象
  61. FileOutputStream fos = new FileOutputStream("day11_demo\\copy.wmv");
  62. // 一次读写一个字节数组
  63. byte[] bys = new byte[1024];
  64. int len;// 每次真实读到数据的个数
  65. while ((len = fis.read(bys)) != -1) {
  66. fos.write(bys, 0, len);
  67. }
  68. // 释放资源
  69. fis.close();
  70. fos.close();
  71. }
  72. // 1 基本的字节流一次读写一个字节
  73. private static void method1() throws IOException {
  74. // 创建基本的字节输入流对象
  75. FileInputStream fis = new FileInputStream("D:\\a.wmv");
  76. // 创建基本的字节输出流对象
  77. FileOutputStream fos = new FileOutputStream("day11_demo\\copy.wmv");
  78. // 一次读写一个字节
  79. int by;
  80. while ((by = fis.read()) != -1) {
  81. fos.write(by);
  82. }
  83. // 释放资源
  84. fis.close();
  85. fos.close();
  86. }
  87. }

5.1 Properties集合的概述

  • properties是一个Map体系的集合类

    • public class Properties extends Hashtable <Object,Object>
  • 为什么在IO流部分学习Properties

    • Properties中有跟IO相关的方法
  • 当做双列集合使用

    • 不需要加泛型 , 工作中只存字符串 ```java package com.itheima.properties_demo;

import java.util.Map; import java.util.Properties; import java.util.Set;

/* 1 properties是一个Map体系的集合类

  1. - `public class Properties extends Hashtable <Object,Object>`
  2. 2 为什么在IO流部分学习Properties
  3. - Properties中有跟IO相关的方法
  4. 3 当做双列集合使用
  5. - 不需要加泛型 , 工作中只存字符串

*/ public class PropertiesDemo1 { public static void main(String[] args) { // 创建集合对象 Properties properties = new Properties();

  1. // 添加元素
  2. properties.put("it001" , "张三");
  3. properties.put("it002" , "李四");
  4. properties.put("it003" , "王五");
  5. // 遍历集合 : 键找值
  6. Set<Object> set = properties.keySet();
  7. for (Object key : set) {
  8. System.out.println(key + "---" + properties.get(key));
  9. }
  10. System.out.println("========================");
  11. // 遍历集合 : 获取对对象集合 , 获取键和值
  12. Set<Map.Entry<Object, Object>> set2 = properties.entrySet();
  13. for (Map.Entry<Object, Object> entry : set2) {
  14. Object key = entry.getKey();
  15. Object value = entry.getValue();
  16. System.out.println(key + "---" + value);
  17. }
  18. }

}

  1. <a name="a9badacc"></a>
  2. ### 5.2 Properties作为集合的特有方法
  3. - Object setProperty(String key, String value) 设置集合的键和值,都是String类型,相当于put方法
  4. - String getProperty(String key) 使用此属性列表中指定的键搜索属性 , 相当于get方法
  5. - Set stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 , 相当于keySet方法
  6. ```java
  7. package com.itheima.properties_demo;
  8. import java.util.Properties;
  9. import java.util.Set;
  10. /*
  11. Properties作为集合的特有方法
  12. Object setProperty(String key, String value) 设置集合的键和值,都是String类型,相当于put方法
  13. String getProperty(String key) 使用此属性列表中指定的键搜索属性 , 相当于get方法
  14. Set<String> stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 , 相当于keySet方法
  15. */
  16. public class PropertiesDemo2 {
  17. public static void main(String[] args) {
  18. // 创建集合对象
  19. Properties properties = new Properties();
  20. // 添加元素
  21. properties.setProperty("it001", "张三");
  22. properties.setProperty("it002", "李四");
  23. properties.setProperty("it003", "王五");
  24. // 遍历集合 : 键找值
  25. Set<String> set = properties.stringPropertyNames();
  26. for (String key : set) {
  27. System.out.println(key + "---" + properties.getProperty(key));
  28. }
  29. }
  30. }

5.3 properties中和IO相关的方法

  • void load(InputStream inStream) 以字节流形式 , 把文件中的键值对, 读取到集合中
  • void load(Reader reader) 以字符流形式 , 把文件中的键值对, 读取到集合中
  • void store(OutputStream out, String comments) 把集合中的键值对,以字节流形式写入文件中 , 参数二为注释
  • void store(Writer writer, String comments) 把集合中的键值对,以字符流形式写入文件中 , 参数二为注释
  1. package com.itheima.properties_demo;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.util.Properties;
  5. /*
  6. Properties和IO流结合的方法
  7. void load(InputStream inStream) 以字节流形式 , 把文件中的键值对, 读取到集合中
  8. //void load(Reader reader) 以字符流形式 , 把文件中的键值对, 读取到集合中
  9. void store(OutputStream out, String comments) 把集合中的键值对,以字节流形式写入文件中 , 参数二为注释
  10. //void store(Writer writer, String comments) 把集合中的键值对,以字符流形式写入文件中 , 参数二为注释
  11. */
  12. public class PropertiesDemo3 {
  13. public static void main(String[] args) throws IOException {
  14. // 创建Properties集合对象
  15. Properties properties = new Properties();
  16. // void load(InputStream inStream) 以字节流形式 , 把文件中的键值对, 读取到集合中
  17. properties.load(new FileInputStream("day11_demo\\prop.properties"));
  18. // 打印集合中的数据
  19. System.out.println(properties);
  20. }
  21. }
  1. package com.itheima.properties_demo;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.util.Properties;
  6. /*
  7. Properties和IO流结合的方法
  8. void load(InputStream inStream) 以字节流形式 , 把文件中的键值对, 读取到集合中
  9. //void load(Reader reader) 以字符流形式 , 把文件中的键值对, 读取到集合中
  10. void store(OutputStream out, String comments) 把集合中的键值对,以字节流形式写入文件中 , 参数二为注释
  11. //void store(Writer writer, String comments) 把集合中的键值对,以字符流形式写入文件中 , 参数二为注释
  12. */
  13. public class PropertiesDemo3 {
  14. public static void main(String[] args) throws IOException {
  15. Properties properties = new Properties();
  16. properties.setProperty("zhangsan" , "23");
  17. properties.setProperty("lisi" , "24");
  18. properties.setProperty("wangwu" , "25");
  19. properties.store(new FileOutputStream("day11_demo\\prop2.properties") , "userMessage");
  20. }
  21. private static void method1() throws IOException {
  22. // 创建Properties集合对象
  23. Properties properties = new Properties();
  24. // void load(InputStream inStream) 以字节流形式 , 把文件中的键值对, 读取到集合中
  25. properties.load(new FileInputStream("day11_demo\\prop.properties"));
  26. // 打印集合中的数据
  27. System.out.println(properties);
  28. }
  29. }

6 ResourceBundle加载属性文件

学习目标

  • 能够熟练使用ResourceBundle工具类快速读取属性文件的值

内容讲解

【1】API介绍

java.util.ResourceBundle它是一个抽象类,我们可以使用它的子类PropertyResourceBundle来读取以.properties结尾的配置文件。

通过静态方法直接获取对象:
  1. static ResourceBundle getBundle(String baseName) 可以根据名字直接获取默认语言环境下的属性资源。
  2. 参数注意: baseName
  3. 1.属性集名称不含扩展名。
  4. 2.属性集文件是在src目录中的
  5. 比如:src中存在一个文件 user.properties
  6. ResourceBundle bundle = ResourceBundle.getBundle("user");

ResourceBundle中常用方法:

  1. String getString(String key) : 通过键,获取对应的值

【2】代码实践

通过ResourceBundle工具类

将一个属性文件 放到src目录中,使用ResourceBundle去获取键值对数据

  1. package com.itheima.resourcebundle_demo;
  2. import java.util.ResourceBundle;
  3. /*
  4. 1 java.util.ResourceBundle : 它是一个抽象类
  5. 我们可以使用它的子类PropertyResourceBundle来读取以.properties结尾的配置文件
  6. 2 static ResourceBundle getBundle(String baseName) 可以根据名字直接获取默认语言环境下的属性资源。
  7. 参数注意: baseName
  8. 1.属性集名称不含扩展名。
  9. 2.属性集文件是在src目录中的
  10. 比如:src中存在一个文件 user.properties
  11. ResourceBundle bundle = ResourceBundle.getBundle("user");
  12. 3 ResourceBundle中常用方法:
  13. String getString(String key) : 通过键,获取对应的值
  14. 优点 : 快速读取属性文件的值
  15. 需求 :
  16. 通过ResourceBundle工具类
  17. 将一个属性文件 放到src目录中,使用ResourceBundle去获取键值对数据
  18. */
  19. public class ResourceBundleDemo {
  20. public static void main(String[] args) {
  21. // public static final ResourceBundle getBundle(String baseName)
  22. // baseName : properties文件的名字 , 注意 : 扩展名不需要加上 , properties必须在src的根目录下
  23. ResourceBundle resourceBundle = ResourceBundle.getBundle("user");
  24. // String getString(String key) : 通过键,获取对应的值
  25. String value1 = resourceBundle.getString("username");
  26. String value2 = resourceBundle.getString("password");
  27. System.out.println(value1);
  28. System.out.println(value2);
  29. }
  30. }

内容小结

  1. 如果要使用ResourceBundle加载属性文件,属性文件需要放置在哪个位置?
    1. src的根目录
  1. 请描述使用ResourceBundle获取属性值的大致步骤是怎样的?
    1. 1 获取ResourceBundle对象
    2. 2 通过ResourceBundle类中的getString(key) : 根据键找值