目录
1、什么是配置文件
在应用程序开发中,配置文件是一个重要的文本文件,它在项目中往往被架构师一次性就写好了,其他的开发人员只是用就可以了,配置文件其实非常简单,就是把一些程序中会用到的参数放置到文本文件中,方便之后修改,但是往往这些配置项是程序的关键参数,比如数据库连接地址、接口地址,连接池定义、程序的logo等。这些参数往往都与环境相关,在本地开发、测试环境、灰度环境、生产环境都不一样,于是需要根据不同的环境用不同的配置文件
2、为什么需要配置文件
在聊这个之前先简单举个例子,在开发的过程中完成了某些业务或实现的某些功能后会将源代码进行编译随后打成Jar包进行上传发布,一经发布后源代码是非常难以修改的,假设有一天,存储用户数据的数据库密码修改了,我们不会去更改源码随后重新上传发布,这样一来增加的不小的工作量也带来了预不到的麻烦与问题,只需在配置文件中更改对应配置项的参数即可。以下总结了部分好处:
-
灵活性:配置文件提供了一种快速灵活地更改应用程序配置的方式,而无需重新编译或重启应用程序。
-
可维护性:通过配置文件,可以将应用程序配置的不同方面分开管理,从而方便维护。
-
移植性:配置文件可以用于不同的环境和平台,而无需修改应用程序源代码。
-
安全性:配置文件可以加密或者限制访问,以保护应用程序的配置信息。
-
轻松备份和恢复:配置文件是易于备份和恢复的,这意味着在系统或应用程序崩溃或出现问题时可以很容易地恢复设置。
-
互操作性:许多应用程序和系统都支持配置文件,因此可以从一个系统或应用程序中复制和粘贴配置文件到另一个系统或应用程序中,以实现相同的设置和选项。
综上所述,配置文件在现代软件开发中扮演着重要的角色,它可以提高应用程序的灵活性、可维护性和安全性,从而帮助开发人员更好地管理和维护软件。
配置文件可以采用各种格式,例如INI格式、XML格式、JSON格式、properties格式等等。不同的格式有不同的优缺点,需要根据具体情况选择。
3、如何使用配置文件
INI格式:
步骤1:创建一个新的ini文件
File file = new File("example.ini");
if (file.createNewFile()) {
System.out.println("文件创建成功!");
} else {
System.out.println("文件已存在!");
}
代码解释:
- 首先,创建一个File对象,传入文件名"example.ini"。
- 然后,调用file.createNewFile()方法创建文件,如果文件创建成功,则输出"文件创建成功!否则输出"文件已存在!
步骤2:写入配置信息
FileWriter writer = new FileWriter("example.ini");
writer.write("[Section1]\n");
writer.write("key1=value1\n");
writer.write("key2=value2\n");
writer.write("\n");
writer.write("[Section2]\n");
writer.write("key3=value3\n");
writer.write("key4=value4\n");
writer.close();
代码解释:
- 首先,创建一个FileWriter对象,传入文件名"example.ini"。
- 然后,使用writer.write()方法向ini文件中写入配置信息。每行配置信息都以键值对的形式表示,使用"=“符号分隔键和值。每个配置信息之间需要用换行符”\n"分隔。可以在配置信息之间加入空行以提高可读性。
- 最后,调用writer.close()方法关闭文件写入流。
步骤3:保存ini文件
writer.flush();
writer.close();
代码解释:
- 首先,调用writer.flush()方法将缓冲区的内容写入文件。
- 然后,调用writer.close()方法关闭文件写入流。
INI格式配置文件总结:
顺序为:创建文件、写入配置信息和保存文件。通过使用Java的IO流,可以方便地实现ini文件的生成。
XML格式:
生成XML文件:
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jXml {
/**
* 生成xml方法
*/
public static void createXml(){
try {
// 1、创建document对象
Document document = DocumentHelper.createDocument();
// 2、创建根节点rss
Element rss = document.addElement("rss");
// 3、向rss节点添加version属性
rss.addAttribute("version", "2.0");
// 4、生成子节点及子节点内容
Element channel = rss.addElement("VALUE");
Element title = channel.addElement("NAME");
title.setText("欢乐的ABC");
// 5、设置生成xml的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式
format.setEncoding("UTF-8");
// 6、生成xml文件
File file = new File("F://ABC.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
// 设置是否转义,默认使用转义字符
writer.setEscapeText(false);
writer.write(document);
writer.close();
System.out.println("生成ABC.xml成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("生成ABC.xml失败");
}
}
}
XML文件的内容:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NAME>李四</NAME>
<SEX>男</SEX>
</VALUE>
<VALUE>
<NAME>菲菲</NAME>
<SEX>女</SEX>
</VALUE>
</RESULT>
导出XML文件信息:
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader2DOM4J {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("F://abc.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("姓名:" + foo.elementText("NAME"));
System.out.println("性别:" + foo.elementText("SEX"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
JSON格式:
以下将针对如下内容示例进行json代码实现并如何导出成一个“.json”文件;
{
"name":"张铁柱",
"age":25,
"height":"185.5",
"school":"清华",
"major":[{
"job1":"worker",
"job2":"doctor"
},
{
"job3":"teacher",
"job4":"student"
}],
"houseLocation":{
"x":30,
"y":30
}
}
代码实现如下:
String fullPath = filePath + File.separator + fileName + ".json";
//例如:fullPath="D:/myroot/test.json"
// 生成json格式文件
try {
// 保证创建一个新文件
File file = new File(fullPath);
if (!file.getParentFile().exists())
{ // 如果父目录不存在,创建父目录
file.getParentFile().mkdirs();
}
if (file.exists()) { // 如果已存在,删除旧文件
file.delete();
}
file.createNewFile();
//以下创建json格式内容
//创建一个json对象,相当于一个容器
JSONObject root =new JSONObject();
root.put("name","张铁柱");
root.put("age",25)
//假设身高是double,我们取小数点后一位
double height=185.5345;
root.put("height",(double)(Math.round(height*10)/10.0));
JSONArray array=new JSONArray();
JSONObject major1=new JSONObject();
major1.put("job1","worker");
major1.put("job2","doctor");
JSONObject major2=new JSONObject();
major2.put("job3","teacher");
major2.put("job4","student");
array.put( major1);
array.put( major2);
root.put("major",array);
//假设位置x,y都是double型的,现在对他们取整
double x=30.0045;
double y=30.1123;
JSONObject houloc=new JSONObject();
houloc.put("x",Math.round(x));
houloc.put("y",Math.round(y));
root.put("houseLocation",houloc)
// 格式化json字符串
jsonString = formatJson(root.toString());
// 将格式化后的字符串写入文件
Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
write.write(jsonString);
write.flush();
write.close();
} catch (Exception e) {
e.printStackTrace();
}
properties格式:
生成一个配置文件并存入数据:
//创建一个配置文件
Properties pro = new Properties(); //创建一个properties对象
try {
OutputStream out = new FileOutputStream("src/ConnectMySQLInfo.properties"); //创建一个输出流 里面路径填写文件的路径
pro.setProperty("drive", "com.mysql.cj.jdbc.Driver");
pro.store(out, "drive"); //将数据储存到文件中,第一个参数是 输出流,第二个参数是注释
pro.setProperty("url", "jdbc:mysql://localhost:3306/homework1_1124");
pro.store(out, "url"); //将数据储存到文件中,第一个参数是 输出流,第二个参数是注释
pro.setProperty("userName", "root");
pro.store(out, "userName"); //将数据储存到文件中,第一个参数是 输出流,第二个参数是注释
pro.setProperty("password", "root");
pro.store(out, "password"); //将数据储存到文件中,第一个参数是 输出流,第二个参数是注释
out.close();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
导出文件的信息:
//将文件中的数据取出
Properties proper = new Properties();
InputStream is = null; //创建输出流对象
try {
is = new FileInputStream("src/ConnectMySQLInfo.properties"); //创建一个输出流
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
try {
//将文件取出 传入一个 输出流
proper.load(is);
String drive = (String) proper.get("drive");
System.out.println(drive);
System.out.println(proper);
} catch (IOException e) {
throw new RuntimeException(e);
}
控制台: