Java中配置文件的三种配置位置及读取方式
1、用Properties解析文件,读取同级目录下的配置文件
db.properties里的内容
uname=mybatis_ssm
upass=xiaoli
同一级别读取
节流读取代码:
package com.DZY.xmL;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws Exception {
//读取同级目录下的配置文件
InputStream in= Demo1.class.getResourceAsStream("db.properties");//读取文件类型(.properties)
Properties p=new Properties();
//将读取的配置文件对应的流对象交给Properties进行管理
p.load(in);
String uname=p.getProperty("uname");
String upass=p.getProperty("upass");
System.out.println("uname="+uname);
System.out.println("upass="+upass);
}
}
打印结果:
uname=mybatis_ssm
upass=xiaoli
2、用Properties解析文件,读取类型是文本时。
1.如果在txt中不考虑中文的话,用字节流可以。
2.如果在txt中需要考虑中文就要用字符流; BufferedReader br=new BufferedReader(new InputStreamReader(in));
因为用字节流读取中午就会乱码。
public class Demo1 {
public static void main(String[] args) throws Exception {
//读取同级目录下的配置文件
InputStream in= Demo1.class.getResourceAsStream("asd.txt");//读取文件类型(.txt)
BufferedReader br=new BufferedReader(new InputStreamReader(in));
Properties p=new Properties();
//将读取的配置文件对应的流对象交给Properties进行管理
p.load(br);
String uname=p.getProperty("uname");
String upass=p.getProperty("upass");
System.out.println("uname="+uname);
System.out.println("upass="+upass);
}
}
字符流打印结果:
uname=你好
upass=123
db.properties之前是放在同一个包下com.DZY.xml,现在更换到了conf。
但是两个包在src下:
现在调用db.properties里面的值:
代码如下:
package com.DZY.xmL;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws Exception {
//读取src根目录下存放的配置文件 配置文件名前需要加 /
InputStream in= Demo1.class.getResourceAsStream("/db.properties");
Properties p=new Properties();
//将读取的配置文件对应的流对象交给Properties进行管理
p.load(in);
String uname=p.getProperty("uname");
String upass=p.getProperty("upass");
System.out.println("uname="+uname);
System.out.println("upass="+upass);
}
}
打印结果:
uname=mybatis_ssm
upass=xiaoli
2、在WEB-INF中读取文件里的值;
1、WEB-INF不能随便读取值,他是配置插件和XML文件。
2、WEB-INF他是web项目里的安全目录。
所以我们不能直接访问里面的jsp文件,
但可以用代码访问:
package com.DZY.xmL;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/demo1")
public class DemoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取web-inf下的配置
InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
Properties p = new Properties();
//将读取的配置文件对应的流对象交给Properties进行管理
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
req.getRequestDispatcher("demo1.jsp").forward(req, resp);
}
}
打印结果:
mybatis_ssm
xiaoli
bin 放命令的
config 放tomcat服务配置的
work 临时文件
webapp 发布项目的目录
web-inf
安全目录 含义:不能被外界访问
log 日志
Properties含义和特点:
https://blog.csdn.net/T_angsonglin/article/details/90490059
3、XML的解析和读取
这是我要读取的xml
小明
小芳
小王
案例1:
xpath 八爪鱼 按照查找目录的方式去查找xml内容
package com.DZY.xmL;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo2 {
public static void main(String[] args) throws Exception {
// students.xml
InputStream in = Demo2.class.getResourceAsStream("students.xml");
SAXReader reader = new SAXReader();
// // 将配置文件xml内容加载进内存
Document doc = reader.read(in);
// System.out.println(doc.asXML());
// 八爪鱼 按照查找目录的方式去查找xml内容
// /students/student/name
List stuEles = doc.selectNodes("/students/student");
for (Element stuEle : stuEles) {
// System.out.println(stuEle.asXML());
// 获取sid的属性值与s002进行对比,如果是那么就取出name标签对应的值
if ("s002".equals(stuEle.attributeValue("sid"))) {
Element nameEle = (Element) stuEle.selectSingleNode("name");
System.out.println(nameEle.asXML());//第一个打印
// 获取标签内部的文本类容
System.out.println(nameEle.getText());//第二个打印
}
}
}
}
打印结果
小芳
小芳
案例二
package com.DZY.xmL;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo3 {
public static void main(String[] args) throws Exception {
// 获取到xml文件,将其转化成流对象
InputStream in= Demo3.class.getResourceAsStream("students.xml");
// 实列化一个SAXReader
SAXReader s=new SAXReader();
// 使用dom4j的SAXReader来读取流
Document doc = s.read(in);
// System.out.println(doc.asXML());
Element stuS002Ele = (Element) doc.selectSingleNode("/students/student[@sid='s002']/name");
System.out.println(stuS002Ele.asXML());//第一个打印
System.out.println(stuS002Ele.getName());//第二 个打印
System.out.println(stuS002Ele.getText()); //第三个打印
}
}
打印结果
小芳
name
小芳
作业:
解析XML的文件:
读取代码:
package com.DZY.xmL;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* 1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
* @author Aromanic150
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
InputStream in = Demo4.class.getResourceAsStream("config.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
// 1、获取所有action中的type的值
List stuElems = doc.selectNodes("/config/action");
for (Element stuEle : stuElems) {
String type = stuEle.attributeValue("type");
System.out.println(type);
}
//// 2、获取第二个action中的type的值
List stuElems2 = doc.selectNodes("/config/action[@path='/loginAction']");
for (Node node : stuElems2) {
Element a= (Element) node;
String type=a.attributeValue("type");
System.out.println(type);
}
//// 3、获取第二个action的所有forward的path
List stuElems3 = doc.selectNodes("/config/action[@type='test.LoginAction']/forward");
for (Node node : stuElems3) {
Element a= (Element) node;
String path=a.attributeValue("path");
System.out.println(path);
}
//// 4、获取第二个action的第二个forward的path
List stuElems4 = doc.selectNodes("/config/action[@type='test.LoginAction']/forward[@name='success']");
for (Node node : stuElems4) {
Element a= (Element) node;
String path=a.attributeValue("path");
System.out.println(path);
}
}
}
打印结果:
test.RegAction
test.LoginAction
test.LoginAction
/login.jsp
/main.jsp
/main.jsp
学而不止,学而不尽
XML其他解析方法和模式
https://blog.csdn.net/wuyu92877/article/details/78490147