Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > чтение файла


Автор: Fieral 12.5.2009, 14:05
Читаю файл в строку:
Код

public String File2String(String f, boolean b) throws IOException {
        // TODO Auto-generated method stub
        FileInputStream fstream;
        DataInputStream in;
        int bb;
        fstream = new FileInputStream(f);
        in = new DataInputStream(fstream);

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        if (b) {
            System.out.println("Reading: " + f);
        }
        while ((bb = in.read()) != -1) {

            out.write(bb);

        }
        String s = out.toString();

        out.close();// -Djava.security.policy=C:/rmi.plc
        in.close();
        fstream.close();

        return s;
    }


Затем пишу строку в файл:
Код

public void String2File(String f, String data, boolean b)
            throws IOException {
        // TODO Auto-generated method stub
        if (b)
            System.out.println("Writing: " + f);
        FileOutputStream fos = new FileOutputStream(f);
        fos.write(data.getBytes());
        fos.flush();
        fos.close();

    }


Текстовые файлы переносят это нормально, а изображения крошатся:
http://ipicture.ru/

Почему?


Автор: LSD 12.5.2009, 15:20
Цитата(Fieral @  12.5.2009,  14:05 Найти цитируемый пост)
Текстовые файлы переносят это нормально, а изображения крошатся:

Почему?

Потому что вот это
Код

fos.write(data.getBytes());

бред. 

У тебя бинарные данные, а ты их передаешь через строку. Естественно при преобразованиях кодировок, часть данных теряется.

Автор: Fieral 12.5.2009, 16:07
ну хорошо, допустим я засериализую данные:
Код


class suchok implements java.io.Serializable {
    byte[] data = null;
}

public String File2String(String f, boolean b) throws IOException {
        // TODO Auto-generated method stub

        FileInputStream fs = new FileInputStream(f);
        BufferedInputStream bi = new BufferedInputStream(fs);
        int bb;

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        if (b) {
            System.out.println("Reading: " + f);
        }

        while ((bb = bi.read()) != -1) {
            out.write(bb);
        }

        suchok suchok = new suchok();
        suchok.data = out.toByteArray();

        ByteArrayOutputStream out2 = new ByteArrayOutputStream();
        ObjectOutputStream oj = new ObjectOutputStream(out2);
        oj.writeObject(suchok);


        oj.flush();
        oj.close();

        String s = out2.toString();

        out.close();
        bi.close();
        fs.close();

        return s;
    }



Получаю строку в которой закопан suchok. Теперь обратно её распаковываем:

Код

    public void String2File(String f, String data, boolean b)
            throws IOException, ClassNotFoundException {
        // TODO Auto-generated method stub
        if (b)
            System.out.println("Writing: " + f);
        ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
        ObjectInputStream ik = new ObjectInputStream(in);
        suchok K = (suchok) ik.readObject();

        FileOutputStream fos = new FileOutputStream(f);
        fos.write(K.data);
        fos.flush();
        fos.close();

    }


Ничего не изменилось.

Автор: Fieral 12.5.2009, 16:34
Код

public String File2String(String f, boolean b) throws IOException {

        FileInputStream fs = new FileInputStream(f);
        BufferedInputStream bi = new BufferedInputStream(fs);
        int bb;

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        Vector<Byte> v = new Vector<Byte>();

        while ((bb = bi.read()) != -1) {
            v.add((byte) bb);
        }

        byte[] by = new byte[v.size()];
        for (int i = 0; i < v.size(); i++) {
            by[i] = v.get(i);
        }
        suchok suchok = new suchok();
        suchok.data = by;


        ByteArrayOutputStream out2 = new ByteArrayOutputStream();

        ObjectOutputStream oj = new ObjectOutputStream(out2);
        oj.writeObject(suchok);
        oj.flush();
        oj.close();

        String s = out2.toString();



        out.close();
        bi.close();
        fs.close();

        return s;
    }


Аналогично.

----

Как превратить содержимое файла в строку и обратно без потери данных?




--

Автор: LSD 12.5.2009, 17:41
Цитата(Fieral @  12.5.2009,  16:07 Найти цитируемый пост)
ну хорошо, допустим я засериализую данные:

Еще лучше smile 

Нафига нужны все эти извраты? Просто читай данные в byte[] и пиши в файл его же.
Код

    public static byte[] readFile(File inFile) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        FileInputStream in = new FileInputStream(inFile);
        try {
            byte[] buffer = new byte[32 * 1024];
            int read;
            while ((read = in.read(buffer)) != -1) {
                out.write(buffer, 0, read);
            }
        } finally {
            in.close();
        }
        return out.toByteArray();
    }

    public static void writeFile(File outFile, byte[] data) throws IOException {
        FileOutputStream out = new FileOutputStream(outFile);
        try {
            out.write(data);
        } finally {
            out.close();
        }
    }

Автор: Fieral 12.5.2009, 18:33
Ну мне хочется завернуть файл в xml:

Код

<file>
            <name>r-001.clp</name>
            <data>&#xD;(deftemplate MAIN::input1&#xD;    &#xD;    (slot percentage&#xD;</data>
</file>


Аналогично я паковал целые дериктории, пока не уперся в вышеозначенную проблему.

Автор: SoulKeeper 12.5.2009, 19:13
Закодировать byte[] в base64, потом раскодировать.

Автор: Fieral 12.5.2009, 19:39
Код


public void String2File(String f, String data, boolean b)
            throws IOException {
        // TODO Auto-generated method stub
        if (b)
            System.out.println("Writing: " + f);
        FileOutputStream fos = new FileOutputStream(f);
        
        fos.write(new sun.misc.BASE64Decoder().decodeBuffer(data));
        fos.flush();
        fos.close();

    }

public String File2String(String f, boolean b) throws IOException {
        // TODO Auto-generated method stub
        FileInputStream fstream;
        DataInputStream in;
        int bb;
        fstream = new FileInputStream(f);
        in = new DataInputStream(fstream);

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        if (b) {
            System.out.println("Reading: " + f);
        }
        while ((bb = in.read()) != -1) {

            out.write(bb);

        }
        String s = new sun.misc.BASE64Encoder().encode(out.toByteArray());
        
        out.close();// -Djava.security.policy=C:/rmi.plc
        in.close();
        fstream.close();

        return s;
    }




Автор: LSD 13.5.2009, 10:41
Осталось научиться:
1. Нормально формулировать вопрос.
2. Читать данные блоками а не побайтово.
3. Не пользоваться не стандартными пакетами.
и все будет хорошо.

Автор: Fieral 13.5.2009, 12:56
1) Кто знает правильный вопрос - уже знает пол ответа.
2) подправил
3) не понял про нестандартные пакеты

Автор: SoulKeeper 13.5.2009, 13:08
sun.* не должны использоватся, оно может быть в любой момент изменено производителем что приведет к поломке программы.

http://migbase64.sourceforge.net/
http://commons.apache.org/codec/

Вот две реализации Base64 которые можно использовать.

Автор: LSD 13.5.2009, 16:00
Цитата(Fieral @  13.5.2009,  12:56 Найти цитируемый пост)
3) не понял про нестандартные пакеты 

http://java.sun.com/products/jdk/faq/faq-sun-packages.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)