栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java Scanner(File)行为异常,但是Scanner(FIleInputStream)始终与同一个文件一起使用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Scanner(File)行为异常,但是Scanner(FIleInputStream)始终与同一个文件一起使用

hasNextLine()调用findWithinHorizo​​n(),后者依次调用findPatternInBuffer(),在匹配项中搜索定义为

.*(rn|[nru2028u2029u0085])|.+$

奇怪的是,通过两种方式(使用FileInputStream或通过File)构造扫描器,如果文件包含(独立于文件大小)文件(例如0x0A行终止符),则findPatternInBuffer返回正匹配;但是如果文件包含的字符超出了ASCII码(即>
= 7f),则使用FileInputStream返回true,而使用File返回false。

非常简单的测试用例:

创建一个仅包含字符“ a”的文件

# hexedit file     00000000   61 0A    a.# java Test.javausing File: trueusing FileInputStream: true

现在使用hexedit将文件编辑为:

# hexedit file00000000   61 0A 80 a..# java Test.javausing File: falseusing FileInputStream: true

在测试Java代码中,除了问题中已经存在的内容外,没有什么其他:

import java.io.*;import java.lang.*;import java.util.*;public class Test {    public static void main(String[] args) {        try {     File file1 = new File("file");     Scanner s1 = new Scanner(file1);     System.out.println("using File: "+s1.hasNextLine());     File file2 = new File("file");     Scanner s2 = new Scanner(new FileInputStream(file2));     System.out.println("using FileInputStream: "+s2.hasNextLine());        } catch (IOException e) {     e.printStackTrace();        }    }}

所以,事实证明这是一个字符集问题。实际上,将测试更改为:

 Scanner s1 = new Scanner(file1, "latin1");

我们得到:

# java Test using File: trueusing FileInputStream: true


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496927.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号