Java文件读取
我正在尝试用Java读取文件。该文件的结构如下所示Java文件读取,java,file,io,readfile,Java,File,Io,Readfile,我正在尝试用Java读取文件。该文件的结构如下所示 ** <br/> f=1100<br/> d=111<br/> e=1101<br/> b=101<br/> c=100<br/> a=0<br/> ** 11001100110011001100110111011101110111011101110111011101100100100100100100100100100100100 1010110110110
** <br/>
f=1100<br/>
d=111<br/>
e=1101<br/>
b=101<br/>
c=100<br/>
a=0<br/>
**
11001100110011001100110111011101110111011101110111011101100100100100100100100100100100100
101011011011011011011011011011011011011011111111111111111111111111111111111111111111111110
00000000000000000000000000000000000000000000
似乎您正在询问如何解析。句法分析是下推自动机(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的地址。如果您了解状态、标记和转换,那么就容易多了。试试以下方法:
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());
}
在您的情况下,唯一的问题是您想要使用分隔符,但没有正确地将其放入
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接受字符串,所以您必须转义\so
\\->\
和\*\*\*->\*\*\*数据之间的字符串(此处***
)是否始终相同?您读取**存储所有行,直到再次读取**。对我来说,这似乎很清楚,只是为了显示我正在尝试做什么。@Maverick您应该逐行阅读文件,并检查行是否从**
(contain())开始
然后将其存储在某个bufferedreader数组中,直到下一个**
文件读取内容不一定要在try-catch块中吗?这对以下行有好处**xyz**
。我想你的意思是说|
。我不确定我对文件结构的解释是否清楚。我刚刚编辑并粘贴了示例文件。我只想阅读**之间的所有内容,但它也包括**。我只想要介于两者之间的部分。这是一个很好的答案。您只需进行lil修改,就可以开始了。。和+1@Azad OmerOk,看答案,这是最后一个:)我不确定我对文件结构的解释是否清楚。我刚刚编辑并粘贴了示例文件。我只想看**之间的所有东西如果你想付钱给我,我很乐意为你写。如果您正在寻求一般帮助,我想我已经回答了您的问题。顺便说一句,我很贵。我试过使用你建议的分隔符模式。但是,它也会在delimiterTerry之后读取文件,以将我编写的代码复制到main方法中,并让它读取您编写的文件
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();