Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java文件读取_Java_File_Io_Readfile - Fatal编程技术网

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

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

** <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();