天天看點

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>