Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 在块中分割文本文件_Java_Collections - Fatal编程技术网

Java 在块中分割文本文件

Java 在块中分割文本文件,java,collections,Java,Collections,我试图读取一个文本文件并将其划分为块。以下是输入文本文件的模式: DEFINE JOBSET ID=jobset_def FAILCOND=(1,9999) DEFINE JOB ID=(jobset_def,job1_def,0010) DESCRIPTION='Checks the data file against the token file' DEFINE JOBPARM ID=(jobset_def,job1_def,0010) SUBFILE=/scripts/chk_file

我试图读取一个文本文件并将其划分为块。以下是输入文本文件的模式:

DEFINE JOBSET ID=jobset_def FAILCOND=(1,9999)

DEFINE JOB ID=(jobset_def,job1_def,0010) 
DESCRIPTION='Checks the data file against the token file'
DEFINE JOBPARM ID=(jobset_def,job1_def,0010) SUBFILE=/scripts/chk_file.ksh SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2.dat'

DEFINE JOB ID=(jobset_def,job2_def,0030)  
DEFINE JOBPARM ID=(jobset_def,job2_def,0030)
SUBFILE='exec_sess_instance.ksh' SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2'
.......
我想将文本文件分成更小的块,并将其存储到HashMap中。HashMap的每个值都将是作业定义,即从定义作业ID到下一个定义作业ID。下面是我的代码:

public class UpdateJobs {
    public static void main(String[] args) throws IOException {
    File file = new File("H:/Project_Documents/ALM/ns_pbds_gwm_uscore_account_omx.txt");
    FileReader fileReader = new FileReader(file);
    HashMap <Integer, StringBuffer> jobdef= new HashMap <Integer, StringBuffer>();
    int i=1;
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }
    fileReader.close();
    while(keySetIterator.hasNext()){
          Integer key = keySetIterator.next();
          System.out.println("key: " + key + " value: " + jobdef.get(key));
            }           
    }
}
在循环结束时,它在第二个while循环中不打印任何内容,即删除HashMap中的所有条目

我无法调试它,在过去的两天里一直坚持这个。我们将不胜感激

请让我知道,如果你需要更多的澄清


谢谢

我认为这是因为您将
StringBuffer
对象本身作为一个值放入
HashMap
中,并且由于它是一个
对象
,所以无论何时何地访问它,代码都指向内存中的同一区域。这意味着当您将
stringBuffer
放入
HashMap
并随后更改其内容时,
HashMap
中的内容也会更改

一个快速修复方法是在每次读取行中的“DEFINE JOB ID”时实例化一个
new StringBuffer()
对象

这意味着改变这一点:

    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }
StringBuffer StringBuffer=新的StringBuffer();
迭代器keySetIterator=jobdef.keySet().Iterator();
弦线;
而((line=bufferedReader.readLine())!=null){
if(第行包含(“定义作业ID”)){
jobdef.put(i,stringBuffer);
i++;
stringBuffer.setLength(0);
}
stringBuffer.append(行);
//System.out.println(“行为”+行);
stringBuffer.append(“\n”);
}
为此:

    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            stringBuffer = new StringBuffer();
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }
StringBuffer StringBuffer=新的StringBuffer();
迭代器keySetIterator=jobdef.keySet().Iterator();
弦线;
而((line=bufferedReader.readLine())!=null){
if(第行包含(“定义作业ID”)){
stringBuffer=新的stringBuffer();
jobdef.put(i,stringBuffer);
i++;
stringBuffer.setLength(0);
}
stringBuffer.append(行);
//System.out.println(“行为”+行);
stringBuffer.append(“\n”);
}

希望这能有所帮助。

谢谢您抽出时间。您提供的代码在
stringBuffer.append(line)
I更改了代码时出现空点异常。导致NullPointerException的原因是文本文件不是以“DEFINE JOB ID”开头的,这使得代码试图附加到尚未实例化的StringBuffer。感谢@TheHuyHoDreams的评论。更改后的代码也不起作用,但是您共享的逻辑/概念帮助我进行了更改,现在我有了工作代码
if(line.contains(“DEFINE JOB ID”){StringBuffer sb=newstringbuffer(StringBuffer);jobdef.put(i,sb);i++;StringBuffer.setLength(0);}
    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            stringBuffer = new StringBuffer();
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }