-1

我正在尝试用 Java 读取文件。文件结构如下

** <br/>
f=1100<br/>
d=111<br/>
e=1101<br/>
b=101<br/>
c=100<br/>
a=0<br/>
**

11001100110011001100110111011101110111011101110111011101100100100100100100100100100100100
101011011011011011011011011011011011011011111111111111111111111111111111111111111111111110
00000000000000000000000000000000000000000000

它以 ** 开头,然后是一些我只想阅读的内容。又有 ** 和一个空行和更多的数据。我知道如何读取数据,但我无法处理如何读取仅介于 ** 之间的数据

到目前为止,我已经做到了

 File toRead=new File("output.txt");
 FileInputStream fis=new FileInputStream(toRead);
 Scanner sc=new Scanner(fis);
 String currentLine;
 sc.delimiter = "**";
 while(sc.hasNext()){

     currentLine=sc.nextLine();
     system.out.println(sc.next());



  }
 fis.close();
4

3 回答 3

3

试试这个 :

File f = new File("output.txt");
    try {
        Scanner s = new Scanner(f);
        String line = "";
        while(s.hasNext()){
            line=s.nextLine();
            if(line.startsWith("**")){
                line=line.replaceAll("[**]", "");
                System.out.println(line);
                while((line=s.nextLine())!=null){  
                    if(!(line.endsWith("**")))
                        System.out.println(line);
                    else if(line.endsWith("**")){
                           line=line.replaceAll("[**]","");
                        System.out.println(line);
                        break;
                    }

                }
            } 
        }
    } catch (Exception ex) {

        System.out.println(ex.getMessage());
    }
于 2013-03-15T15:36:54.190 回答
0

好像你在问如何解析。解析的基础是下推自动机 (PDA)。要做一个真正通用的解析器,你需要理解它。过去,lexx 和 yak 就是用来做这个的,它们为解析器生成 C 代码。java可能有类似的东西。

如果做不到这一切,您只需对解析器进行硬编码:

while(sc.hasNext()){
 currentLine=sc.nextLine();
 system.out.println(sc.next());  //Great for debugging
 if(currentLine.equals("**") {   //use a constant instead
   newRecord = true;
   continue;
 } else if(currentLine.equals(???) {
   //set some values
 }  //etc

}

您的定界符代表状态转换,您需要在代码中跟踪它……这当然是 PDA 的地址。如果您了解状态、标记和转换,就会容易得多。

于 2013-03-15T15:30:04.700 回答
0

在您的情况下,唯一的问题是您想使用分隔符但没有正确放入。

File toRead=new File("output.txt");
FileInputStream fis=new FileInputStream(toRead);
Scanner sc=new Scanner(fis);
String currentLine;
sc.useDelimiter("\\*\\*");
while(sc.hasNext()){

 currentLine=sc.nextLine();
 System.out.println(sc.next());



 }
fis.close();

您必须使用正则表达式调用 useDelimiter 并且需要转义 *. 所以你的正则表达式是\*\*(在 * 之前有一个 \ 来逃避它)

因为 useDelimiter 接受 String 你必须转义 \ 所以\\ -> \\\*\\* -> \*\*

于 2013-03-15T15:52:15.020 回答