当我有要打印的字符数量时,如何计算文本文件的估计大小?

时间:2015-07-10 09:20:45

标签: java filesize

实际上我已经编写了一个在.txt文件中打印大字符串的Java程序!现在我想知道文件在生成之前会有多大。实际上我有大量的字符,但我不知道如何计算这个文件的大小。

2 个答案:

答案 0 :(得分:4)

就我所见,Java并不会让这非常简单。我相信你必须实际编码所有内容,但你不需要创建一个大字节数组...你可以使用CharsetEncoder将编码保持在ByteBuffer中以获得长度它编码的每个部分。这是一些我相信正确的示例代码......

import java.nio.*;
import java.nio.charset.*;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        String ascii = createString('A', 2500);
        String u00e9 = createString('\u00e9', 2500); // e-acute
        String euro = createString('\u20ac', 2500); // Euro sign
        // 4 UTF-16 code units, 3 Unicode code points
        String surrogatePair = "X\ud800\udc00Y"; 

        System.out.println(getEncodedLength(ascii, StandardCharsets.UTF_8));
        System.out.println(getEncodedLength(ascii, StandardCharsets.UTF_16BE));

        System.out.println(getEncodedLength(u00e9, StandardCharsets.UTF_8));
        System.out.println(getEncodedLength(u00e9, StandardCharsets.UTF_16BE));

        System.out.println(getEncodedLength(euro, StandardCharsets.UTF_8));
        System.out.println(getEncodedLength(euro, StandardCharsets.UTF_16BE));

        System.out.println(getEncodedLength(surrogatePair, StandardCharsets.UTF_8));
        System.out.println(getEncodedLength(surrogatePair, StandardCharsets.UTF_16BE));
    }


    private static String createString(char c, int length) {
        char[] chars = new char[length];
        Arrays.fill(chars, c);
        return new String(chars);
    }

    public static int getEncodedLength(String text, Charset charset) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);        
        CharBuffer charBuffer = CharBuffer.wrap(text);
        CharsetEncoder encoder = charset.newEncoder();

        int length = 0;
        while (encoder.encode(charBuffer, byteBuffer, false) == CoderResult.OVERFLOW) {
            length += byteBuffer.position();
            byteBuffer.clear();
        }

        encoder.encode(charBuffer, byteBuffer, true);
        length += byteBuffer.position();
        return length;
    }
}

输出:

2500
5000
5000
5000
7500
5000
6
8

答案 1 :(得分:2)

当你说“文件有多大”时,我假设你指的是文件中存储的字节数。

假设您使用UTF-8编码,悲观估计是字符串中字符数的3倍,因为它使用3字节代码字对某些Unicode代码点进行编码。它还使用4字节码字,但这些码字完全匹配UTF-16代理对。代理对由两个Java字符组成,因此它们的字节与字符比仅为2.

如果您的文件仅保留Unicode的ASCII子集,则估计值等于字符串中的字符数。

要获得UTF-8编码的确切字节数,您实际上必须通过char扫描字符串char并添加每个特定代码字的大小。您可以参考Wikipedia page on UTF-8找出这些尺寸。

相关问题