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


Автор: 4epT 20.4.2009, 23:34
Добрый вечер! 
Ситуация такая ... пишу в файл строки, символы русские. Вот метод которые собственно и записывает:

Код

    public void writeListToFile(String fName) throws FileNotFoundException, IOException
    {
        File f = new File(fName);
        OutputStream out = new FileOutputStream(f);
        for(int i=0; i<list.size();i++)
        {
            byte[] bytes = list.get(i).toStringParse().getBytes("Cp1251");
            out.write(bytes);
            out.write((new String("|")).getBytes());
        }
        out.close();
    }


А вот метод который читает из файла:

Код

    public Vector<myModelHumans> readListFile(String fName) throws FileNotFoundException, IOException
    {
        Vector<myModelHumans> li = new Vector<myModelHumans>();
        File f = new File(fName);
        String str2 = "";
        InputStream in = new FileInputStream(f);
        StringBuilder sb = new StringBuilder();
        
        while(in.available()>0)
        {
            int tmp = in.read();
            sb.append((char)tmp);
        }
        String str = sb.toString();
        byte[] b = str.getBytes("Cp1251");
        String res = new String(b,"Cp1251");
        System.out.print(res);
        System.out.println();
        System.out.println(System.getProperty("file.encoding"));
        return li;
    }


Считывают иероглифы (( хотя в файле все записано нормально ....
Кто может подсказать что не так делаю ? 

Автор: can4ec 21.4.2009, 03:04
привет!

Ошибка  в чтении данных из файла. sb.append((char)tmp); В твоем случае получается что считаный байт просто скопируется в char.
Такому копированию соответствует кодировка ISO-8859-1 (которая один в один соответствует первым 256 значениям Unicode), а значит, можно считать, что этот код просто использует её (вместо той, в которой реально закодированы символы в оригинальных данных).
Как вариант предлагаю:

Код

int b;
ByteArrayOutputStream baos = new ByteArrayOutputStream();

while( (b=is.read())!=-1 ) {
   baos.write( b );
  }

String s = baos.toString();
s = baos.toString("Cp1251");


Так же лучше сделать чтобы считывал массив байт, а не по одному. При записи в ByteArrayOutputStream можно указать с какого байта считывать из массива.
Код

byte[] buffer = new byte[100];
        int count;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        while ((count = is.read(buffer)) != -1)
        {
            baos.write(buffer, 0, count);
        }

        String s = baos.toString();
        s = baos.toString("Cp1251");


Автор: 4epT 21.4.2009, 06:57
Спасибо, все получилось!!! ))

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