2013-07-31 121 views
0

我开始编写一小段可以分析旧式.vmg文件的脚本*。我以为开始使用扫描仪实用程序,所以我可以一开始就逐个输出消息。这就是我得到的。Java Scanner.next(),从while循环打印

import java.io.File; 
import java.io.IOException; 
import java.util.Scanner; 


public class Strip { 
    public static void main(String[] args) 
    { 
     try 
     { 
      File file = new File("all.vmg"); 
      Scanner sc = new Scanner(file); 
//   sc.useDelimiter("BEGIN:VMSG"); 
      while (sc.hasNext()) 
      { 
      String string = sc.next(); 
      System.out.println(string); 
      } 

     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 


} 

它编译和运行良好。虽然它不会打印出一件东西。首先我使用现在评论的分隔符。然后认为可能有问题。所以现在它只是使用它的默认空白分隔符。但是无论如何都不会打印行。我只能猜测出于某种原因,hasNext不能评估真实性。 * .vmg文件是在

BEGIN:VMSG 
VERSION:1.1 
X-IRMC-STATUS: 
X-IRMC-BOX:INBOX 
X-NOK-DT:20110224T215100Z 
X-MESSAGE-TYPE:DELIVER 
BEGIN:VCARD 
VERSION:3.0 
N: 
TEL:+37999999999 
END:VCARD 
BEGIN:VENV 
BEGIN:VBODY 
Date:24.02.2008 21:51:00 
Sample mobile text message 
END:VBODY 
END:VENV 
END:VMSG 

我也试着喂脚本其他几个简单的文本文件,什么也没有打印出来,一般格式的文本文件。

+1

你试过用'hasNextLine' /'nextLine'?另外它会更容易使用'列表 lines = Files.readAllLines(Paths.get(“all.vmg”),Charset.forName(“UTF-8”));'。 – assylias

+0

你想要逐行读取它,还是逐个字符? – user2277872

+0

我也尝试使用hasNextline并打印Nextline,结果是一样的。我最终想从字符串BEGIN:VSMG到BEGIN:VMSG(不是从换行符到换行符)读取它们。 –

回答

0

hasNext()匹配任何东西。尝试查找匹配时,它使用(?s).*模式。

尝试使用hasNextLine,它使用换行符作为分隔符。

+0

这不是问题。 –

+0

尝试了“/home/user/all.vmg”的完整Unix路径,并尝试了hasNextLine。结果是一样的,编译和运行没有错误 - 只是不打印任何东西。 –

+0

您是否尝试过调试代码? –

0

首先,根据您在另一个答案中的评论,该程序正在抛出一些您不感兴趣的东西。将您的异常类型更改为普通Exception类,这将确保您可以捕获任何Throwable

一旦解决了问题,您就可以解决实际问题。

编辑:所以我去粘贴你提供给Eclipse的代码,以及文件的内容,并运行它没有一个单一的问题。在这一点上,我不知道这个问题会是什么,除了由于某种原因它找不到该文件。但是,如果是这样的话,它会抛出一个非常明显的错误。

无论如何,看起来你已经自己解决了这个问题,尽管我为什么这么做,而且你的原创不是这样,我仍然不知所措。

+0

好的,在这里你可以理解的Newb在任何情况下都不知道多少异常处理。 BUt catch(Exception e)似乎也没有捕捉任何东西。所以它似乎它?!完成try块。 –

+0

这真的很奇怪,因为从你的评论到Nishant,有一个未被捕获的Throwable ... hmm – Deactivator2

+0

调试的另一种方法是在每一步都放弃System.out行,以便知道它有多远。 – Deactivator2

0

好的,这让脚本工作。但我不知道如何。所以也许有人可以让我对幕后发生的事情有所启发。我把它作为答案发布,因为它有点解决方案,也是因为编辑原始问题会让它变得非常耗时。

不同之处在于我在while循环之前启动了扫描器对象。而且,我用扫描仪输入的FileReader和BufferedReader(虽然它的手册说,这应该是罚款与文件对象按我的第一个剧本)

import java.io.*; 
import java.util.Scanner; 


public class Strip { 
    public static void main(String[] args) 
    { 
Scanner sc = null; 
     try 
     { 
      sc = new Scanner(new BufferedReader(new FileReader("all.vmg"))); 
      sc.useDelimiter("BEGIN:VMSG"); 
      while (sc.hasNextLine()) 
      { 
      System.out.println(sc.nextLine()); 
      } 
      sc.close(); 
     } 
     catch (Exception e) 
     { 
      System.out.println("Caught Something whatever?"); 
     } 

    } 


}