2013-05-16 38 views
-3

代码应该读取文件并检查它。如果数据类型或关键字或操作。代码编译没有错误,但jTextArea不显示检查的结果。可能是我忘了一些东西,但jTextArea不读任何东西。Java:读取令牌

public boolean IsKeyWords(String x) 
{ 
    List myList = new ArrayList(); 
String[] keywords= new String[] { "for" , "if" , "else" , "return" ,"and" , "goto" , "true" ,"false" , "break" , "continue" , "do" , "this" , "class" , "delete" , "void" , "public" , "private" , "operator" , "static" , "struct" , "volatile" , "while" ,}; 
Collections.addAll(myList, keywords); 
    for(int i = 0;i<myList.size();++i) 
    {if(x.equals(myList.get(i))) 
     return true; 

    } 
    return false; 
}  
public boolean IsOperaions(String x) 
{ 
    List myList1 = new ArrayList(); 
String[] Operations = new String[]{"+", "-" , "*" , "%" , "/" , "=" , ">>=" , "<<=" , "&=" , "+=" , "-=" , "/=" , "*=" , "^=" , "++" , "--" , "==" , "!=" , ">" , "<" , ">=" , "<=" , "!" , "&&" , "||" , "|=" , ">>" , "<<" , "&" , "~" , "^" , "|"}; 
Collections.addAll(myList1, Operations); 
    for(int i = 0;i<myList1.size();++i) 
    {if(x.equals(myList1.get(i))) 
     return true; 

    } 
    return false; 

} 

public boolean IsDatatype(String x) 
{ 
    List myList2 = new ArrayList(); 
    String[] Datatype = new String[]{"int" , "char" ,"float" , "double" , "String"}; 
    Collections.addAll(myList2, Datatype); 
    for(int i = 0;i<myList2.size();++i) 
    {if(x.equals(myList2.get(i))) 
     return true; 

    } 
    return false; 

} 

这里的按钮,当我按下应读取文件并检查它。

private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {           


    JFileChooser chooser = new JFileChooser(); 
    chooser.showOpenDialog(null); 
    File f =chooser.getSelectedFile(); 
    String filename2=f.getAbsolutePath(); 
    BufferedReader br; 
    try { 
     br = new BufferedReader(new FileReader(filename2)); 
    String line; 
    ArrayList <String> tokens=new ArrayList<>(); 
    StringTokenizer words; 
    while ((line = br.readLine()) != null) { 
    words = new StringTokenizer(line); 

    while(words.hasMoreTokens()) 
     { 
     for(int i=0;i<line.length();++i) 
     { 
     tokens.add(line.getBytes().toString()); 

     } 
    words.nextToken(); 

     } 
     for(int i=0;i<tokens.size();i++) 
    { 
     jTextArea1.setText(tokens.get(i).toString()); 

    if(IsKeyWords(tokens.get(i))) 
    { 
    jTextArea1.setText(tokens.get(i).toString()); 
    } 
    else if(IsOperaions(tokens.get(i))) 
    { 
    jTextArea1.setText(tokens.get(i).toString()); 


    }} 
    br.close(); 

    } 
    } 
     catch (FileNotFoundException ex) { 
    } catch (IOException ex) { 
    }  

    }           
+3

'if(x == myList.get(i))'这不是我们如何比较Java中的字符串。这个问题今天被问了两次:_( – Maroun

+0

但是当我使用时,我得到错误 –

+0

仍然我有同样的问题不要读任何东西:( –

回答

0

除了String#equalsString比较问题已经得到了很好的标记,主要的问题是,BufferedReaderbr被读取循环试图调用BufferedReader#readLine时抛出IOException内关闭。移动close语句到finally

} finally { 
    try { 
     br.close(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
} 

另外,添加一个字节数组给令牌List将导致在JTextArea不可读工作。更换

tokens.add(line.getBytes().toString()); 

在Java

tokens.add(line); 

集合使用泛型避免铸造。将它们应用于List的所有实例,例如

List<String> myList = new ArrayList<>(); 
+0

它现在在TextArea中给了我一些东西,但它在文件中不是相同的“[B @ 752719ad” –

+0

为什么要向标记'List'添加一个字节数组?只需添加'line''字符串' – Reimeus

+0

yessssssssss it工作!!! :) –