2015-06-07 23 views
2

我正在尝试读取文本文件并将其分成块。下面是输入文本文件的模式:在块中划分文本文件

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的每个值将是作业定义,即从DEFINE JOB ID到下一个DEFINE JOB 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中的条目,并在下一条目覆盖旧的条目并创建新条目即

Loop1: 
key, value 
1, 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' 

Loop2: 
key, value 
1,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' 

2,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' 
.... 

,并在第一时间在循环结束时,它在第二个while循环中不会打印任何内容,即它会删除HashMap中的所有条目。

我无法调试它,并在过去两天内停留在此。帮助将不胜感激。

如果您需要更多说明,请让我知道。

感谢

回答

1

我想这是因为你把StringBuffer对象本身到HashMap作为一个值,因为它是一个Object,代码指向同一区域内存无论何时何地,你访问它。这意味着当您将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 = 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"); 
    } 

希望这有助于。

+0

感谢您的时间。您提供的代码在'stringBuffer.append(line)' – Explorer

+0

处给出空点异常。我更改了代码。 NullPointerException是由于文本文件没有以“DEFINE JOB ID”开头而导致的,使得代码尝试附加到尚未实例化的StringBuffer。 – theguywhodreams

+1

感谢@thehuywhodreams的评论。更改后的代码也无法正常工作,但您共享的逻辑/概念帮助我进行更改,现在我已拥有工作代码。 (line.contains(“DEFINE JOB ID”)){ \t StringBuffer sb = new StringBuffer(stringBuffer); (i,sb); \t jobdef.put(i,sb); \t i ++; \t stringBuffer.setLength(0); \t}' – Explorer