Когда мой этот файл заблокирован? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий метод:

  public static void main(String[] args)
  {
      DataWriter.addScore(2, DataWriter.score(8.5,2.25, 170.0);
   }

И этот класс, DataWriter:

   public class DataWriter
    {
            public static int findTextInFile(String s) //returns an int representing the line number of String s
            {
                try
                {
                int ln = 0;
                File data = new File("data.txt");

                    String line = null;
                    Scanner fileInput = new Scanner(data);
                    while(fileInput.hasNextLine())
                    {
                    String prevLine = fileInput.nextLine();
                    ln++;
                    if(prevLine.equals(s))
                    {
                     //   br.close(); 
                        return ln;
                    }

                }
               //br.close();
            }
            catch(Exception e) { System.out.println(e); } 

            return 0;

        }
        public static void addScore(int prompt, String stats) //Calls the WriteAfterNthLine method with a prompt number and stats string.
            {
                try
                {
                    switch(prompt)
                    { 
                        case 1:
                            writeAfterNthLine("data.txt", stats, findTextInFile("NORMAL"));
                            break;
                        case 2:
                            writeAfterNthLine("data.txt", stats, findTextInFile("SMALL"));
                            break;
                        case 3:
                            writeAfterNthLine("data.txt", stats, findTextInFile("NUMBERS"));
                            break;
                        case 4:
                            writeAfterNthLine("data.txt", stats, findTextInFile("COMMON WORDS"));
                            break;
                        case 5:
                            writeAfterNthLine("data.txt", stats, findTextInFile("OTHER"));
                            break;
                        default:
                            System.out.println("ERROR INVALID SUBMISSION"); 
                        break;
                }
                }
                catch(Exception e)
                {
                    System.out.println(e);
                }
            }
   public static void writeAfterNthLine(String filename, String text, int lineno) throws IOException //Writes String to filename on line lineno
        {
        //TODO:Document this method.
            File file = new File(filename); 
            File tmpDir = new File("C:/Users/jacobw4107/Documents/EZType"); //This is the current directory.
            System.out.println("Made temporary Directory " +tmpDir);
            File temp = File.createTempFile("temp-file-name", ".tmp", tmpDir);
            BufferedReader br = new BufferedReader(new FileReader( file ));
            PrintWriter pw =  new PrintWriter(new FileWriter( temp ));
            String line;
            int lineCount = 0;
            while ((line = br.readLine()) != null) {
                pw.println(line);
                System.out.println(line);
                if(lineCount==lineno){
                    pw.println(text);
                }
                lineCount++;
            }
            br.close();
            pw.close();
            File old = new File("data.old");
            if(old.exists())
                System.out.println(old.delete()); 
            System.out.println(file.renameTo(new File("data.old")));
            System.out.println(temp.renameTo(new File("data.txt")));
    }
           }

Когда я вызываю метод writeAfterNthLine сам по себе, все функционируетправильно.Однако выполнение описанного выше метода main приводит к сбою последних двух строк метода writeAfterNthLine .Последние две строки renameto завершаются ошибкой и возвращают false.Если я пытаюсь вручную переименовать data.txt , я получаю следующую ошибку:

Невозможно выполнить действие, так как файл открыт в платформе Java (TM)Двоичный файл SE.

Итак, какой метод блокирует файл?

Я использую Windows 10 Education версию 1703. У меня нет иметь права администратора.

1 Ответ

0 голосов
/ 11 мая 2018

Попробуйте:

public static void addScore(int prompt, String stats) //Calls the WriteAfterNthLine method with a prompt number and stats string.
 {
   String /*Object ...??*/ tmp = null;
   try {
     switch(prompt) { 
       case 1:
         tmp = findTextInFile("NORMAL");
         break;
       case 2:
         tmp = findTextInFile("SMALL");
         break;
       case 3:
         tmp = findTextInFile("NUMBERS");
         break;
       case 4:
         tmp = findTextInFile("COMMON WORDS");
         break;
       case 5:
         tmp = findTextInFile("OTHER");
         break;
       default:
         System.out.println("ERROR INVALID SUBMISSION"); 
         break;
     }// end-switch
   } catch(Exception e) {// end-try
     System.out.println(e);
   }
   if(tmp != null) {
     writeAfterNthLine("data.txt", stats, tmp); // ;)
   }
 }//end-addScore

И , пожалуйста, закройте ваши ресурсы (Потоки / Считыватели / Буферы / Писатели / Сканеры (!) / Соединения и т. Д.)!:

И к вашему актуальному вопросу: я предполагаю утечку в вашем неоткрытом Сканере (в findInTextInFile) .. и тупик в цепочечном вызове: writeFile(..., readFile()) ... того же файла! ... но "другие / бесхозные процессы" также могут быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...