2017-06-15 61 views
0

所以这可能是也可能不是一个愚蠢的问题,但我们在这里!写入文件问题

所以我试图写入一个文件,它不覆盖,但它一遍又一遍地写,所以我需要帮助。

方法:

@SuppressWarnings("resource") 
public static void writeFile(File file, String index) { 
    try { 
     boolean wri = false; 
     PrintWriter out = new PrintWriter(new FileWriter(file, true)); 
     Scanner scanner = new Scanner(file); 
     while(scanner.hasNext()) { 
      String str = scanner.nextLine(); 
      if(str.equals(index)) { 
       System.out.println(index); 
       scanner.close(); 
       wri = true; 
       break; 
      } else { 
       wri = false; 
       break; 
      } 
     } 

     if(wri != false) 
      return; 
     out.write(index); 
     out.write("\n"); 
     out.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

你的意思是它不覆盖文件,而是在每次电话会议上追加它?如果是这样,那是因为在'FileWriter'中传递了'true',表示追加。但我不确定我是否正确地回答了这个问题。 – KevinO

+0

正如评论所暗示的,您正在使用相同的'file'来写入(在'PrintWriter'中),正如您从(在Scanner中)读取的那样。这是预期的行为? – KevinO

+0

@KevinO是的,我想检查它是否先写入,如果不是,写入文件,否则不写。 – BeastlyMC956

回答

2

你的代码是完全错误的。

  • 不要nextLine()使用hasNext()。改为使用hasNextLine()

  • 如果找不到index,请不要关闭scanner

  • 如果找到index,那么您不关闭out

  • 即使您不需要写任何东西,也可以打开写入文件。

  • 您忽略异常。

  • if(wri != false)是一个非常模糊的方式来编写if (wri)

  • 如果您只使用write()方法,则无需将FileWriter包装在PrintWriter中。

由于显式调用FileWriter constructorappend模式,我会假设你想写index到文件,当且仅当文件不包含文本。

请注意,如果index包含换行符,则您的逻辑将不起作用。

既然你只能读线,你应该使用BufferedReader,而不是Scanner,因为Scanner有一个非常大的开销。

至于您没有关闭资源,请使用try-with-resources

您的代码应该是这样的:

public static void writeFile(File file, String index) { 
    if (file.exists()) { 
     try (BufferedReader in = new BufferedReader(new FileReader(file))) { 
      for (String line; (line = in.readLine()) != null;) 
       if (line.equals(index)) 
        return; 
     } catch (Exception e) { 
      throw new RuntimeException("Error reading file: " + file, e); 
     } 
    } 
    try (FileWriter out = new FileWriter(file, true)) { 
     out.write(index); 
     out.write(System.lineSeparator()); 
    } catch (Exception e) { 
     throw new RuntimeException("Error appending to file: " + file, e); 
    } 
} 

测试

File file = new File("C:/temp/test.txt"); 
writeFile(file, "Hello"); 
writeFile(file, "World"); 
writeFile(file, "Hello"); 

文件内容

Hello 
World 
+0

完美的作品! – BeastlyMC956

-1

尝试

PrintWriter out = new PrintWriter(new FileWriter(file, false)); 
+0

如果这样做,文件将在'Scanner'循环之前清除,那么循环的重点是什么? – Andreas

+0

这只写了我说过的最后一件事。 – BeastlyMC956

+0

确实没有意义,我认为他得到了一些前面写过的东西来处理它的文件,无论如何,我的答案显示如何在写入时逃避附加到文件。 – Frank