2010-03-06 2 views
0
import java.io.*; 
import java.util.Scanner; 
import java.util.StringTokenizer; 

public class Filereader { 
    public static void main(String[] args) throws IOException { 

File fil = new File("trans1.txt"); 
FileReader inputFil = new FileReader(fil); 
BufferedReader in = new BufferedReader(inputFil); 

//Create scanner to read contents of a file 
Scanner scanner = new Scanner(new File("trans1.txt")); 

//Create an array to store contents of a file after reading them 
String [] tall = new String [100]; 

int i = 0; 

while(scanner.hasNext()){ 
//Create StringTokenizer object 
    StringTokenizer st = new StringTokenizer(scanner.next(),"< , { } >", true); 
    tall[i] = scanner.next(); 
    System.out.println(tall[i]); 
    i++; 
    } 
    in.close(); 
    } 
} 

위 코드를 사용하여 파일의 내용을 배열로 읽고 배열에 저장된 값을 화면에 인쇄하려고합니다. 내가 코드를 실행할 때마다 원하는 출력을 얻지 못하며, 누군가 도와 주실 수 있습니까? 내 파일의 내용은 다음과 같습니다. 여기토큰 화기를 사용하는 파일 조작

5 
<0,{p1}> 
<0,{p1}> -1-> <1> 
<1,{p1}> -2-> <2><3> 
<2,{p0}> -1-> <0> 
<3,{p1}> -1-> <4> 
<4,{p0}> -1-> <3> 
+1

각 탭마다 4 개의 공백을 삽입하도록 texteditor/IDE를 구성하십시오. – BalusC

답변

1

내가 그것을 할 거라고 방법은 다음과 같습니다

package cruft; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.Reader; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 
import java.util.StringTokenizer; 

public class FileTokenizer 
{ 
    private static final String DEFAULT_DELIMITERS = "< , { } >"; 
    private static final String DEFAULT_TEST_FILE = "data/trans1.txt"; 

    public static void main(String[] args) 
    { 
     try 
     { 
      String fileName = ((args.length > 0) ? args[0] : DEFAULT_TEST_FILE); 
      FileReader fileReader = new FileReader(new File(fileName)); 
      FileTokenizer fileTokenizer = new FileTokenizer(); 
      List<String> tokens = fileTokenizer.tokenize(fileReader); 
      System.out.println(tokens); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public List<String> tokenize(Reader reader) throws IOException 
    { 
     List<String> tokens = new ArrayList<String>(); 

     BufferedReader br = null; 

     try 
     { 
      br = new BufferedReader(reader); 
      Scanner scanner = new Scanner(br); 
      while (scanner.hasNext()) 
      { 
       StringTokenizer st = new StringTokenizer(scanner.next(), DEFAULT_DELIMITERS, true); 
       while (st.hasMoreElements()) 
       { 
        tokens.add(st.nextToken());      
       } 
      } 
     } 
     finally 
     { 
      close(br); 
     } 

     return tokens; 
    } 

    public static void close(Reader r) 
    { 
     try 
     { 
      if (r != null) 
      { 
       r.close(); 
      } 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

을 그리고 여기이 파일에 대해 그것을 실행하면 내가 얻을 것이라고 출력입니다 : 당신은 말을하지 않습니다

C:\JDKs\jdk1.6.0_13\bin\java cruft.FileTokenizer 
[5, <, 0, ,, {, p1, }, >, <, 0, ,, {, p1, }, >, -1-, >, <, 1, >, <, 1, ,, {, p1, }, >, -2-, >, <, 2, >, <, 3, >, <, 2, ,, {, p0, }, >, -1-, >, <, 0, >, <, 3, ,, {, p1, }, >, -1-, >, <, 4, >, <, 4, ,, {, p0, }, >, -1-, >, <, 3, >] 

예상했던 결과물.

+0

덕분에 많은 duffymo 덕분에 파일별로 라인별로 표시되는 결과를 선호합니다. 결과는 상태 그래프를 나타냅니다. 5/* 도면의 5 개 가지 상태 */ <0,{p1}>/* 상태 0은 시작 상태이고, P1은 상태 0 */ <0,{p1}> -1-><1>/* P1이 참 상태 0 갖는 1 후속에 참 , 상태 1 */ <1,{p1}> -2-><2><3>/* P1이 참 상태 1 2successors, 상태 3 및 상태 3을 갖는다 */ <2,{p0}> -1-><0>/* P0 해당하는 1 후임을 갖는 상태에서 State0 2 */ <3,{p1}> -1-><4>/* P1이 참 상태 3 1 개 후계자 state4을 갖는다 */ <4,{p0}> -1-><3>/* P0가 참 상태 4 1 후속 있으며, 상태 3 */ – kayn

+0

난 형식화 된 방식 등이 당신에게 달려 있다고 말합니다. – duffymo

0

먼저 "원하는 출력"이 무엇인지 분명히해야합니다. 둘째, 제공 한 코드에서 토크 나이저를 사용하지 않아도 아무런 이유없이 생성합니다. 세 번째로, 루프에서 scanner.next()를 두 번 호출합니다. 실수로 토큰의 절반을 건너 뜁니다. 넷째, Scanner와 StringTokenizer를 모두 사용하는 이유는 무엇입니까? 나는 그들이 거의 같은 일을하고 있다고 생각했다.