【问题标题】:FileInputstream and BufferedInputStream work in 4.0.3, but not in 4.2.2FileInputstream 和 BufferedInputStream 在 4.0.3 中有效,但在 4.2.2 中无效
【发布时间】:2013-11-09 18:05:19
【问题描述】:

我有两部手机,一部带有 android 4.2.2 的 Galaxy s4 和一部带有 android 4.0.3 的 Galaxy s2。我正在打开一个 torrent 文件以阅读信息。我得到了这个代码:

metafile = new Metafile(new BufferedInputStream(new FileInputStream(DotTorrentPath)));

元文件是库中的一个类。在我的 g4 上,我从解析 torrent 文件的库中收到一个内部错误。 java.io.IOException: Problem parsing bencoded file。在我的 g2 上,一切正常。我一直在互联网上浏览有关 4.2 中 FileInputStream 或 BufferedInputStream 的更改,但我没有找到任何东西。

在两部手机上,DotTorrentPath 都是 /mnt/sdcard/Download/thisisatorrent.torrent

库的代码是

private Object parse(InputStream is) throws IOException {
    is.mark(0);
    int readChar = is.read();
    switch (readChar) {
        case 'i':
            return parseInteger(is);
        case 'l':
            return parseList(is);
        case 'd':
            return parseDictionary(is);
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            is.reset();
            return parseByteString(is);
        default:
            throw new IOException("Problem parsing bencoded file");
    }
}

在我的 g2 上,is.read() 返回 100。在我的 g4 上,它返回 31。我使用的是完全相同的文件。任何想法为什么它不能在 4.2 上运行?

感谢您的帮助

【问题讨论】:

  • mark() 与 BufferedInputStream 协同工作的效果如何?见stackoverflow.com/questions/8599172/…
  • 删除缓冲的输入流时你试过了吗?
  • 可以,但是文件输入流不支持 mark()
  • 在调用parse()之前,库有这个条件if(!is.markSupported()) throw error;
  • 你解决过这个问题吗?

标签: java android file


【解决方案1】:

确保您拥有 READ_EXTERNAL_STORAGE 权限。该权限是在 Android 4.1 (see docs) 中添加的。

【讨论】:

  • 我没有 READ_EXTERNAL_STORAGE 权限,但还是不行
  • 读取权限是在 4.1 中添加的,但直到 4.4 才强制执行。引用您自己的文档链接:“在 Android 4.1 中,默认情况下所有应用程序仍然具有读取权限”,而 KitKat API“您的应用程序无法读取外部存储上的共享文件时在 Android 4.4 上运行,除非您的应用具有 READ_EXTERNAL_STORAGE 权限”
  • 未设置 READ_EXTERNAL_STORAGE 将导致无法访问文件(FileNotFoundException、权限被拒绝等),因为 OP 能够调用 .read() 并将字符传递给他显然拥有的开关读取权限。
【解决方案2】:

对我来说听起来像是一个编码问题。可能在一部手机中,文件以 UTF-8 编码(占用两个字节),而在另一部手机中,文件以 ANSI 编码(仅使用一个字节)。

尝试检查两个文件是否具有相同的编码...

此外,您使用 FileReader 从文件中读取字符而不是字节的文档 recommends

BufferedReader buf = new BufferedReader(new FileReader(DotTorrentPath));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多