D'obtenir la taille de la Chaîne w/ encodage en octets sans avoir à les convertir byte[]

J'ai une situation où j'ai besoin de savoir la taille d'un String/encodage paire, en octets, mais ne peut pas utiliser le getBytes() méthode parce que 1) la String est très grand et la duplication de la String dans un byte[] tableau serait d'utiliser une grande quantité de mémoire, mais plus au point 2) getBytes() alloue un byte[] tableau basé sur la longueur de la String * le maximum d'octets par caractère. Donc, si j'ai un String avec 1,5 B de caractères et encodage UTF-16, getBytes() vais essayer d'allouer un tableau 3 go et ne parviennent pas, comme les tableaux sont limités à 2^32 - X octets (X est la version Java spécifique).

Donc - est-il possible de calculer la taille en octets d'un String/encodage paire directement à partir de la String objet?

Mise à JOUR:

Voici un travail de mise en œuvre de jtahlborn réponse:

private class CountingOutputStream extends OutputStream {
    int total;

    @Override
    public void write(int i) {
        throw new RuntimeException("don't use");
    }
    @Override
    public void write(byte[] b) {
        total += b.length;
    }

    @Override public void write(byte[] b, int offset, int len) {
        total += len;
    }
}
La longueur en octets dépend de votre cible de codage. Par exemple, "test".getBytes("UTF-8") est de 4 octets, mais "test".getBytes("UTF-16") est de 10 octets (oui, 10, essayer). Si vous avez besoin de clarifier votre question, un peu.
Je voudrais ajouter qu'il est également la personne à charge sur le point de code ("caractères"), l'encodage. Par exemple, en UTF-16, certains points de code utilise 1 code de l'unité, d'autres utilisations 2 (une unité de code est de 16 bits). UTF-8 peut prendre de 1 à 4 octets par caractère.
Désolé si je suis dense, mais oui, votre commentaire est le point de la question: étant donné une Chaîne et un encodage, combien d'octets ne codant pour la Chaîne? En relisant la question, qui semble assez clair pour moi: avez - vous des suggestions de reformulation?
le commentaire ci-dessus s'applique à votre commentaire ainsi, au meilleur de ma capacité à dire.
getByte ne pas créer un tableau plus grand, alors il doit être. Il crée un tableau de la bonne taille pour la chaîne. Il n'a pas crée un tableau de longueur "longueur de la Chaîne * le maximum d'octets par caractère". Et string.length() ne retourne pas le nombre de caractères dans une chaîne, elle renvoie le nombre d'unités de code. Pour l'UTF-16, un code de l'unité est de 16 bits, et le nombre d'unités de code par caractère est 1 ou 2, cela dépend du caractère. Donc, soit je ne comprends pas votre second point de votre question ou de votre hypothèse n'est pas correcte.

OriginalL'auteur elhefe | 2013-11-08