2017-04-23 1 views
1

J'essaye d'écrire un test de junit pour une méthode qui dépare un mot. J'ai le problème que la méthode retourne des symboles au lieu du mot depadded.Définir DataInputStream sur Chaîne Valeur

Ma méthode d'essai est

@Test 
public void testReadString() throws IOException 
{ 
    String testString = "******test"; 

    InputStream stream = new ByteArrayInputStream(testString.getBytes(StandardCharsets.UTF_8)); 
    DataInputStream dis = new DataInputStream(stream); 

    String word = readString(dis, 10); 

    assertEquals("test", word); 
} 

Les méthodes qu'il est test sont

public static String readString(DataInputStream dis, int size) throws IOException 
{ 

    byte[] makeBytes = new byte[size * 2];// 2 bytes per char 
    dis.read(makeBytes); // read size characters (including padding) 
    return depad(makeBytes); 
} 

public static String depad(byte[] read) 
{ 
    //word = word.replace("*", ""); 
    StringBuilder word = new StringBuilder(); 
    for (int i = 0; i < read.length; i += 2) 
    { 
     char c = (char) (((read[i] & 0x00FF) << 8) + (read[i + 1] & 0x00FF)); 

     if (c != '*') 
     { 
      word.append(c); 
     } 
    } 
    return word.toString(); 
} 

L'erreur que je reçois quand je lance le test est test a échoué attendu [Test] mais était [⨪ ⨪⨪ 瑥 獴]

+0

Suis-je conclure correctement des commentaires, etc, que vous lisez un fichier dans un tableau d'octets, le traitement d'une partie de celui-ci au format UTF-8 texte codé et vous Voulez-vous le dé-pad et obtenir le texte restant en tant que chaîne? Si oui, pouvez-vous expliquer cela mieux. Êtes-vous sûr que c'est UTF-8? –

Répondre

1
InputStream stream = new ByteArrayInputStream(testString.getBytes(StandardCharsets.UTF_8)); 

... 

char c = (char) (((read[i] & 0x00FF) << 8) + (read[i + 1] & 0x00FF)); 

Votre code attend une chaîne codée UCS-2, mais vous êtes l'alimentation d'une chaîne encodée en UTF-8. Dans UCS-2, chaque caractère a exactement deux octets. UTF-8 est un encodage de longueur variable où les caractères ASCII sont un octet et les autres caractères sont deux ou plus.

Notez que UCS-2 est un codage très simpliste et vétuste. Il ne peut encoder que les premiers 64K caractères Unicode. Il a été remplacé par UTF-16 dans les applications Unicode modernes. L'UCS-2 devrait maintenant être considéré comme obsolète. According to the Unicode Consortium:

Il ne fait plus référence à un formulaire de codage dans 10646 ou le standard Unicode.

Quelle est la raison de travailler avec des tableaux d'octets, de toute façon? Si vous voulez manipuler des données de caractères, vous devez utiliser des chaînes, pas des octets. Les chaînes vous empêchent de vous soucier des encodages.

+0

Merci, cela fait partie d'une affectation, nous devons être en mesure de remplir et de dépouiller les mots dans un fichier en utilisant des tableaux d'octets. Sinon, j'utiliserais ObjectOutPutStream pour enregistrer dans un fichier –

0

Il existe deux types de classes I/O:

  1. octets Streams: ils sont utilisés pour lire des octets.

Vous pouvez trouver beaucoup de classes comme: ByteArrayInputStream et DataInputStream.

  1. Flux de caractères: ils sont utilisés pour lire du texte lisible par l'homme.

Vous pouvez trouver beaucoup de classes comme: StringReader et InputStreamReader. Vous pouvez facilement trouver ces classes car elles utilisent le sufix Writter ou Reader.

Je suggère d'utiliser StringReader comme ceci:

new StringReader("******test");