java 解析 *.ini 文件 生成树状结构菜单

时间:2023-02-09 21:34:27
用java 解析 *.ini 文件 生成树状结构菜单


ini 文件内容:
[总菜单]
1001 = 菜单1
1002 = 菜单2
1003 = 菜单3
1004 = 菜单4
1005 = 菜单5
1006 = 菜单6

[1001]
1000101 = 菜单1-1
1000102 = 菜单1-2
1000103 = 菜单1-3
1000104 = 菜单1-4

[1000101]
100010101 = 菜单1-1-1
100010102 = 菜单1-1-2
100010103 = 菜单1-1-3

14 个解决方案

#1


这个应该很简单吧,
把每一个
[总菜单] 
1001 = 菜单1 
1002 = 菜单2 
1003 = 菜单3 
1004 = 菜单4 
1005 = 菜单5 
1006 = 菜单6

这样的结构中的
[总菜单]为key,剩余数据存到一个list中做value,一个递归+循环就可以了,至于创建树形结构的时候推荐使用DefaultMutableTreeNode,这个创建树比较好用

#2


呃,更正一下上面的话:[总菜单]为key,剩余数据存到一个list中做value,存储到HashTable中

#3


关注

#4


public class ConfigFile {
private String sCon;
private String str = null;

public ConfigFile() {

}

public void readFile(File file) throws IOException {
InputStream input;
LinkedHashMap<String, String> v1 = new LinkedHashMap<String, String>();
HashMap<String, LinkedHashMap<String, String>> v2 = new HashMap<String, LinkedHashMap<String, String>>();

FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);

String str = null;
String key = null;
while ((str = br.readLine()) != null) {
str = str.trim();
if (str.indexOf("=") == -1
&& (str.indexOf("[") == -1 && str.indexOf("]") == -1)) {
continue;
}

if (str.indexOf("[") != -1 && str.indexOf("]") != -1) {
key = str.replace("[", "").replace("]", "");
}

if (key == null) {
continue;
}

String[] strs = null;
int index = str.indexOf("=");
if (index != -1) {
if (key.equals("总菜单")) {
strs = str.split("=");
if(strs == null || strs.length != 2){
continue;
}
v1.put(strs[0].trim(), strs[1].trim());
} else {
if (v2.containsKey(key)) {
LinkedHashMap<String, String> mp = v2.get(key);
strs = str.split("=");
if(strs == null || strs.length != 2){
continue;
}
mp.put(strs[0].trim(), strs[1].trim());
} else {
LinkedHashMap<String, String> mp = new LinkedHashMap<String, String>();
v2.put(key, mp);

strs = str.split("=");
if(strs == null || strs.length != 2){
continue;
}
mp.put(strs[0].trim(), strs[1].trim());
}
}
}
}
System.out.println();
}

public static void main(String[] args) throws IOException{
ConfigFile config = new ConfigFile();
config.readFile(new File("C:\\Documents and Settings\\gongfl\\桌面\\1.ini"));
}
}

#5



ini 文件内容可以这样: 

1001 = 菜单1 
1002 = 菜单2 
1003 = 菜单3 
1004 = 菜单4 
1005 = 菜单5 
1006 = 菜单6 

1000101 = 菜单1-1 
1000102 = 菜单1-2 
1000103 = 菜单1-3 
1000104 = 菜单1-4 

100010101 = 菜单1-1-1 
100010102 = 菜单1-1-2 
100010103 = 菜单1-1-3

然后用Properties对象加载进来,
然后再用算出它的子级别,
这样就不用去解析代码,
会方便一点,
因为你的键值都是有规律的,
所以应该可以用这样的方式处理

#6


学习

#7


引用 4 楼 gongfuliang 的回复:
Java codepublic class ConfigFile {
    private String sCon;
    private String str = null;

    public ConfigFile() {

    }

    public void readFile(File file) throws IOException {
        InputStream input;
        LinkedHashMap<String, String> v1 = new LinkedHashMap<String, String>();
        HashMap<String, LinkedHashMap<String, String>> v2 = new HashMap<String, LinkedHashMap<Str…


学习啦

#8


学习!

#9


ini 文件内容可以这样: 

1001 = 菜单1 
1002 = 菜单2 
1003 = 菜单3 
1004 = 菜单4 
1005 = 菜单5 
1006 = 菜单6 

1000101 = 菜单1-1 
1000102 = 菜单1-2 
1000103 = 菜单1-3 
1000104 = 菜单1-4 

100010101 = 菜单1-1-1 
100010102 = 菜单1-1-2 
100010103 = 菜单1-1-3 

然后用Properties对象加载进来, 
然后再用算出它的子级别, 
这样就不用去解析代码, 
会方便一点, 
因为你的键值都是有规律的, 
所以应该可以用这样的方式处理 

#10


完全看不懂啊!!!!!!!!!

#11


自己解析文件而已了,很简单的,给你写个sample

import java.io.*;
import java.util.*;

public class IniConfig {
    private File file;
    private Map<String, Map<String, String>> map = new LinkedHashMap<String, Map<String, String>>();

    public IniConfig(File file) throws Exception {
        this.file = file;
        load();
    }
    
    public IniConfig(String fileName) throws Exception {
        this(new File(fileName));
    }
    
    private void load() throws Exception {
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        String buf, seg=null;
        while ((buf = raf.readLine()) != null) {
            buf = buf.trim();
            if (buf.startsWith(";")) continue; //注释行不要
            if (buf.length() == 0) continue;   //空行不要
            int index = buf.indexOf("=");
            if (buf.matches("^\\[(.*?)\\]$")) { //如果是[]行
                seg = buf.substring(1, buf.length()-1);
                if (! map.containsKey(seg)) {map.put(seg, new LinkedHashMap<String, String>());}
            } else if (index > 0) { //如果是xxx=yyy行
                String v1 = buf.substring(0, index).replaceAll("^\\s*|\\s*$", ""); //=前半部
                String v2 = buf.substring(index+1).replaceAll("^\\s*|\\s*$", ""); //=后半部
                if (seg == null) { //如果不存在[]项目,都归于总的一个节点
                    seg = String.format("ini-%d", file.hashCode());
                    if (!map.containsKey(seg)) {map.put(seg, new LinkedHashMap<String, String>());}
                }
                map.get(seg).put(v1, v2);
            }
        }
        raf.close();
    }
    
    public String[] getAllSeg() { //获取所有[]
        return map.keySet().toArray(new String[0]);
    }
    
    public Map<String, String> getItems(String seg) { //获取某个[]下的所有xxx=yyyy
        return Collections.unmodifiableMap(map.get(seg));
    }
    
    public String getItem(String seg, String key) { //获取某个[]下的xxx的yyy
        return map.get(seg).get(key);
    }
    
    public boolean containsSeg(String seg) {
        return map.containsKey(seg);
    }
    
    public boolean containsItemKey(String key) {
        for (Map<String, String> m : map.values()) {
            if (m.containsKey(key)) {return true;}
        }
        return false;
    }
    
    public boolean containsItemValue(String value) {
        for (Map<String, String> m : map.values()) {
            if (m.containsValue(value)) {return true;}
        }
        return false;
    }
    
    public static void main(String[] args) throws Exception{
        IniConfig ini = new IniConfig("test.ini");
        String[] seg = ini.getAllSeg();
        for (String s : seg) {
            System.out.printf("[%s]\n", s);
            for (Map.Entry<String, String> e : ini.getItems(s).entrySet()) {
                System.out.printf("%s = %s\n", e.getKey(), e.getValue());
            }
        }
    }
}

#12



package util;

import java.io.*;
import java.util.*;

public class IniConfig {
private File file;
private Map<String, Map<String, String>> map = new LinkedHashMap<String, Map<String, String>>();

public IniConfig(File file) throws Exception {
this.file = file;
load();
}

public IniConfig(String fileName) throws Exception {
this(new File(fileName));
}

private void load() throws Exception {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
String buf, seg = null;
while ((buf = raf.readLine()) != null) {
buf = buf.trim();
if (buf.startsWith(";"))
continue; // 注释行不要
if (buf.length() == 0)
continue; // 空行不要

int splitIndex = buf.indexOf(";"); //去掉注释
if(splitIndex>1){
buf = buf.substring(0, splitIndex-1).trim();
}

int index = buf.indexOf("=");
if (buf.matches("^\\[(.*?)\\]$")) { // 如果是[]行
seg = buf.substring(1, buf.length() - 1);
if (!map.containsKey(seg)) {
map.put(seg, new LinkedHashMap<String, String>());
}
} else if (index > 0) { // 如果是xxx=yyy行
String v1 = buf.substring(0, index).replaceAll("^\\s*|\\s*$", ""); // =前半部
String v2 = buf.substring(index + 1).replaceAll("^\\s*|\\s*$", ""); // =后半部
if (seg == null) { // 如果不存在[]项目,都归于总的一个节点
seg = String.format("ini-%d", file.hashCode());
if (!map.containsKey(seg)) {
map.put(seg, new LinkedHashMap<String, String>());
}
}
map.get(seg).put(v1, v2);
}
}
raf.close();
}

public String[] getAllSeg() { // 获取所有[]
return map.keySet().toArray(new String[0]);
}

public Map<String, String> getItems(String seg) { // 获取某个[]下的所有xxx=yyyy
return Collections.unmodifiableMap(map.get(seg));
}

public String getItem(String seg, String key) { // 获取某个[]下的xxx的yyy
return map.get(seg).get(key);
}

public boolean containsSeg(String seg) {
return map.containsKey(seg);
}

public boolean containsItemKey(String key) {
for (Map<String, String> m : map.values()) {
if (m.containsKey(key)) {
return true;
}
}
return false;
}

public boolean containsItemValue(String value) {
for (Map<String, String> m : map.values()) {
if (m.containsValue(value)) {
return true;
}
}
return false;
}

public static void main(String[] args) throws Exception {
IniConfig ini = new IniConfig("d:/test.ini");
        String[] seg = ini.getAllSeg();
        for (String s : seg) {
            System.out.printf("[%s]\n", s);
            for (Map.Entry<String, String> e : ini.getItems(s).entrySet()) {
                System.out.printf("%s = %s\n", e.getKey(), e.getValue());
            }
        }
}
}


#13


在楼上的代码基础上 改了改,希望楼上别介意。

#14


有点难  我不会

#1


这个应该很简单吧,
把每一个
[总菜单] 
1001 = 菜单1 
1002 = 菜单2 
1003 = 菜单3 
1004 = 菜单4 
1005 = 菜单5 
1006 = 菜单6

这样的结构中的
[总菜单]为key,剩余数据存到一个list中做value,一个递归+循环就可以了,至于创建树形结构的时候推荐使用DefaultMutableTreeNode,这个创建树比较好用

#2


呃,更正一下上面的话:[总菜单]为key,剩余数据存到一个list中做value,存储到HashTable中

#3


关注

#4


public class ConfigFile {
private String sCon;
private String str = null;

public ConfigFile() {

}

public void readFile(File file) throws IOException {
InputStream input;
LinkedHashMap<String, String> v1 = new LinkedHashMap<String, String>();
HashMap<String, LinkedHashMap<String, String>> v2 = new HashMap<String, LinkedHashMap<String, String>>();

FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);

String str = null;
String key = null;
while ((str = br.readLine()) != null) {
str = str.trim();
if (str.indexOf("=") == -1
&& (str.indexOf("[") == -1 && str.indexOf("]") == -1)) {
continue;
}

if (str.indexOf("[") != -1 && str.indexOf("]") != -1) {
key = str.replace("[", "").replace("]", "");
}

if (key == null) {
continue;
}

String[] strs = null;
int index = str.indexOf("=");
if (index != -1) {
if (key.equals("总菜单")) {
strs = str.split("=");
if(strs == null || strs.length != 2){
continue;
}
v1.put(strs[0].trim(), strs[1].trim());
} else {
if (v2.containsKey(key)) {
LinkedHashMap<String, String> mp = v2.get(key);
strs = str.split("=");
if(strs == null || strs.length != 2){
continue;
}
mp.put(strs[0].trim(), strs[1].trim());
} else {
LinkedHashMap<String, String> mp = new LinkedHashMap<String, String>();
v2.put(key, mp);

strs = str.split("=");
if(strs == null || strs.length != 2){
continue;
}
mp.put(strs[0].trim(), strs[1].trim());
}
}
}
}
System.out.println();
}

public static void main(String[] args) throws IOException{
ConfigFile config = new ConfigFile();
config.readFile(new File("C:\\Documents and Settings\\gongfl\\桌面\\1.ini"));
}
}

#5



ini 文件内容可以这样: 

1001 = 菜单1 
1002 = 菜单2 
1003 = 菜单3 
1004 = 菜单4 
1005 = 菜单5 
1006 = 菜单6 

1000101 = 菜单1-1 
1000102 = 菜单1-2 
1000103 = 菜单1-3 
1000104 = 菜单1-4 

100010101 = 菜单1-1-1 
100010102 = 菜单1-1-2 
100010103 = 菜单1-1-3

然后用Properties对象加载进来,
然后再用算出它的子级别,
这样就不用去解析代码,
会方便一点,
因为你的键值都是有规律的,
所以应该可以用这样的方式处理

#6


学习

#7


引用 4 楼 gongfuliang 的回复:
Java codepublic class ConfigFile {
    private String sCon;
    private String str = null;

    public ConfigFile() {

    }

    public void readFile(File file) throws IOException {
        InputStream input;
        LinkedHashMap<String, String> v1 = new LinkedHashMap<String, String>();
        HashMap<String, LinkedHashMap<String, String>> v2 = new HashMap<String, LinkedHashMap<Str…


学习啦

#8


学习!

#9


ini 文件内容可以这样: 

1001 = 菜单1 
1002 = 菜单2 
1003 = 菜单3 
1004 = 菜单4 
1005 = 菜单5 
1006 = 菜单6 

1000101 = 菜单1-1 
1000102 = 菜单1-2 
1000103 = 菜单1-3 
1000104 = 菜单1-4 

100010101 = 菜单1-1-1 
100010102 = 菜单1-1-2 
100010103 = 菜单1-1-3 

然后用Properties对象加载进来, 
然后再用算出它的子级别, 
这样就不用去解析代码, 
会方便一点, 
因为你的键值都是有规律的, 
所以应该可以用这样的方式处理 

#10


完全看不懂啊!!!!!!!!!

#11


自己解析文件而已了,很简单的,给你写个sample

import java.io.*;
import java.util.*;

public class IniConfig {
    private File file;
    private Map<String, Map<String, String>> map = new LinkedHashMap<String, Map<String, String>>();

    public IniConfig(File file) throws Exception {
        this.file = file;
        load();
    }
    
    public IniConfig(String fileName) throws Exception {
        this(new File(fileName));
    }
    
    private void load() throws Exception {
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        String buf, seg=null;
        while ((buf = raf.readLine()) != null) {
            buf = buf.trim();
            if (buf.startsWith(";")) continue; //注释行不要
            if (buf.length() == 0) continue;   //空行不要
            int index = buf.indexOf("=");
            if (buf.matches("^\\[(.*?)\\]$")) { //如果是[]行
                seg = buf.substring(1, buf.length()-1);
                if (! map.containsKey(seg)) {map.put(seg, new LinkedHashMap<String, String>());}
            } else if (index > 0) { //如果是xxx=yyy行
                String v1 = buf.substring(0, index).replaceAll("^\\s*|\\s*$", ""); //=前半部
                String v2 = buf.substring(index+1).replaceAll("^\\s*|\\s*$", ""); //=后半部
                if (seg == null) { //如果不存在[]项目,都归于总的一个节点
                    seg = String.format("ini-%d", file.hashCode());
                    if (!map.containsKey(seg)) {map.put(seg, new LinkedHashMap<String, String>());}
                }
                map.get(seg).put(v1, v2);
            }
        }
        raf.close();
    }
    
    public String[] getAllSeg() { //获取所有[]
        return map.keySet().toArray(new String[0]);
    }
    
    public Map<String, String> getItems(String seg) { //获取某个[]下的所有xxx=yyyy
        return Collections.unmodifiableMap(map.get(seg));
    }
    
    public String getItem(String seg, String key) { //获取某个[]下的xxx的yyy
        return map.get(seg).get(key);
    }
    
    public boolean containsSeg(String seg) {
        return map.containsKey(seg);
    }
    
    public boolean containsItemKey(String key) {
        for (Map<String, String> m : map.values()) {
            if (m.containsKey(key)) {return true;}
        }
        return false;
    }
    
    public boolean containsItemValue(String value) {
        for (Map<String, String> m : map.values()) {
            if (m.containsValue(value)) {return true;}
        }
        return false;
    }
    
    public static void main(String[] args) throws Exception{
        IniConfig ini = new IniConfig("test.ini");
        String[] seg = ini.getAllSeg();
        for (String s : seg) {
            System.out.printf("[%s]\n", s);
            for (Map.Entry<String, String> e : ini.getItems(s).entrySet()) {
                System.out.printf("%s = %s\n", e.getKey(), e.getValue());
            }
        }
    }
}

#12



package util;

import java.io.*;
import java.util.*;

public class IniConfig {
private File file;
private Map<String, Map<String, String>> map = new LinkedHashMap<String, Map<String, String>>();

public IniConfig(File file) throws Exception {
this.file = file;
load();
}

public IniConfig(String fileName) throws Exception {
this(new File(fileName));
}

private void load() throws Exception {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
String buf, seg = null;
while ((buf = raf.readLine()) != null) {
buf = buf.trim();
if (buf.startsWith(";"))
continue; // 注释行不要
if (buf.length() == 0)
continue; // 空行不要

int splitIndex = buf.indexOf(";"); //去掉注释
if(splitIndex>1){
buf = buf.substring(0, splitIndex-1).trim();
}

int index = buf.indexOf("=");
if (buf.matches("^\\[(.*?)\\]$")) { // 如果是[]行
seg = buf.substring(1, buf.length() - 1);
if (!map.containsKey(seg)) {
map.put(seg, new LinkedHashMap<String, String>());
}
} else if (index > 0) { // 如果是xxx=yyy行
String v1 = buf.substring(0, index).replaceAll("^\\s*|\\s*$", ""); // =前半部
String v2 = buf.substring(index + 1).replaceAll("^\\s*|\\s*$", ""); // =后半部
if (seg == null) { // 如果不存在[]项目,都归于总的一个节点
seg = String.format("ini-%d", file.hashCode());
if (!map.containsKey(seg)) {
map.put(seg, new LinkedHashMap<String, String>());
}
}
map.get(seg).put(v1, v2);
}
}
raf.close();
}

public String[] getAllSeg() { // 获取所有[]
return map.keySet().toArray(new String[0]);
}

public Map<String, String> getItems(String seg) { // 获取某个[]下的所有xxx=yyyy
return Collections.unmodifiableMap(map.get(seg));
}

public String getItem(String seg, String key) { // 获取某个[]下的xxx的yyy
return map.get(seg).get(key);
}

public boolean containsSeg(String seg) {
return map.containsKey(seg);
}

public boolean containsItemKey(String key) {
for (Map<String, String> m : map.values()) {
if (m.containsKey(key)) {
return true;
}
}
return false;
}

public boolean containsItemValue(String value) {
for (Map<String, String> m : map.values()) {
if (m.containsValue(value)) {
return true;
}
}
return false;
}

public static void main(String[] args) throws Exception {
IniConfig ini = new IniConfig("d:/test.ini");
        String[] seg = ini.getAllSeg();
        for (String s : seg) {
            System.out.printf("[%s]\n", s);
            for (Map.Entry<String, String> e : ini.getItems(s).entrySet()) {
                System.out.printf("%s = %s\n", e.getKey(), e.getValue());
            }
        }
}
}


#13


在楼上的代码基础上 改了改,希望楼上别介意。

#14


有点难  我不会