为Scanner设置编码

今天帮人修bug的过程中,有个哥们用java.util.Scanner去解析文件。那个代码在linux下跑没问题,但我把待分析的文件拖到本地后却怎么样也没法读

              Scanner scanner;
		try {
			scanner = new Scanner(new File("part00219"));
                        System.out.println(scanner.hasNext());
		} catch (FileNotFoundException e) {
			throw new RuntimeException(e);
		}

 这段无论如何都是输出false。开始我觉得应该是linux和windows换行符不同的问题,就去设delimiter,结果怎么设都没用,最后跟到源码里面才发现readInput里面有这段

 

   try {
            n = source.read(buf);
        } catch (IOException ioe) {
            lastException = ioe;
            n = -1;
        }

 原来Scanner把IOException给吞了,只能用scanner.ioException()拿到上一个exception。

发现了问题,解决方案就好找了,我的情况,那个exception是java.nio.charset.MalformedInputException: Input length = 1,google后发现是字符集没设置,在创建scanner时指定字符集就能解决这个问题

	scanner = new Scanner(new File("part00219"), "iso-8859-1");

 

 

我觉得Scanner这种处理exception的方式不好,这中c-style的方式在java中已经很少采用了,而且在没有任何提示的情况下 swollow exception,完全不是个好方式,不知道为什么会这么设计的。

 

 

你可能感兴趣的:(为Scanner设置编码)