天天看点

Scanner遇上UnmappableCharacterException

上周末的时候。朋友约好去KTV,鉴于我这样的不怎么听歌的孩子伤不起啊,灵机一动就把我的酷狗歌单导出来了,XML文件嘛,内容太多,我仅仅想要歌名足已。

于是写了一个java去输出歌名。

    岂料我受到了挫伤,scanner.hasNextLine()一直为false,于是我百思不得姐啊,经过调试发现,Scanner内部有java.nio.charset.UnmappableCharacterException,就百度了一下,没找到答案。google訪问不了。想起公司的网络是香港的,就远程上去,还好在stackoverflow上找到了答案。O(∩_∩)O~~

  原来用修改以下一行就OK啦,不解释,你懂的。不懂就去stackoverflow。

    Scanner scanner=new Scanner(new File(filePath),"UTF-8");

URL:http://stackoverflow.com/questions/19252321/findwithinhorizon-fails-to-match (这个页面上你能够学到很多其它) 

Java Code:        

<code>public void output(String filePath) throws FileNotFoundException{</code>

<code>Scanner scanner=new Scanner(new File(filePath));</code>

<code>String str=null;</code>

<code>while(scanner.hasNextLine()){</code>

<code>str=scanner.nextLine();</code>

<code>if(str.indexOf("FileName")&gt;0){</code>

<code>System.out.println(str.substring(str.indexOf("&gt;")+1, str.lastIndexOf("&lt;")));</code>

<code>}</code>

<code>scanner.close();</code>

File content:

<code>&lt;File&gt;</code>

<code>&lt;MediaFileType&gt;0&lt;/MediaFileType&gt;</code>

<code>&lt;FileName&gt;周杰伦 - 爱在西元前.mp3&lt;/FileName&gt;</code>

<code>&lt;FilePath&gt;D:\music\&lt;/FilePath&gt;</code>

<code>&lt;FileSize&gt;5623610&lt;/FileSize&gt;</code>

<code>&lt;Duration&gt;234292&lt;/Duration&gt;</code>

<code>&lt;Hash&gt;0589341ba15528a4c63e36c49a3c0e45&lt;/Hash&gt;</code>

<code>&lt;Lyric&gt;E:\KuGou\Lyric\周杰伦 - 爱在西元前-0589341ba15528a4c63e36c49a3c0e45.krc&lt;/Lyric&gt;</code>

<code>&lt;Bitrate&gt;192004&lt;/Bitrate&gt;</code>

<code>&lt;MandatoryBitrate&gt;0&lt;/MandatoryBitrate&gt;</code>

<code>&lt;/File&gt;</code>

Java Code after modify:

<code>Scanner scanner=new Scanner(new File(filePath),"UTF-8");//Always explicitly pass a charset when working with text</code>

<code>if(str.indexOf("FileName")&gt;0)</code>

<code>//It's better to check IOException when working with Scanner(PS:find UnmappableCharacterException took me more time,finally by debug to found )</code>

<code>IOException ioException = scanner.ioException();</code>

<code>if (ioException != null) {</code>

<code>ioException.printStackTrace();</code>

<code></code>