【问题标题】:Can't read the whole file into a String in Java无法将整个文件读入Java中的字符串
【发布时间】:2016-04-09 16:11:24
【问题描述】:

再来一次

你好,

重试我的问题

我从网上下载了一个文件,就是这个:

jquery.js

它是 94159 字节,检查一下,一切似乎都很好。现在我想把这个文件读成一个字符串,操作它,然后保存它。读取文件后,我将其打印到控制台,似乎它没有读取整个文件(最后的部分丢失)。 保存后只有91000字节。

我尝试了不同的阅读方法,所以我认为不是问题,例如:

String fileTo = new String(Files.readAllBytes(Paths.get(fileFullPath)), StandardCharsets.UTF_8); 

(与扫描仪、流相同的结果)

可能与文件本身有关。我的 Mac 上的文件是 utf-8 格式的,也许原来不是?我真的不知道可能是什么原因。 感谢您的帮助。

编辑:

我是这样下载的:

try (InputStream fileReader = new BufferedInputStream(
            conn.getInputStream());
         OutputStream fileWriter = new BufferedOutputStream(
                 new FileOutputStream(fileFullPath)))
    {
        int readByte;
        while ((readByte = fileReader.read()) != -1)
        {
            fileWriter.write(readByte);
        }

【问题讨论】:

  • 如何保存文件?我的猜测是,这个文件中的 3 行代码太长了,你的控制台会截断它们。
  • 这样保存:try (PrintStream out = new PrintStream(new FileOutputStream(fileFullPath))) { out.print(fileTo); }
  • 当你转换成字符串时,你得到的字符可能比你的字节少,因为你可能有多字节字符。
  • 如果你想复制一个文件,我建议你读为字节,一次复制 8192 个字节。无需读取为字符串并可能发送字符编码消息。我怀疑你写的字符编码和你读的不一样,这意味着字节数可能不同。
  • 这使用您的默认编码而不是原始编码。使用try (Writer out = new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8)) { out.write(fileTo); }

标签: java java-io


【解决方案1】:

您告诉过您从Internet 获取文件。

因此您可以从响应 HTTP 标头 Content-Type 设置编码字符集,如下所示:

Content-Type: text/html,text/html;charset='UTF-8'

【讨论】:

    【解决方案2】:

    下载到我的机器后,ls -l jquery.js 打印出-rw-r--r-- 1 pi pi 94159 Apr 9 12:25 jquery.js,确认文件大小为 94159 字节。

    但是,在位置 14566(.test(" ") 内部,有一个 unicode 序列(0xC2,0xA0),即 UTF-8 unicode“不间断空格”(http://www.unicode.org/charts/PDF/U0080.pdf)。

    当我运行以下程序时

    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.charset.StandardCharsets;
    
    public class FileSize {
        static public void main(String[] args) {
            try {
                final String fileFullPath = "jquery.js";
                String fileTo = new String(Files.readAllBytes(Paths.get(fileFullPath)), StandardCharsets.UTF_8);
                System.out.println( fileTo.length() );
            } catch (IOException error) {
    
            }
        }
    }
    

    它打印94158。一个字节的区别用“UTF-8”编码解释,但不能解释91000字节。解释必须在其他地方。

    【讨论】:

    • 不知道,我添加了我的下载方法,也许是那个错误。
    • 反正很奇怪,我和你做的一样,所以我应该有同样的结果。如果这很重要,我在 OS X 上。
    【解决方案3】:

    String 无法很好地处理这么大的文件。请改用StringBuilder

    byte[] bytes = Files.readAllBytes(Paths.get(fileFullPath))
    StringBuilder sb = new StringBuilder();
    sb.append(bytes);
    

    【讨论】:

    • String 和 StringBuilder 可以处理超过 20 亿个字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2010-12-12
    相关资源
    最近更新 更多