java 读取带section_手把手教你实现类似ini4j的方式创建读取和修改.ini文件(支持section)...
背景
由于这次任务是和c语言合作编写的,刚开始使用ini4j来操作.ini文件,然后由于ini4j对存储的数据做了转义处理,导致c无法正常读取,他们也是采用开源的框架,然后由于java方只有我一个人,势单力薄,这个bug推给了java方来修改,然而时间又比较紧迫,一时之间也找不到合适的jar包,不得不撸起手来自己敲...然后勉强算是解决了bug,性能和安全问题没怎么考虑。
创建.ini文件
/**
* 创建新的ini文件
* @param filePath 文件路径
* @param fileContent 如果要保存存储顺序,建议使用LinkedHashMap
* @return
* @throws IOException
*/
public static boolean createIniFile(String filePath, Map> fileContent) throws IOException{
File file = new File(filePath);
if(file.exists()){
return false;
}
Set keys = null;
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));){
for (String section : fileContent.keySet()){
bufferedWriter.write("["+section+"]"+"\r\n");
keys = fileContent.get(section).keySet();
for (String key : keys){
bufferedWriter.write(key+" = "+fileContent.get(section).get(key)+"\r\n");
}
bufferedWriter.newLine();
}
}catch (Exception e){
e.printStackTrace();
throw new IOException("文件写出异常");
}
return true;
}
//测试代码
@Test
public void testCreatIniFile(){
long t2 = System.currentTimeMillis();
IniUtils.creatIniFile("D:\\abc\\test.ini");
long t3 = System.currentTimeMillis();
System.out.println("一:"+(t3-t2));
Map> fileContent = new LinkedHashMap<>();
fileContent.put("LDAP",new LinkedHashMap(){
private static final long serialVersionUID = 1L;
{
put("ip","1.1.1.1");
put("port","8569");
put("pwd","");
put("user","javac");
}
});
fileContent.put("SAVE",new LinkedHashMap(){
private static final long serialVersionUID = 1L;
{
put("savefiledir","");
put("savefilesubdir","");
put("savemode","");
}
});
fileContent.put("LOG",new LinkedHashMap(){
private static final long serialVersionUID = 1L;
{
put("logDebugOpen","");
put("logFileName","");
}
});
fileContent.put("SEARCH",new LinkedHashMap(){
private static final long serialVersionUID = 1L;
{
put("searchbasedn","");
put("searchfilter","");
put("searchflag","");
put("maxcrls","");
put("postfix","");
put("base64check","");
}
});
fileContent.put("SHECA",new LinkedHashMap(){
private static final long serialVersionUID = 1L;
{
put("LibName","");
}
});
fileContent.put("TIMER",new LinkedHashMap(){
private static final long serialVersionUID = 1L;
{
put("timermode","");
put("timerspan","");
}
});
long t0 = System.currentTimeMillis();
FileUtils.createIniFile("D:\\abc\\test0.ini",fileContent);
long t1 = System.currentTimeMillis();
System.out.println("二:"+(t1-t0));
}
结果如下图(和使用ini4j生成的区别不大,只是没有转义的问题):
查看.ini文件
/**
* 读取文件内容
* @param file 文件
* @return
* @throws IOException
*/
public static Map> readIniFile(File file) throws IOException {
//存放所有的数据
Map> dataMap = new HashMap<>();
//存放session下的所有value值
Map paramaters = null;
try (BufferedReader br = new BufferedReader(new FileReader(file));){
//读取的行
String readLine = "";
//正则
String regex = "\\[\\w+\\]";
//存放读取的session
String session = "";
//存放key和value值
String[] map = null;
while ((readLine = br.readLine()) != null){
if(null != readLine && !"".equals(readLine)){
if(readLine.matches(regex)){
if(null != session && !"".equals(session)){
dataMap.put(session,paramaters);
}
paramaters = new HashMap<>();
session = readLine.substring(1,readLine.length()-1);
} else {
map = readLine.split(" = ");
paramaters.put(map[0],map.length>1 ? map[1] : "");
}
}
}
dataMap.put(session,paramaters);
return dataMap;
}
}
测试代码及其输出结果
@Test
public void testReadIniFile(){
Map> dataMap = FileUtils.readIniFile(new File("D:\\abc\\test0.ini"));
dataMap.forEach((k,v)->{
System.out.println("["+k+"]");
v.forEach((key,value)->{
System.out.println(key+" = "+value);
});
});
}
//打印结果和图片里的内容是一致的
[LDAP]
port = 8569
ip = 1.1.1.1
pwd =
user = javac
[LOG]
logFileName =
logDebugOpen =
[SEARCH]
searchbasedn =
searchfilter =
searchflag =
postfix =
base64check =
maxcrls =
[TIMER]
timermode =
timerspan =
[SAVE]
savemode =
savefilesubdir =
savefiledir =
[SHECA]
LibName =
Process finished with exit code 0
单行写入
/**
* 修改文件中某个值得属性
* @param filePath 文件路径
* @param section 区块
* @param key 键
* @param value 值
* @return 保存是否成功
* @throws IOException
*/
public static boolean setIniFileString(File file,String section,String key,Object value) throws IOException{
if(!file.exists()){
return false;
}
String readLine = "";
StringBuilder sb = new StringBuilder();
boolean sectionFlag = false;
boolean changeFlag = false;
String readKey = "";
try(BufferedReader bufferedReader = new BufferedReader(new FileReader(file));){
while ((readLine=bufferedReader.readLine())!=null) {
if(readLine.trim().equals(section)){
sectionFlag = true;
}
if(readLine.contains("[") && readLine.contains("]")){
if(!readLine.trim().equals(section)){
sectionFlag = false;
}
}
if(sectionFlag && readLine.contains(key)){
readKey = readLine.substring(0,readLine.indexOf(" "));
if(readKey.equals(key)){
readLine = readKey + " = "+value;
changeFlag = true;
}
}
sb.append(readLine+"\r\n");
}
if(!changeFlag){
return false;
}
} catch (Exception e){
throw new IOException("文件读取或写入异常");
}
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));){
bufferedWriter.write(sb.toString());
bufferedWriter.flush();
}catch (Exception e){
e.printStackTrace();
}
return true;
}
测试代码及结果
@Test
public void test(){
File file = new File("D:\\abc\\test0.ini");
FileUtils.setIniFileString(file,"LDAP","ip","8.8.8.8");
Map> dataMap = FileUtils.readIniFile(new File("D:\\abc\\test0.ini"));
dataMap.forEach((k,v)->{
System.out.println("["+k+"]");
v.forEach((key,value)->{
System.out.println(key+" = "+value);
});
});
}
//打印结果
[LDAP]
port = 8569
ip = 8.8.8.8
pwd =
user = javac
[LOG]
logFileName =
logDebugOpen =
[SEARCH]
searchbasedn =
searchfilter =
searchflag =
postfix =
base64check =
maxcrls =
[TIMER]
timermode =
timerspan =
[SAVE]
savemode =
savefilesubdir =
savefiledir =
[SHECA]
LibName =
Process finished with exit code 0
这个和ini4j相比,有一个差距很大的地方就是写入的时候,一次只能写入一行,而且需要读取源文件,然后比对是否匹配,对上才修改。而Ini4j是可以同时修改一行或多行。目前没有想到什么可行的办法,只能去拜读源码了。日后继续更新!
java 读取带section_手把手教你实现类似ini4j的方式创建读取和修改.ini文件(支持section)...相关推荐
- 微信小程序手把手教你实现类似Android中ViewPager控件效果
微信小程序手把手教你实现类似Android中ViewPager控件效果 前言 需求分析 头部TAB 滑动的内容部分 最终版本 尾巴 前言 在做Android开发的时候,ViewPager是开发者使用频 ...
- 手把手教你python自动化办公(三)---PPT批量修改
手把手教你python自动化办公(三)---PPT批量修改 PPT批量修改 场景模拟:当公司让你制作10000个不同数据但背景相同的PPT时,你是干上三天,还是小手一挥,十秒搞定? 1.设计你想要的P ...
- java编写爬虫_手把手教你从零开始用Java写爬虫
本文将手把手地教大家从零开始用Java写一个简单地爬虫! 目标 爬取全景网图片,并下载到本地 收获 通过本文,你将复习到:IDEA创建工程 IDEA导入jar包 爬虫的基本原理 Jsoup的基本使用 ...
- 效率工具 001 | 手把手教你满速(不限速)下载百度网盘文件
百度网盘,曾用名百度云(Baidu Cloud),是百度推出的一项个人云存储服务,覆盖中国大陆各大主流计算机和手机操作系统,包含Web版.Windows版.Mac版.Android版和iPhone版. ...
- java 修改ini文件_java读取和修改ini配置文件 | 学步园
/* * ConfigurationFile.java * * Created on 2009年4月15日, 下午1:36 * * To change this template, choose To ...
- 手把手教你在虚幻四(UE4)里面创建属于自己的海景房
这篇文章是我看哔哩哔哩上学习的笔记,学习的地址如下: https://www.bilibili.com/video/BV164411Y732?t=168&p=15 因本人才疏学浅,如有错误之处 ...
- java 修改ini文件_Java读取和修改ini配置文件
/** * 修改ini配置文档中变量的值 * @param file 配置文档的路径 * @param section 要修改的变量所在段名称 * @param variable 要修改的变量名称 * ...
- 手把手教安装java开发环境_手把手教你配置java开发环境-java环境变量设置
在本篇中将为大家介绍如何在windows下搭建Java的开发环境. 话不多说,直接转入正题.下载java开发工具包JDK 下载地址:http://www.oracle.com/technetwork/ ...
- java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)
2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...
最新文章
- 零基础学java培训怎么选择学校
- Java编程中,有哪些好的习惯从一开始就值得坚持?
- Linux服务器---网络配置
- 2018常见的java面试题_2018新版Java常见面试题
- FileSystemMap:与文件系统交互的自然方法
- 不高兴的津津(信息学奥赛一本通-T1111)
- FreeRTOS内核实现05:支持多优先级
- java常用面板_Java 常用面板
- tomcat报错无法启动组件_微软正在修复Windows Server无法启动的0xc0000001报错故障
- 计算C(n,0)+C(n,1)+...+C(n,m)--Problem B. Harvest of Apples
- 从源码分析HashSet集合
- 黄色量能通达信指标公式!没有未来函数,不加密的副图指标!
- 关于微信小程序下拉刷新、上拉触底方法的实现
- 关闭appleid双重认证_Apple ID 被停用如何解决?
- java实现高清图片剪切
- 我的个人成长(1-3年)
- BootStrap 移动设备优先代码
- 高度可定制可用于商用目的全流程供应链系统(全部源码)
- 多益2980邮箱集合专业游戏服务免费安全的电子邮箱
- 西瓜视频解析原理及源码,使用CRC32的签名算法,获得视频源地址