Почему моя попытка добавить текст в файл не отвечает?

Я просто пытаюсь добавить новую строку текста в свой файл *.txt, но ничего не происходит. Файл упакован с расширением .war, поэтому я использую ClassLoader для доступа к файлу. Кроме того, и моя IDE eclipse, и содержимое файла используют кодировку UTF-8.

Я использовал их для вдохновения:

Как добавить новую строку текста в существующий файл на Java?

объект Java BufferedWriter с utf-8

Теперь мой код в основном основан на последнем сообщении и выглядит так:

public class test {


    public static void main(String[] args){

        URL url = Thread.currentThread().getContextClassLoader().getResource("MilestoneExport.txt");

        File file = new File(url.getFile());

        System.out.println(file.canRead()); //true
        System.out.println(file.canWrite()); //true


        try {
            BufferedWriter out = new BufferedWriter
                (new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
            out.append("new line");
            out.append("new line 2");
            out.append("new line 3");
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
}

Я подтвердил, что файл действительно найден, и он нормально читается. Я смог вывести все его содержимое на консоль с помощью файла BufferedReader. Путь к файлу тоже правильный, но в файл абсолютно не добавляется текст. Я убедился, что обновлял и обновлял каждый раз, когда запускаю программу.

Кроме того, я попытался создать простой пустой файл с именем foo.txt, который находится в том же каталоге, что и test.java. Я добавил следующий код в основной метод, предоставленный BufferedWriter API, по адресу http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html

PrintWriter out2 = new PrintWriter(
    new BufferedWriter(new FileWriter("foo.txt")));
out2.println("new Line");
out2.close();

Что мне здесь не хватает? Почему нет сообщений об ошибках, а также ответов или отзывов?

ВСЕ НИЖЕ ЯВЛЯЕТСЯ ТОЛЬКО ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИЕЙ О ТО, ЧТО Я ПРОБОВАЛА. НЕТ ОТЗЫВОВ НИ В КОЕМ СЛУЧАЕ:

Кроме того, этот код из этого ответа тоже ничего не делает...

try {
        BufferedWriter output = new BufferedWriter(new FileWriter(new File("house.txt")));

        output.write("text");
        output.close();
    } 
    catch (IOException e) {
        e.printStackTrace();
    } 

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

ИЗМЕНИТЬ:

этот код:

System.out.println(file.exists());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
System.out.println(file.getName());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.setLastModified(new   GregorianCalendar().getTimeInMillis()));

выдает следующие результаты:

  • истинный
  • D:\Data\myworkspace\MyProject\target\classes\MilestoneExport.txt
  • D:\Data\myworkspace\MyProject\target\classes\MilestoneExport.txt
  • MilestoneExport.txt
  • ложный
  • истинный
  • истинный

Я совершенно неправильно понимаю использование файловых объектов java и их использование с FileWriters? Файл явно 100% подтвердил правильный файл.


person jumps4fun    schedule 15.07.2014    source источник


Ответы (4)


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

Причина того, что вы разместили в комментариях, заключается в том, что ваша среда IDE не будет извлекать файл ресурсов из скомпилированной программы, если вы хотите синхронизировать внутренние данные, вы можете настроить соединение клиент-сервер с помощью сокетов и создать программу который записывает данные в локальный файл из пакетов данных, отправляемых в ваше веб-приложение, в противном случае извлечение отредактированного файла с того места, где вы размещаете, может быть менее сложным (или, если вы развертываете с того же ПК, вам может сойти с рук символическая или жесткая ссылка)

person Dark Eye    schedule 15.07.2014
comment
Я думаю, что вы на что-то здесь. Файл точно найден, но не изменен, а может сохранен обратно в другое место? Я думаю, мне нужно сделать компьютерный поиск. - person jumps4fun; 15.07.2014
comment
Это на самом деле лучший ответ здесь. Кстати, добро пожаловать в Stack Overflow. Было бы неплохо, если бы вы расширили этот ответ, чтобы он содержал немного больше деталей, и я вам его предоставлю. Мой файл загружается из исходной папки моего веб-приложения, и когда веб-приложение упаковано, оно упаковывается в целевую папку. здесь он извлекается при запуске веб-приложения. Пока веб-приложение никогда не перезапускается, файл можно записывать и читать. Но это не отразится в исходной папке моей IDE. если я продолжу разработку и развертывание новых версий, новые данные будут потеряны. - person jumps4fun; 15.07.2014

Вы должны использовать другой конструктор FileOutputStream, чтобы открыть файл в режиме добавления:

FileOutputStream (Файловый файл, логическое добавление)

I.e,

new FileOutputStream(file, true)

person Eran    schedule 15.07.2014
comment
Извините, что я забыл упомянуть об этом, но я тоже пробовал это. Первый на самом деле. До сих пор нет ответа или вывода любого рода. Пока абсолютно ничего из этого не работает, проблема, вероятно, в чем-то совершенно другом. Я пробовал слишком много разных вещей, чтобы думать, что это проблема синтаксиса. Написание просто не работает ни в каком виде, и я понятия не имею, в чем может быть проблема? - person jumps4fun; 15.07.2014

Я пробовал этот код, который очень похож на ваш, и он работает хорошо, поэтому я думаю, что проблема в том, как вы выбираете путь к файлу.

public static void main(String[] args){

    File file = new File("./localtest.txt");

    System.out.println(file.canRead()); //true
    System.out.println(file.canWrite()); //true


    try {
        BufferedWriter out = new BufferedWriter
            (new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
        out.append("new line");
        out.append("new line 2");
        out.append("new line 3");
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }   
}
person Rafael    schedule 15.07.2014
comment
Спасибо. Подтверждение того, что часть кода работает в других местах, очень ценно для меня. - person jumps4fun; 15.07.2014
comment
Однако мне удалось подтвердить путь к моему файлу, поэтому извлечение файла работает отлично. Разве я не могу вернуться к тому же файлу и пути, который я нашел ранее? - person jumps4fun; 15.07.2014
comment
Могу ли я спросить, был ли ваш файл уже существующим или он был создан вашим кодом? Где в вашей структуре каталогов он оказался? Я пробовал точно такой же код, но, насколько я могу судить, здесь он не работает. - person jumps4fun; 15.07.2014
comment
Файл не существовал, в моем примере был создан новый. Если это поможет, я склонен использовать новейшие классы Java 7 Files.newBufferedWriter(Paths.get(URL), StandardCharsets.UTF_8, StandardOpenOption.APPEND). Обратите внимание, что StandardCharsets и StandardOpenOption являются перечисляемыми классами, поэтому вы можете проверить возможные значения. Также общепринятой практикой является использование библиотек ввода-вывода Apache для упрощения этих операций, поскольку это скрывает некоторые сложности операций ввода-вывода файлов. Наконец, пожалуйста, не забудьте сбросить и закрыть файлы. Надеюсь, что некоторые из этих предложений могут помочь вам. - person Rafael; 16.07.2014

это работает

 PrintWriter pw= new PrintWriter(
    new BufferedWriter(new FileWriter("C:\\foo.txt")));
    pw.println("line 1");
    pw.close();
person AeOn    schedule 15.07.2014
comment
Оно делает. Одна вещь, которую, кажется, имеют все ответы здесь, заключается в том, что целевое местоположение файла, в который я пишу, нуждается в корректировке. - person jumps4fun; 15.07.2014