سؤال

لدي الكود التالي:

        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();
        }

لكن يتم عرض الشخصيات في ?'s.هل لهذا علاقة بـ Java باستخدام أحرف Unicode؟كيف يمكنني تصحيح هذا؟

هل كانت مفيدة؟

المحلول

عليك أن تعرف ما هو تشفير الملف، ثم تقوم بفك تشفير ByteBuffer إلى CharBuffer باستخدام هذا التشفير.بافتراض أن الملف هو 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();
        }
    }
}

نصائح أخرى

يتوقع buf.getChar() 2 بايت لكل حرف ولكنك تقوم بتخزين 1 فقط.يستخدم:

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

تغيير بيان الطباعة الخاص بك إلى:

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

يبدو أنه يساعد.

اعتمادًا على ترميز somefile.txt، قد لا يتكون الحرف فعليًا من وحدتي بايت. هذه الصفحة يوفر المزيد من المعلومات حول كيفية قراءة التدفقات بالتشفير المناسب.

المشكلة هي أن نظام الملفات لا يخبرك بتشفير الملف، لأنه لا يعرفه.بقدر ما يتعلق الأمر، فهي مجرد مجموعة من البايتات.يجب عليك إما أن تجد طريقة ما لتوصيل التشفير إلى البرنامج، أو اكتشافه بطريقة ما، أو (إن أمكن) التأكد دائمًا من أن التشفير هو نفسه (مثل UTF-8).

هل هناك سبب معين وراء قراءتك للملف بهذه الطريقة؟

إذا كنت تقرأ في ملف ASCII، فيجب أن تستخدم Reader حقًا.

سأفعل ذلك شيئًا مثل:

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

ثم استخدم إما readLine أو ما شابه ذلك لقراءة فعلا في البيانات!

نعم، هو يونيكود.

إذا كان لديك 14 حرفًا في ملفك، فستحصل على 7 '؟" فقط.

الحل معلق.ما زلت أفكر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top