背景

由于这次任务是和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)...相关推荐

  1. 微信小程序手把手教你实现类似Android中ViewPager控件效果

    微信小程序手把手教你实现类似Android中ViewPager控件效果 前言 需求分析 头部TAB 滑动的内容部分 最终版本 尾巴 前言 在做Android开发的时候,ViewPager是开发者使用频 ...

  2. 手把手教你python自动化办公(三)---PPT批量修改

    手把手教你python自动化办公(三)---PPT批量修改 PPT批量修改 场景模拟:当公司让你制作10000个不同数据但背景相同的PPT时,你是干上三天,还是小手一挥,十秒搞定? 1.设计你想要的P ...

  3. java编写爬虫_手把手教你从零开始用Java写爬虫

    本文将手把手地教大家从零开始用Java写一个简单地爬虫! 目标 爬取全景网图片,并下载到本地 收获 通过本文,你将复习到:IDEA创建工程 IDEA导入jar包 爬虫的基本原理 Jsoup的基本使用 ...

  4. 效率工具 001 | 手把手教你满速(不限速)下载百度网盘文件

    百度网盘,曾用名百度云(Baidu Cloud),是百度推出的一项个人云存储服务,覆盖中国大陆各大主流计算机和手机操作系统,包含Web版.Windows版.Mac版.Android版和iPhone版. ...

  5. java 修改ini文件_java读取和修改ini配置文件 | 学步园

    /* * ConfigurationFile.java * * Created on 2009年4月15日, 下午1:36 * * To change this template, choose To ...

  6. 手把手教你在虚幻四(UE4)里面创建属于自己的海景房

    这篇文章是我看哔哩哔哩上学习的笔记,学习的地址如下: https://www.bilibili.com/video/BV164411Y732?t=168&p=15 因本人才疏学浅,如有错误之处 ...

  7. java 修改ini文件_Java读取和修改ini配置文件

    /** * 修改ini配置文档中变量的值 * @param file 配置文档的路径 * @param section 要修改的变量所在段名称 * @param variable 要修改的变量名称 * ...

  8. 手把手教安装java开发环境_手把手教你配置java开发环境-java环境变量设置

    在本篇中将为大家介绍如何在windows下搭建Java的开发环境. 话不多说,直接转入正题.下载java开发工具包JDK 下载地址:http://www.oracle.com/technetwork/ ...

  9. java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)

    2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...

最新文章

  1. 零基础学java培训怎么选择学校
  2. Java编程中,有哪些好的习惯从一开始就值得坚持?
  3. Linux服务器---网络配置
  4. 2018常见的java面试题_2018新版Java常见面试题
  5. FileSystemMap:与文件系统交互的自然方法
  6. 不高兴的津津(信息学奥赛一本通-T1111)
  7. FreeRTOS内核实现05:支持多优先级
  8. java常用面板_Java 常用面板
  9. tomcat报错无法启动组件_微软正在修复Windows Server无法启动的0xc0000001报错故障
  10. 计算C(n,0)+C(n,1)+...+C(n,m)--Problem B. Harvest of Apples
  11. 从源码分析HashSet集合
  12. 黄色量能通达信指标公式!没有未来函数,不加密的副图指标!
  13. 关于微信小程序下拉刷新、上拉触底方法的实现
  14. 关闭appleid双重认证_Apple ID 被停用如何解决?
  15. java实现高清图片剪切
  16. 我的个人成长(1-3年)
  17. BootStrap 移动设备优先代码
  18. 高度可定制可用于商用目的全流程供应链系统(全部源码)
  19. 多益2980邮箱集合专业游戏服务免费安全的电子邮箱
  20. 西瓜视频解析原理及源码,使用CRC32的签名算法,获得视频源地址

热门文章

  1. 用Python写个简单的推荐系统(一)
  2. 关于runat = “server”
  3. 为什么不建议在MySQL中使用 utf8 ?
  4. 网贷之家被爆问题频出,折射P2P排名乱象
  5. LeetCode——1636.按照频率将数组升序排序
  6. node.js 使用nodemailer发送qq邮件
  7. 横向对比主流BI软件优势,企业要按需选择
  8. 足病危害不容忽视 鞋柜革命势在必行
  9. OutLook 2007 本地归档
  10. 利用Python对NBA SportUV数据进行可视化及分析