使用apache common configuration读取配置文件或修改配置文件

最近在做项目的时候,需要在页面上显示系统的配置信息并且允许用户通过WEB交互方式修改配置文件。
刚刚开始想采用数据库,但是这样子不太好,就一个配置信息也写进数据库,写入数据库也就一条记录而已, 有点浪费了。
后来,决定采用xml来记录这个配置文件。在网上无意间发现,原来apache的common项目下面有一个子项目叫configuration, 可以读取properties,xml等文件,并且还提供了修改,新建配置文件等功能。
可能用多了apache,总觉得apache的东西就是好,也懒得去通过dom或sax来做这一方面的工作了,解析也是痛苦的事情,对于我这个经验不丰富的人来讲。最后决定采用它。
上apache,下载了一个最新版本1.1。
注意:configuration里面使用了common collections新的类,最新版本是3.1,所以还需要更新一下工程的库

项目采用的是XML文件的配置,部分XML配置大概如下:
 <?xml version="1.0" encoding="UTF-8"?>
<mung-frog-config>
    <mail>
      <mailhost>mail.suneca.com</mailhost>
      <mailuser>admin</mailuser>
      <mailpassword>123456</mailpassword>
      <mailsubject>suneca mung frog code generation project</mailsubject>
      <mailtemplate>/WEB-INF/pages/common/mail_template.html</mailtemplate>           
    </mail>
</mung-frog-config>













读取配置文件的代码如下:

 //新建一个xml configuration类
XMLConfiguration config = new XMLConfiguration();
//得到当前配置文件的路径
String path = new File("resource/mungfrog.cfg.xml").getAbsolutePath();
File file = new File(path);

config.setFile(file);
config.load();

System.out.println(config.getProperty("mail.mailhost"));
System.out.println(config.getProperty("mail.mailuser"));
System.out.println(config.getProperty("mail.mailpassword"));

保存配置文件,假设现在需要增加一个抄送人的配置,代码片断:

 //新建一个xml configuration类
XMLConfiguration config = new XMLConfiguration();
//得到当前配置文件的路径
String path = new File("resource/mungfrog.cfg.xml").getAbsolutePath();
File file = new File(path);

config.setFile(file);
config.load();

config.addProperty("mail.mailcc","yuzhechen@msn.com");
config.save();

生成的配置件:

 <?xml version="1.0" encoding="UTF-8"?>
<mung-frog-config>
    <mail>
      <mailhost>mail.suneca.com</mailhost>
      <mailuser>admin</mailuser>
      <mailpassword>123456</mailpassword>
      <mailsubject>suneca mung frog code generation project</mailsubject>
      <mailtemplate>/WEB-INF/pages/common/mail_template.html</mailtemplate>           
      <mailcc>yuzhechen@msn.com</mailcc>
    </mail>
</mung-frog-config>

注意,XMLConfiguration当中有一个方法是addProperty(String str,Object obj);
如果增加配置信息是采用这个方法,不管你当前配置文件当中有没有这一项配置,都会增加这一项。

在使用这个工具的时候发现一个问题,如果XMLConfiguration不是通过一个File来load,在保存配置文件的时候会报一个空指针的异常
例如:
 ClassLoader loader = MungFrogConfig.class.getClassLoader();
InputStream is = loader.getResourceAsStream("mungfrog.cfg.xml");
config.load(is);
config.addProperty("mail.mailcc","yuzhechen@msn.com");
config.save();

这此会报一个空指针的异常,因为file找不到,为什么会有这样的问题呢?我也不知道,问apache吧!可能是BUG吧,我也只能这么说。

还有,如果你的开发工具用的是JBUILDER,读取没有问题,但是,保存配置的时候,它都会在project home生成一个新的配置文件,郁闷,
为什么会有这样的问题呢?原因就是jbuilder认为project home就是工程的根路径。
在Java中读取Parquet文件,你可以使用Apache Parquet的Java库,它提供了一系列的API来操作Parquet格式的数据。Parquet是一种列式存储格式,非常适合用于大规模数据分析。以下是使用Java读取Parquet文件中文件名的一个基本示例: 首先,确保在项目的`pom.xml`中添加了依赖: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>你的Hadoop版本</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-hadoop</artifactId> <version>你的Parquet版本</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>你的Hadoop版本</version> </dependency> ``` 然后,你可以使用以下代码来读取Parquet文件并获取文件名: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapreduce.Job; import org.apache.parquet.column.page.PageReadStore; import org.apache.parquet.example.data.Group; import org.apache.parquet.example.data.simple.SimpleGroupFactory; import org.apache.parquet.hadoop.ParquetFileReader; import org.apache.parquet.hadoop.metadata.ParquetMetadata; import org.apache.parquet.io.ColumnIOFactory; import org.apache.parquet.io.MessageColumnIO; import org.apache.parquet.io.RecordReader; import org.apache.parquet.schema.MessageType; import java.net.URI; public class ParquetFileReaderExample { public static void main(String[] args) throws Exception { // 替换为你的Parquet文件路径 String filePath = "hdfs://path/to/your/parquet/file.snappy.parquet"; // 设置Hadoop的配置信息 Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(filePath), conf); // 打开Parquet文件 ParquetFileReader parquetFileReader = new ParquetFileReader(fs, new Path(filePath), ParquetMetadataConverter.NO_FILTER); ParquetMetadataFooter footer = parquetFileReader.getFooter(); MessageType schema = footer.getFileMetaData().getSchema(); // 使用ColumnIOFactory创建列读取器 ColumnIOFactory columnIOFactory = new ColumnIOFactory(); MessageColumnIO columnIO = columnIOFactory.getIO(schema); PageReadStore pages = parquetFileReader.readNextRowGroup(); if (pages != null) { RecordReader<Group> recordReader = columnIO.getRecordReader(pages, new GroupRecordConverter(schema)); while (recordReader.hasNext()) { Group group = recordReader.next(); // 在这里处理每个group的数据 // 获取文件名(假设文件名是某个列的值) String fileName = group.getString("filename", 0); // 替换"filename"为实际的列名 System.out.println("读取到的文件名: " + fileName); } } parquetFileReader.close(); } } ``` 请确保在代码中替换`filePath`为你的Parquet文件实际路径,并且列名(如`"filename"`)要与你的Parquet文件中的实际列名一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值