Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с записью в файл 
V
    Опции темы
xreal
Дата 15.8.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Построчно записываю массив в файл, всё бы хорошо, только в конце файла появляются null, которые позже мешают корректному выполнению программы. Подскажите, как быть.
Код

public static void saveToFile(String res) throws UnsupportedEncodingException, FileNotFoundException, IOException {
        file = new File(res);
        BufferedWriter writeit = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "cp1251"));
        for (int i = 0; i < mas.length; i++) {
            writeit.write(mas[i]+"\n");
        }
        writeit.close();
    }

PM MAIL   Вверх
jk1
Дата 15.8.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Общая рекомендация: раз поток вывода буферизованный, то стоит принудительно опустошать неполный буфер перед закрытием:
Код

...
writeit.flush();
writeit.close();
...

А в данном конкретном случае скорее всего дело в массиве: в его последних элементах лежат null, вот они и записывается в файл.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
xreal
Дата 15.8.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Спасибо. А что касается массива, то он берётся из файла. Размер определяю так:

Код

file = new File(src);
        BufferedReader readit = new BufferedReader(new InputStreamReader(new FileInputStream(file), "cp1251"));
        readit.mark(1000);
        while ((line = readit.readLine()) != null) {
            count++;
        }

        readit.reset();
        mas = new String[count];


А flush не помог. Так что рад буду ещё варианты послушать.

Это сообщение отредактировал(а) xreal - 15.8.2010, 20:07
PM MAIL   Вверх
jk1
Дата 15.8.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



flush() и не мог быть причиной вашей проблемы, не зря же я его общей рекомендацией назвал.
Есть подозрение, что неправильно читается входной файл. Зачем вам определять размер файла? может быть стоит просто читать его так:
Код

    public  String[] readFile(String src) throws IOException{
        String line;
        List<String> stringsList = new LinkedList<String>();
        File file = new File(src);
        BufferedReader readit = new BufferedReader(new InputStreamReader(new FileInputStream(file), "cp1251"));
        while ((line = readit.readLine()) != null) {
            stringsList.add(line);
        }
        return stringsList.toArray(new String[stringsList.size()]);
    }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
xreal
Дата 15.8.2010, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Я наверное что-то не до конца правильно понял... Мы прочитали файл в связный список, а потом связный список преобразовали в массив...
Код

List<String> stringsList = new LinkedList<String>();
        file = new File(src);
        BufferedReader readit = new BufferedReader(new InputStreamReader(new FileInputStream(file), "cp1251"));
        while ((line = readit.readLine()) != null) {
            stringsList.add(line);
        }

        mas = stringsList.toArray(new String[stringsList.size()]);
        for (int i=0; i < mas.length; i++) {
            mas[i] = readit.readLine();
            System.out.println(mas[i]);
            stringsList.toArray();
        }
        readit.close();


сделал так, но теперь мне одни null выдаёт без текста.
PM MAIL   Вверх
jk1
Дата 15.8.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

сделал так, но теперь мне одни null выдаёт без текста. 

Давайте разбирать. Первый кусок читает файл построчно, строки кладет в связный список
Код

List<String> stringsList = new LinkedList<String>();
file = new File(src);
BufferedReader readit = new BufferedReader(new InputStreamReader(new FileInputStream(file), "cp1251"));
while ((line = readit.readLine()) != null) {
            stringsList.add(line);
}

Затем список преобразуется в массив
Код

mas = stringsList.toArray(new String[stringsList.size()]);

Казалось бы у нас есть искомое, но далее Вы (почему-то) продолжаете читать файл, хотя он кончился
Код

for (int i=0; i < mas.length; i++) {
            mas[i] = readit.readLine();
            System.out.println(mas[i]);
            stringsList.toArray();
        }

вполне понятно, что возвращается null. Этими null'ами Вы затираете весь считанный до этого массив.
Зачем?


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
xreal
Дата 15.8.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Уууу это я уже совсем видимо)) Пересидел за компом и внимание на нуле и голова работает с перебоями)) У меня же там метка была и возвращение на неё до начала чтения, а теперь то не надо) а я и забыл что в цикле снова читаю...)) Спасибо)) 

Это сообщение отредактировал(а) xreal - 15.8.2010, 21:59
PM MAIL   Вверх
jk1
Дата 15.8.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Незачто. Если вопрос решился, пометьте тему как решенную.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.