Как я могу записать последовательность строк, а затем байтовый массив в файл? - PullRequest
0 голосов
/ 17 марта 2011

Я хочу записать сначала последовательность строк, а затем последовательность байтов в файл, используя Java. Я начал с использования FileOutputStream из-за массива байтов. После поиска API я понял, что FileOutputStream не может писать String с, только int с и byte с, поэтому я переключился на DataOutputStream. Когда я запускаю программу, я получаю исключение. Почему?

Вот часть моего кода:

 try {
            // Create the file
            FileOutputStream fos;
            DataOutputStream dos; // = new DataOutputStream("compressedfile.ecs_h");
            File file= new File("C:\\MyFile.txt");
            fos = new FileOutputStream(file);
            dos=new DataOutputStream(fos);

            /* saves the characters as a dictionary into the file before the binary seq*/
            for (int i = 0; i < al.size(); i++) {
                String name= al.get(i).name; //gets the string from a global arraylist, don't pay attention to this!
                dos.writeChars(name); //saving the name in the file
            }

            System.out.println("\nIS SUCCESFULLY WRITTEN INTO FILE! ");

            dos.writeChars("><");
            String strseq;

            /*write all elements from the arraylist into a string variable*/
            strseq= seq.toString();
            System.out.println("sTringSeq: " + strseq);

            /*transpose the sequence string into a byte array*/
            byte[] data = new byte[strseq.length() / 8];

            for (int i = 0; i < data.length; i++) {
                data[i] = (byte) Integer.parseInt(strseq.substring(i * 8, (i + 1) * 8), 2);
                dos.write(data[i]);
            }


            dos.flush();
            //Close the output stream
            dos.close(); 
} catch(Exception e){}

Ответы [ 4 ]

0 голосов
/ 17 марта 2011

Проблема с вашим кодом в том, что последний цикл for считал неправильное количество байтов. Приведенный ниже код решает вашу проблему записи ваших тестовых данных в файл. Это работает на моей машине.

public static void main(String[] args) {

    ArrayList<String> al = new ArrayList<String>();
    al.add("String1");
    al.add("String2");

    try {
        // Create the file
        FileOutputStream fos = new FileOutputStream("MyFile.txt");
        DataOutputStream dos = new DataOutputStream(fos);

        /* saves the characters as a dictionary into the file before the binary seq */
        for (String str : al) {
            dos.writeChars(str);
        }

        System.out.println("\nIS SUCCESFULLY WRITTEN INTO FILE! ");

        dos.writeChars("><");
        String strseq = "001100111100101000101010111010100100111000000000";

        // Ensure that you have a string of the correct size
        if (strseq.length() % 8 != 0) {
            throw new IllegalStateException(
                    "Input String is cannot be converted to bytes - wrong size: "
                            + strseq.length());
        }

        int numBytes = strseq.length() / 8;
        for (int i = 0; i < numBytes; i++) {
            int start = i * 8;
            int end = (i + 1) * 8;
            byte output = (byte) Integer.parseInt(strseq.substring(start, end), 2);
            dos.write(output);
        }

        dos.writeChars("> Enf of File");
        dos.flush();
        // Close the output stream
        dos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Подход записи байтов непосредственно в тестовый файл имеет несколько проблем (я предполагаю, что это текстовый файл, в котором имя вашего тестового файла заканчивается на .txt), наиболее очевидным из которых является то, что некоторые текстовые редакторы очень хорошо обрабатывает / отображает нулевые символы (ваш последний тестовый байт был: 00000000 или нулевой). Если вы хотите видеть байты как читаемые байты, вы можете исследовать их кодирование с использованием кодировки Base64.

0 голосов
/ 17 марта 2011

А как насчет этого кода?

этот код:


        byte[] data = new byte[strseq.length() / 8];

        for (int i = 0; i < data.length; i++) {
            data[i] = (byte) Integer.parseInt(strseq.substring(i * 8, (i + 1) * 8), 2);
            dos.write(data[i]);
        }

становится


        byte[] data = strseq.getBytes();
0 голосов
/ 17 марта 2011

С классом FileWriter у вас есть хорошая абстракция операции записи файла.

Пусть этот класс поможет вам написать ваш файл ...

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

0 голосов
/ 17 марта 2011

Line:

data[i] = (byte) Integer.parseInt(strseq.substring(i * 8, (i + 1) * 8), 2);

выглядит очень подозрительно ...

Можете ли вы предоставить подробности о strseq и его значении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...