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


Автор: xreal 15.8.2010, 19:00
Построчно записываю массив в файл, всё бы хорошо, только в конце файла появляются 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();
    }

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

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

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

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

Код

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 не помог. Так что рад буду ещё варианты послушать.

Автор: jk1 15.8.2010, 20:31
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()]);
    }

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

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 выдаёт без текста.

Автор: jk1 15.8.2010, 21:51
Цитата

сделал так, но теперь мне одни 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'ами Вы затираете весь считанный до этого массив.
Зачем?

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

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

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