Question

J'ai le code suivant:

        String inputFile = "somefile.txt";
        FileInputStream in = new FileInputStream(inputFile);
        FileChannel ch = in.getChannel();
        ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE);  // BUFSIZE = 256

        /* read the file into a buffer, 256 bytes at a time */
        int rd;
        while ( (rd = ch.read( buf )) != -1 ) {
            buf.rewind();
            for ( int i = 0; i < rd/2; i++ ) {
                /* print each character */
                System.out.print(buf.getChar());
            }
            buf.clear();
        }

Mais les caractères s’affichent sur? Est-ce que cela a quelque chose à voir avec Java utilisant des caractères Unicode? Comment puis-je corriger cela?

Était-ce utile?

La solution

Vous devez connaître le codage du fichier, puis décoder le ByteBuffer en un CharBuffer utilisant ce codage. En supposant que le fichier est ASCII:

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

public class Buffer
{
    public static void main(String args[]) throws Exception
    {
        String inputFile = "somefile";
        FileInputStream in = new FileInputStream(inputFile);
        FileChannel ch = in.getChannel();
        ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE);  // BUFSIZE = 256

        Charset cs = Charset.forName("ASCII"); // Or whatever encoding you want

        /* read the file into a buffer, 256 bytes at a time */
        int rd;
        while ( (rd = ch.read( buf )) != -1 ) {
            buf.rewind();
            CharBuffer chbuf = cs.decode(buf);
            for ( int i = 0; i < chbuf.length(); i++ ) {
                /* print each character */
                System.out.print(chbuf.get());
            }
            buf.clear();
        }
    }
}

Autres conseils

buf.getChar () attend 2 octets par caractère mais vous n'en stockez que 1. Utilisez:

 System.out.print((char) buf.get());

Modification de votre relevé d'impression en:

System.out.print((char)buf.get());

Semble aider.

En fonction du codage de somefile.txt, un caractère peut ne pas être composé de deux octets. Cette page fournit des informations supplémentaires sur la lecture des flux. avec le bon encodage.

Le pire, c'est que le système de fichiers ne vous dit pas l'encodage du fichier, car il ne le sait pas. En ce qui le concerne, c'est juste un tas d'octets. Vous devez soit trouver un moyen de communiquer le codage au programme, de le détecter d’une manière ou d’une autre, ou (si possible) de toujours vous assurer que le codage est identique (tel que UTF-8).

Y a-t-il une raison particulière pour laquelle vous lisez le fichier comme vous le faites?

Si vous lisez un fichier ASCII, vous devriez vraiment utiliser un Reader.

Je le ferais quelque chose comme:

File inputFile = new File("somefile.txt");
BufferedReader reader = new BufferedReader(new FileReader(inputFile));

Et utilisez ensuite readLine ou similaire pour lire les données!

Oui, c'est Unicode.

Si vous avez 14 caractères dans votre fichier, vous n'obtenez que 7 '?'.

Solution en attente. Toujours en train de penser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top