Кодировка для DataInputStream - PullRequest
       12

Кодировка для DataInputStream

0 голосов
/ 16 сентября 2018

Мне нужно закодировать мои файлы в «ISO-8859-1».Я знаю, как это сделать с помощью Reader, например:

BufferedReader br = new BufferedReader(new InputStreamReader(
            new FileInputStream(src), "ISO-8859-1"))

Но я спрашиваю, как закодировать DataInputStream следующим образом.

Мое объявление прямо сейчас:

DataInputStream dit = new DataInputStream(new BufferedInputStream(
            new FileInputStream(src)))

Я бы предпочел решение, где параметр-кодировка находится в объявлении.Данные, которые я хочу прочитать, были записаны с помощью DataOutputStream.

Метод импорта и метод экспорта для DataStreams:

public void importDST(String src) throws FileNotFoundException, IOException{
    try (DataInputStream dit = new DataInputStream(new BufferedInputStream(new FileInputStream(src)))) {
        while(dit.available() > 0) {
            pupils.add(new Pupil(dit.readInt(), dit.readInt(), dit.readUTF(), dit.readUTF(), dit.readChar(),
                    dit.readUTF(), dit.readInt(), dit.readInt(), dit.readInt(), dit.readUTF(), dit.readUTF(), dit.readUTF(), dit.readUTF(),
                    dit.readUTF(), dit.readUTF()));
        }
    } catch (FileNotFoundException e) {
        throw e;
    } catch (IOException e) {
        throw e;
    }
}

public void exportDST(String dest, ArrayList<Pupil> pupils) throws FileNotFoundException, IOException{
    this.pupils = pupils;
    try (DataOutputStream dot = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dest)))) {
        for (Pupil p : this.pupils) {
            dot.writeInt(p.getId());
            dot.writeInt(p.getNumber());
            dot.writeUTF(p.getFirstname());
            dot.writeUTF(p.getLastname());
            dot.writeChar(p.getGender());
            dot.writeUTF(p.getReligion());
            dot.writeInt(p.getDay());
            dot.writeInt(p.getMonth());
            dot.writeInt(p.getYear());
            dot.writeUTF(p.getStreet());
            dot.writeUTF(p.getPlz());
            dot.writeUTF(p.getLocation());
            dot.writeUTF(p.getShortName());
            dot.writeUTF(p.getClassName());
            dot.writeUTF(p.getKvLastname());
        }
    } catch (FileNotFoundException e) {
        throw e;
    } catch (IOException e) {
        throw e;
    }
}

Класс Pupil:

public class Pupil implements Serializable{
private int id;
private int number;
private String firstname;
private String lastname;
private char gender;
private String religion;
private int day;
private int month;
private int year;
private String street;
private String plz;
private String location;
private String shortName;
private String className;
private String kvLastname;

public Pupil() {}

public Pupil(int id, int number, String firstname, String lastname, char gender,
             String religion, int day, int month, int year, String street, String plz, String location,
             String shortName, String className, String kvLastname) {
    this.id = id;
    this.number = number;
    this.firstname = firstname;
    this.lastname = lastname;
    this.gender = gender;
    this.religion = religion;
    this.day = day;
    this.month = month;
    this.year = year;
    this.street = street;
    this.plz = plz;
    this.location = location;
    this.shortName = shortName;
    this.className = className;
    this.kvLastname = kvLastname;
}
}

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Ваш вопрос на самом деле не имеет смысла.

Потоки модели потоков байтов .У них нет кодировки символов, они просто байты.

Читатели читают потоки символов .В конечном итоге это тоже потоки байтов, но есть кодировка символов, которая говорит, как преобразовать эти байты в символы.Таким образом, имеет смысл иметь возможность указать эту кодировку в конструкторе.

DataInputStream s Stream s: они читают двоичный файл, поэтому у них нет кодировки символов.

0 голосов
/ 17 сентября 2018

Я обошел эту проблему, написав и прочитав только Ints и Bytes вместо Strings. Я прочитал bytearrays и сделал новую строку с кодировкой. Вот измененный код:

Чтение:

public void importDST(String src) throws IOException{
    try (DataInputStream dit = new DataInputStream(new BufferedInputStream(new FileInputStream(src)))) {
        while (dit.available() > 0) {
            Pupil p = new Pupil();
            byte[] arr;
            int len;

            p.setId(dit.readInt());
            p.setNumber(dit.readInt());
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setFirstname(new String(arr, "ISO-8859-1"));
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setLastname(new String(arr, "ISO-8859-1"));
            p.setGender(dit.readChar());
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setReligion(new String(arr, "ISO-8859-1"));
            p.setDay(dit.readInt());
            p.setMonth(dit.readInt());
            p.setYear(dit.readInt());
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setStreet(new String(arr, "ISO-8859-1"));
            p.setPlz(dit.readInt());
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setLocation(new String(arr, "ISO-8859-1"));
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setShortName(new String(arr, "ISO-8859-1"));
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setClassName(new String(arr, "ISO-8859-1"));
            len = dit.readInt();
            arr = new byte[len];
            dit.readFully(arr);
            p.setKvLastname(new String(arr, "ISO-8859-1"));

            pupils.add(p);
        }
    }
}

Запись:

public void exportDST(String dest, ArrayList<Pupil> pupils) throws IOException{
    this.pupils = pupils;
    try (DataOutputStream dot = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dest)))) {
        for (Pupil p : pupils) {
            dot.writeInt(p.getId());
            dot.writeInt(p.getNumber());
            dot.writeInt(p.getFirstname().length());
            dot.writeBytes(p.getFirstname());
            dot.writeInt(p.getLastname().length());
            dot.writeBytes(p.getLastname());
            dot.writeChar(p.getGender());
            dot.writeInt(p.getReligion().length());
            dot.writeBytes(p.getReligion());
            dot.writeInt(p.getDay());
            dot.writeInt(p.getMonth());
            dot.writeInt(p.getYear());
            dot.writeInt(p.getStreet().length());
            dot.writeBytes(p.getStreet());
            dot.writeInt(p.getPlz());
            dot.writeInt(p.getLocation().length());
            dot.writeBytes(p.getLocation());
            dot.writeInt(p.getShortName().length());
            dot.writeBytes(p.getShortName());
            dot.writeInt(p.getClassName().length());
            dot.writeBytes(p.getClassName());
            dot.writeInt(p.getKvLastname().length());
            dot.writeBytes(p.getKvLastname());
        }
    }
}

Спасибо за все ваши ответы!

0 голосов
/ 16 сентября 2018

Что касается ObjectInputStream, в документации говорится, что

ObjectInputStream десериализует примитивные данные и объекты, ранее написанные с использованием ObjectOutputStream.

Также обратите внимание:

Только потоки, которые поддерживают интерфейс java.io.Serializable или java.io.Externalizable, могут быть прочитаны из потоков.

То есть ранее считанные данные были сериализованы (или экспортированы) с использованием ObjectOutputStream и заданных объектов, реализующих Serializable (или Externalizable). Таким образом, вы будете иметь дело с кодировкой charset для любых атрибутов String в методах readObject и `writeObject 'ваших объектов Serializable.

Что касается DataInputStream, см. Этот ответ: DataInputStream и UTF-8

Вы должны будете указать кодировку при создании строки из прочитанных байтов.

...