Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用indexOf()方法解析文件_Java_String_Performance_Parsing_Indexof - Fatal编程技术网

在Java中使用indexOf()方法解析文件

在Java中使用indexOf()方法解析文件,java,string,performance,parsing,indexof,Java,String,Performance,Parsing,Indexof,在stackoverflow中进行验证后,我使用indexOf方法解析文件中的值。下面是我的文件格式- 10/05/2005 10:02;AM;a@xyz.com;student=student1 std=X marks=87 rollnumber=102 10/05/2005 10:05;AM;b@xyz.com;student=student2 std=IX rollnumber=26 10/05/2005 10:15;PM;c@xyz.com;student=student3 std=VI

在stackoverflow中进行验证后,我使用indexOf方法解析文件中的值。下面是我的文件格式-

10/05/2005 10:02;AM;a@xyz.com;student=student1 std=X marks=87 rollnumber=102
10/05/2005 10:05;AM;b@xyz.com;student=student2 std=IX rollnumber=26
10/05/2005 10:15;PM;c@xyz.com;student=student3 std=VII marks=87 attandance=5 rollnumber=12
10/05/2005 10:32;AM;d@xyz.com;student=student4 std=V marks=87 rollnumber=69
注意:电子邮件中的域名(即xyz.com)在任何地方都不会更改。 下面是我目前正在使用的代码片段-

            FileInputStream fis = new FileInputStream(file);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    fis));

            String line = "";
            while ((line = br.readLine()) != null) {

                int index = -1;

                if ((index = line.indexOf("xyz.com")) != -1) {
                    int inStudent = line.indexOf("student=", index);
                    int spaceExistsinStudent = -1;
                    int studentIndex = -1;

                    if ((spaceExistsinStudent = line.indexOf("student=\"", inStudent)) != -1)
                        studentIndex = line.indexOf(" ", inStudent);
                    else
                        studentIndex = line.indexOf("\" ", spaceExistsinStudent);

                    int inSTD = line.indexOf("std=", studentIndex);
                    int spaceExistsinSTD = -1;
                    int stdIndex = -1;

                    if ((spaceExistsinSTD = line.indexOf("std=\"", inSTD)) != -1)
                        stdIndex = line.indexOf(" ", inSTD);
                    else
                        stdIndex = line.indexOf("\" ", spaceExistsinSTD);

                    String studentName = line.substring(inStudent + 9, studentIndex);
                    String stdName = line.substring(inSTD + 4, stdIndex);

不需要粘贴整个代码。好的,使用上面的实现,我能够工作,但是考虑到性能,这是有效的解决方案吗?有没有更好的方法来达到同样的效果。。。。提前感谢您。

您不需要对所有内容都使用indexOf。如果您想查看一个字符,您可以使用charAt,例如,您正在检查“”的位置


我会使用提取字段值的方法来简化代码。

您不需要对所有内容都使用indexOf。如果您想查看一个字符,您可以使用charAt,例如,您正在检查“”的位置


我会使用提取字段值的方法来简化代码。

我建议使用StringTokenizer而不是indexOf。基本上,您可以根据一些分隔符拆分字符串,例如:

while循环中的示例

        StringTokenizer st = new StringTokenizer(line,";");


        st.nextToken(); //Date
        st.nextToken(); //AM
        String email = st.nextToken();
        String values = st.nextToken();

        StringTokenizer st2 = new StringTokenizer(values," ");


        while (st2.hasMoreElements()) {
            String token = (String) st2.nextElement();
            if(token.startsWith("student=")){
                System.out.println(token.substring("student=".length()));
            }else if(token.startsWith("std=")){
                System.out.println(token.substring("std=".length()));
            }

        }

我建议使用StringTokenizer而不是indexOf。基本上,您可以根据一些分隔符拆分字符串,例如:

while循环中的示例

        StringTokenizer st = new StringTokenizer(line,";");


        st.nextToken(); //Date
        st.nextToken(); //AM
        String email = st.nextToken();
        String values = st.nextToken();

        StringTokenizer st2 = new StringTokenizer(values," ");


        while (st2.hasMoreElements()) {
            String token = (String) st2.nextElement();
            if(token.startsWith("student=")){
                System.out.println(token.substring("student=".length()));
            }else if(token.startsWith("std=")){
                System.out.println(token.substring("std=".length()));
            }

        }

正如我在前面的评论中所说,我很惊讶解析是这里的瓶颈。但是,如果你想知道其他方法,你可以这样做,只是尝试一下,看看哪一种是最快的,这里还有两个想法没有发布-使用.split:

或使用正则表达式:

private static final Pattern PATTERN = Pattern.compile("([^;]+);([^;]+);([^;]+);student=([^ ]+) std=([^ ]+) marks=([^ ]+) rollnumber=([^ ]+)");

Matcher m = PATTERN.matcher(line);
m.find();
String dateTime = m.group(1);
String ampm = m.group(2);
String email = m.group(3);
String student = m.group(4);
String std = m.group(5);
String marks = m.group(6);
String rollnumber = m.group(7);

正如我在前面的评论中所说,我很惊讶解析是这里的瓶颈。但是,如果你想知道其他方法,你可以这样做,只是尝试一下,看看哪一种是最快的,这里还有两个想法没有发布-使用.split:

或使用正则表达式:

private static final Pattern PATTERN = Pattern.compile("([^;]+);([^;]+);([^;]+);student=([^ ]+) std=([^ ]+) marks=([^ ]+) rollnumber=([^ ]+)");

Matcher m = PATTERN.matcher(line);
m.find();
String dateTime = m.group(1);
String ampm = m.group(2);
String email = m.group(3);
String student = m.group(4);
String std = m.group(5);
String marks = m.group(6);
String rollnumber = m.group(7);

即使域名在未来的近似中不会改变,您也应该编写代码,而不是将其嵌入逻辑中的固定字符串中。至少让它成为一个成员变量,这样就可以在将来更改它而不会浪费太多精力。或者更好的是,让它成为一个方法的参数,并且在你需要它的时候假装配置子系统。是的,我会记住它。即使域名在未来的近似中不会改变,你也应该编写你的代码,而不是把它嵌入到你逻辑中的一个固定的字符串中。至少让它成为一个成员变量,这样就可以在将来更改它而不会浪费太多精力。或者更好的是,将其作为方法的一个参数,并在以后需要时伪造配置子系统。是的,我会记住它…你能告诉我更多细节吗?你能告诉我更多细节吗?你似乎是对的。但是现在我只担心表现。在执行时间方面,您如何看待您的实现?性能上的瓶颈几乎肯定不是解析代码,而是磁盘IO。但是是的,StringTokenizer很快,理论上这个实现应该比使用indexOf更快,因为它只扫描输入行一次。@JoeK:让我在我的机器上运行两个版本并触发执行time@JoeK:遗憾的是,StringTokenizer花费的时间是indexOf的1.5倍。我之所以选择indeOf,是因为它的性能比我在前面的问题中提到的StringTokenizer更好。你似乎是对的。但是现在我只担心表现。在执行时间方面,您如何看待您的实现?性能上的瓶颈几乎肯定不是解析代码,而是磁盘IO。但是是的,StringTokenizer很快,理论上这个实现应该比使用indexOf更快,因为它只扫描输入行一次。@JoeK:让我在我的机器上运行两个版本并触发执行time@JoeK:遗憾的是,StringTokenizer花费的时间是indexOf的1.5倍。我之所以选择indeOf,是因为它的性能比我在前面的问题中提到的StringTokenizer更好。在开始开发过程之前,我引用了这个链接。在开始开发过程之前,我引用了这个链接。