Запись массива в файл на Java

#java #arrays #file #line

#java #массивы #файл #строка

Вопрос:

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

Я пытаюсь записать массив в файл, и пока мне это удается, но программа writer просто записывает все в одну строку. По какой-то причине он не принимает мою команду new line (n) при просмотре в notepad.

Пример, чтобы попытаться объяснить:

Содержимое массива: test, test2, test3, test4

Запись в файл

Содержимое файла: test тест2 тест3 тест4

В то время как я хочу, чтобы файл был: test test2 test3 test4

Ниже приведен фрагмент моего кода для записи в файл.

     public void save(String fileName) throws FileNotFoundException {

    try {

        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        for ( int i = 0; i < nbrMovies; i  )
        {      
        writer.write(movies[i].getName()   " n");
        }
        writer.close();
    } catch(IOException ex) {
        ex.printStackTrace();
    }
}
  

Файл не принимает команду «n» и вместо этого просто помещает небольшое поле рядом с последним добавленным фильмом.

Мы были бы очень признательны за любую помощь.

Комментарии:

1. Все текстовые файлы должны быть способны принимать символ » n». Какой текстовый редактор вы используете, чтобы открыть текстовый файл, который вы только что написали? Текстовый редактор может не поддерживать чтение текстового файла в стиле unix и отображать n в виде небольшого прямоугольника. Попробуйте использовать » r n», если вы хотите иметь текстовый файл в стиле Windows. Окончания строк различаются в этих двух ОС.

2. А еще лучше, используйте writer.newLine(), и он вставит соответствующее окончание строки для платформы.

Ответ №1:

Прежде всего, вы не должны close() запускать поток после каждой записи; переместите close() за пределы вашего цикла, предпочтительно в finally блок, чтобы убедиться, что он вызван. Во-вторых, вместо записи «n», лучшим подходом является

 writer.write(movies[i].getName());
writer.newLine();
writer.flush(); //optional
  

Ответ №2:

Выньте writer.close(); из цикла for. Ваш код должен быть таким:-

  public void save(String fileName) throws FileNotFoundException {
    BufferedWriter writer = null;
    try {

        writer = new BufferedWriter(new FileWriter(fileName));
        for ( int i = 0; i < nbrMovies; i  )
        {      
          writer.write(movies[i].getName());
          writer.newLine();
      writer.flush();
        }

    } catch(IOException ex) {
        ex.printStackTrace();
    } finally{
        if(writer!=null){
            writer.close();
        }  
    }
}
  

Комментарии:

1. Этот фрагмент не будет компилироваться, потому что writer он не виден внутри finally блока.

2. @Binil Thomas — Конечно, цель не в том, чтобы предоставить готовую компиляцию, а в том, чтобы показать, в чем проблема и как это сделать лучше. Перемещение writer за пределы try catch является очень тривиальной задачей.

3. @CoolBeans — если это тривиально, почему вы этого не сделали? Я бы подумал, что цель состоит в том, чтобы дать правильный ответ.

Ответ №3:

Вот это writer.newLine(); и выведите вызов close из цикла.

Ответ №4:

 import java.io.*;

public class WriteChar 
{

    public static void main(String[] args) 
    {

        try
    {
       File f=new File("WriteChar.txt");
      char c[]={'a','b','c','d','e','f','g'};


       FileWriter out=new FileWriter(f);
       out.write(c);
       System.out.println("Done ..........");
       out.close();
    }

        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }

}
  

Ответ №5:

Оберните FileWriter или BufferedWriter с помощью PrintWriter, и у вас будет доступ к методу println(…).

Ответ №6:

Переместите writer.close() за пределы цикла. Кроме того, убедитесь, что вы очистили программу записи перед ее закрытием.

Комментарии:

1. close() имеет неявную функцию flush()

Ответ №7:

Почему вы не вызываете close вне цикла?

 Writer writer = null;
try {
    writer = new BufferedWriter(new FileWriter(fileName));
    for (Movie movie : movies) {      
        writer.write(movie.getName()   " n");
    }
} catch(IOException ex) {
    ex.printStackTrace();
} finally {
    if (writer != null) {
        try {
            writer.close();
        } catch (IOException ignored) {
        }
    }
}
  

Ответ №8:

Я согласен с перемещением writer.close() за пределы цикла. Но есть более простой способ сделать то, что вы хотите — вместо вызова функции перевода строки просто добавьте возврат каретки вместо return в конце инструкции, т.Е.

измените инструкцию: writer.write(movies[i].getName() " n"); на: writer.write(movies[i].getName() " rn");

Комментарии:

1. Это сработает, потому что блокноту требуются как r , так и n для распознавания новой строки. Так что это не проблема с записью файла — скорее это проблема с открытием файла в стиле Linux в блокноте.