实际上我已经编写了一个在.txt文件中打印大字符串的Java程序!现在我想知道文件在生成之前会有多大。实际上我有大量的字符,但我不知道如何计算这个文件的大小。
答案 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找出这些尺寸。