笨方法学 Java -20-综合练习1-实现分析-配置文件读写
作者:谎言诞行    发布时间:2024年02月29日

1、基础的文件读写

文件的读写原理,其实很简单。通过《18-综合练习1-实现分析-获取键盘输入》这篇文章,我们了解到输入流输出流。所以,在这里我们扩展出了文件输入流文件输出流


以下是文件输入流 和 文件输出流的处理流程:

l   文件输入流的处理:

image.png

l   文件输出流的处理:

image.png

参考代码如下:

public static void main(String[] args) throws Exception {
       //操作系统用户主目录
       String userDir = System.getProperties().getProperty("user.home");
       //文件所在文件夹
       String fileDir = userDir+File.separator+"examproj";
       //文件路径
       String filePath = fileDir+File.separator+"fileIOTest.txt";
      
       //==== 1、向文件写入内容
       FileOutputStream fout = null;
       //判断文件夹是否存在
       File myDir = new File(fileDir);
       if(!myDir.exists() || !myDir.isDirectory() ) {
              //如果不存在,或者存在但不是文件夹,则需要创建
              myDir.mkdirs();
       }
       try {
              //创建文件输出流
              fout = new FileOutputStream(filePath);
              //写入一句话
              fout.write("这是一句测试用的文字".getBytes("UTF-8"));
              System.out.println("INFO:  文字写入完毕。");
       }catch(Exception e) {
              System.out.println("ERROR: 执行文字输出异常,"+e.getMessage());
              throw e;
       }finally {
              //关闭文件输出流
              if(fout!=null) {
                     try {fout.close();} catch (Exception e) {}
                     fout=null;
              }
              System.out.println("INFO:  文件输出流关闭完成。");
       }
      
       //==== 2、从文件读取内容
       FileInputStream fin = null;
       //判断文件是否存在
       if(new File(filePath).exists()) {
              try {
                     //创建文件输入流
                     fin = new FileInputStream(filePath);
                     //根据文件可读取的字节数创建缓存区(一次性读取)
                     byte[] buffer = new byte[fin.available()];
                     String content = null;
                     //读取内容(使用基础的缓冲区的形式读取)
                     fin.read(buffer);
                     content = new String(buffer);
                     //显示结果
                     System.out.println("INFO:  文字读取完毕。");
                     System.out.println("INFO:  文件内容如下:["+content+"]");
              }catch(Exception e) {
                     System.out.println("ERROR: 执行文字输入异常,"+e.getMessage());
                     throw e;
              }finally {
                     //关闭文件输入流
                     if(fin!=null) {
                            try {fin.close();} catch (Exception e) {}
                            fin=null;
                     }
                     System.out.println("INFO:  文件输入流关闭完成。");
              }
       }else {
              System.out.println("ERROR:文件("+filePath+")不存在,无法读取数据。");
       }
}

//完毕

注意:

(1) 在处理文件的写入(文件输出流)时,要确保文件夹是存在的。因为 Java 语言不会自动创建文件夹,需要自己调用 File 类的 mkdirs 方法创建路径所涉及的所有文件夹。

(2) 文件的输入和输出流,操作的都是字节数据(byte);因此,如果要按字符来处理,则需要转换

(3) 关于 FileInputStream 和 FileOutputStream 的流关闭操作,因为要保证就算执行有异常,抛出后,仍然能够关闭流处理。所以需要 try…catch…finally 语句。


2、配置文件类的介绍

image.png

image.png

image.png

Properties 类表示一组持久的属性。属性可以保存到流中,也可以从流加载。属性列表中的每个键及其对应的值都是一个字符串。从它的API文档上,我们可以看出,它有2种处理方式:properties 文件 和 xml 文件。这里我们只讨论properties 文件的处理方式。


下面我们开始介绍配置文件的读写。通过上面的截图,我们可以看出 Properties 类的对象可以通过 store 方法写入文件,通过 load 方法读取文件。API调用整体较为简单。所以,我们直接上代码,方便大家观察。

注意:

properties 文件的编码只能为 ISO-8859-1,所以如果有非英文字符,则存储为 unicode 编码形式。

 

3、配置文件的写入

public static void main(String[] args) throws Exception {
      
       //操作系统用户主目录
       String userDir = System.getProperties().getProperty("user.home");
       //文件所在文件夹
       String fileDir = userDir+File.separator+"examproj";
       //文件路径
       String filePath = fileDir+File.separator+"myconfig.properties";
      
       //判断文件夹是否存在
       File myDir = new File(fileDir);
       if(!myDir.exists() || !myDir.isDirectory() ) {
              //如果不存在,或者存在但不是文件夹,则需要创建
              myDir.mkdirs();
       }
      
       //创建一个新的属性对象
       Properties config = new Properties();
       config.setProperty("user.name", "张三");
       config.setProperty("user.age", "12");
       //保存配置信息
       FileOutputStream out = null;
       try {
              out = new FileOutputStream(filePath);
              //保存
              config.store(out, "一些关于人员的配置信息");
              //
              System.out.println("INFO:  人员配置写入完毕。");
       } catch (Exception e) {
              //将捕捉到的异常抛出
              System.out.println("ERROR: 执行文字输出异常,"+e.getMessage());
              throw e;
       } finally {
              //关闭文件输出流
              if(out!=null) {
                     try {out.close();} catch (Exception e) {}
                     out=null;
              }
              System.out.println("INFO:  文件输出流关闭完成。");
       }
      
}

生成的文件内容如下:

image.png

 

4、配置文件的读取

public static void main(String[] args) throws Exception {
      
       //操作系统用户主目录
       String userDir = System.getProperties().getProperty("user.home");
       //文件所在文件夹
       String fileDir = userDir+File.separator+"examproj";
       //文件路径
       String filePath = fileDir+File.separator+"myconfig.properties";
       //判断文件是否存在
       if(new File(filePath).exists()) {
              FileInputStream fin = null;
              Properties config = new Properties();
              try {
                     //初始化文件输入流
                     fin = new FileInputStream(filePath);
                     //加载信息
                     config.load(fin);
                     //显示文件内容
                     System.out.println("文件内容如下:");
                     Set<Object> keys = config.keySet();
                     for(Object o: keys) {
                            System.out.println("key="+o.toString()+", value="+config.getProperty(o.toString()));
                     }
              } catch (Exception e) {
                     //将捕捉到的异常抛出
                     System.out.println("ERROR: 执行文字读取异常,"+e.getMessage());
                     throw e;
              } finally {
                     //关闭文件输入流
                     if(fin!=null) {
                            try {
                                   fin.close();
                            } catch (Exception e) {
                            }
                            fin=null;
                     }
                     System.out.println("INFO:  文件输入流关闭完成。");
              }
       }else {
              System.out.println("ERROR:文件("+filePath+")不存在,无法读取数据。");
       }
      
}

执行结果如下:

image.png


本章完结。

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新