使用InputStream从.txt读取时,为什么会出现问号而不是符号?

时间:2012-05-11 17:20:09

标签: android character inputstream

我知道这一定是显而易见的,但找不到答案。

我应该怎样做才能获得正确的特征,例如“,”等......?

这是我正在使用的方法,

public void read(Context context) {

        InputStream inputStream = context.getResources().openRawResource(
                R.raw.puzzles);
        Scanner scanner = new Scanner(inputStream);
        scanner.useDelimiter(PATTERN);
        for (int i = 0; i < 70; i++) {
            ids[i] = scanner.next();
            titles[i] = scanner.next();
            questions[i] = scanner.next();
            answers[i] = scanner.next();
        }

    }

由于

3 个答案:

答案 0 :(得分:1)

经过几天的研究,我终于找到了答案。

首先,我从InputStream创建了一个BufferedReader,用于读取字符而不是原始字节读取。

最重要的是,我使用带有charSetName的构造函数实例化了InputStream。

如果您在NotePad中选择“另存为”,则可以选择编码。

最后,我找到了here支持的编码。

NotePad中的默认值似乎是ANSI,似乎不受支持,所以我更改了它并将我的.txt文件保存为UTF8。

以下是代码:

public void read(Context context) {

        InputStream inputStream = context.getResources().openRawResource(
                R.raw.puzzles);

        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(
                    inputStream, "UTF8"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }

        Puzzle p = null;

        Scanner scanner = new Scanner(bufferedReader);
        scanner.useDelimiter(TOKEN);
        // Skips the first strange char
        scanner.next();
        while (scanner.hasNext()) {

            p = new Puzzle();
            p.setId(scanner.next());
            p.setTitle(scanner.next());
            p.setQuestion(scanner.next());
            p.setAnswer(scanner.next());
            puzzles.add(p);
        }

    }

答案 1 :(得分:0)

默认情况下,扫描仪对象似乎只能识别字母和数字...尝试使用不使用扫描仪的方法,就像这个问题的答案一样:Android read text raw resource file

使用String.indexOf()或TextUtils.StringSplitter或类似的东西来读取每一行并解析令牌之间的真实字符串。

您可能希望使用while循环读取数据,直到文件末尾而不是固定数字(在您的情况下为70),以用于可能包含更多或更少数据的未来拼图文件。

答案 2 :(得分:0)

尝试使用传递字符集的Scanner实例,即 new Scanner (InputStream src, String charsetName)

HTH