У меня есть следующий метод:
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. У меня нет иметь права администратора.