#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 в блокноте.