2017-02-21 15 views
0

Я создал программу, в которой есть файл с именем groups.txt. Этот файл содержит список имен. Чтобы удалить группу, она должна существовать внутри файла. Я использовал метод Scanner для поиска по каждой строке для имени. Если он содержит строку, он устанавливает значение val как 1. Что вызывает условие val == 1. То, что я хотел сделать во время этого блока, заключается в попытке удалить groupName из файла groups.txt. Для этого я создал новый txt-файл под названием TempFile, который копирует все имена из group.txt EXCEPT groupName. Затем этот файл переименовывается в файл groups.txt, и старый файл groups.txt удаляется.Как переименовать файл txt с помощью Java после копирования содержимого из другого txt-файла

Все работает по назначению, за исключением переименования. Файл temp.txt все еще существует, и файл groups.txt не изменяется. Я проверил булевский успех, и он всегда возвращается как ложный. Есть идеи, как это решить?

if (method.equals("delete group")){ 
       int val = 0; 
       String groupName = myClient.readLine(); 

       try { 
        Scanner file = new Scanner(new File("groups.txt")); 

        while (file.hasNextLine()){ 
         String line = file.nextLine(); 

         if (line.indexOf(groupName) != -1){ 

           val = 1;  
         } 
        } 
        if (val == 1){ 

           try { 

            File groupFile = new File("groups.txt"); 
            File tempFile = new File("temp.txt"); 

            BufferedReader reader = new BufferedReader(new FileReader(groupFile)); 
            BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile)); 

            String currentLine; 
            System.out.println(groupName); 
            while ((currentLine = reader.readLine()) != null){ 

             String trimLine = currentLine.trim(); 

             if (trimLine.equals(groupName)){ 
              continue; 
             } else { 
              writer.write(currentLine + System.getProperty("line.separator")); 
             } 
            } 
            writer.close(); 
            reader.close(); 
            groupFile.delete(); 
            boolean success = tempFile.renameTo("groups.txt"); 

           } catch (IOException f){ 
            System.err.println("File Not Found: " + f.getMessage()); 
           }      } 

       } catch (FileNotFoundException f){ 
        System.err.println("File Not Found Exception: " + f.getMessage()); 
       } 

      } 

КОД ПЕРЕД ВЫШЕ:

if (command.equals("group")){ 
      String method = myClient.readLine(); 

      if (method.equals("create group")){ 

       String groupName = myClient.readLine(); 

       int val = 0; 

       try { 
        Scanner file = new Scanner(new File("groups.txt")); 

        while (file.hasNextLine()){ 
         String line = file.nextLine(); 
         if (line.indexOf(groupName) != -1){ 
          Report.error("group name already exists, please pick another"); 
          val = 1;         
         } 
        } 
       } catch (FileNotFoundException f){ 
        System.err.println("File Not Found: " + f.getMessage()); 
       } 

       if (val == 0){ 
        try { 
         PrintWriter out = new PrintWriter(new FileWriter("groups.txt", true)); 
         out.println(groupName); 
         out.close(); 

        } catch (IOException e){ 
         Report.error("IOException: " + e.getMessage()); 
        } 
       } 

Во второй части кода, это где я первоначально обновить файл groups.txt. Поэтому каждый раз, когда пользователь добавляет группу, он обновляет файл groups.txt, добавляя новое имя группы в конец файла. Во-первых, я уверен, что имя_группы еще не существует с помощью Scanner. myClient - это BufferedReader, который читает из другого класса, который хранит то, что пользователь вводит в командной строке.

+0

проверить возвращаемое значение 'groupFile.delete()' –

+0

значения возвращает ложь :( – assassinweed2

+0

На самом деле, @HappyHal может быть на что-то упомянуть, чтобы закрыть сканер, который открывает 'groups.txt' –

ответ

2

Также не забудьте закрыть Сканер. Сначала вы должны сделать операцию delete() и убедиться, что знаете свой текущий рабочий каталог и напишите свой путь к файлу относительно него. Проверьте с:

File file = new File("abc.txt"); 
System.out.println(file.getAbsolutePath()); 

Одна вещь может быть не связан, а также проверить свою среду, потому что

В на Unix'esque O/S-х вы не можете RenameTo() через файловые системы. Это поведение отличается от команды «mv» Unix. При скрещивании файловых систем mv делает копию и удаление, что вам нужно делать, если это так. То же самое произошло бы на Windows, если вы пытались RenameTo другого диска, то есть C: -> D:

+0

delete() возвращает false. Я использую Windows, и оба файла хранятся в одной и той же папке вместе со всем моим .java-кодом. Все копируется в правильные файлы txt. Единственная проблема - просто удалить старый файл и переименовать новый файл.С закрывающим сканером я попытался сделать это сразу после того, как я закрою BufferedReader и BufferedWriter, и проблема остается. – assassinweed2

+0

Вы пытались закрыть Scanner? – HappyHal

+0

Извините, я просто редактировал свой комментарий, чтобы включить это, я забыл упомянуть, что я попробовал. Я закрыл сканер прямо после того, где я закрыл BufferedReader и BufferWriter. Нет прогресса :( – assassinweed2