【问题标题】:Write to text file without overwriting in Java写入文本文件而不用 Java 覆盖
【发布时间】:2012-04-15 05:16:37
【问题描述】:

我正在尝试编写一种方法,如果一个“log.txt 文件”尚不存在,然后写入该文件。我遇到的问题是每次调用该方法时,它都会覆盖现有日志。如何更改方法,而不是覆盖数据而只是更新文件?

我的写文件方法:

    File log = new File("log.txt")
    try{
    if(log.exists()==false){
            System.out.println("We had to make a new file.");
            log.createNewFile();
    }
    PrintWriter out = new PrintWriter(log);
    out.append("******* " + timeStamp.toString() +"******* " + "\n");
    out.close();
    }catch(IOException e){
        System.out.println("COULD NOT LOG!!");
    }

【问题讨论】:

  • PrintWriter pw = new PrintWriter(new FileWriter(New File(), true));

标签: java


【解决方案1】:

只需将PrintWriter out = new PrintWriter(log); 更改为

PrintWriter out = new PrintWriter(new FileWriter(log, true));

【讨论】:

  • 非常感谢!如果您能解释为什么更改参数会修复它,我将不胜感激。
  • 来自 javadoc,FileWriter(文件文件,布尔附加)。第二个参数表示文件是否以追加模式打开。
  • 它对我不起作用。我的目标文件中只有最后一个文本:(
  • 不错。但是我们可以通过写new FileWriter(log, true)来实现
【解决方案2】:

改用 FileWriter。

FileWriter(File file, boolean append)

构造函数中的第二个参数告诉 FileWriter 将任何给定的输入附加到文件而不是覆盖它。

以下是您的示例的一些代码:

File log = new File("log.txt")

try{
    if(!log.exists()){
        System.out.println("We had to make a new file.");
        log.createNewFile();
    }

    FileWriter fileWriter = new FileWriter(log, true);

    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    bufferedWriter.write("******* " + timeStamp.toString() +"******* " + "\n");
    bufferedWriter.close();

    System.out.println("Done");
} catch(IOException e) {
    System.out.println("COULD NOT LOG!!");
}

【讨论】:

  • 不必包含if (!log.exists()) { log.createNewFile(); } 块,因为如果文件不存在,写入文件将创建它。
  • 这不是必需的,因为如果文件不存在,FileWriter 将尝试固有地创建文件。如果无法创建文件,则会抛出 IOException。但是,添加额外的检查有助于提高可理解性,并在代码中创建一个防御点来扩展错误处理。
【解决方案3】:

由于某种原因,其他方法都不适合我......所以我尝试了这个并且成功了。希望对你有帮助。。

JFileChooser c= new JFileChooser();
c.showOpenDialog(c);
File write_file = c.getSelectedFile();
String Content = "Writing into file\n hi \n hello \n hola";
try 
{
    RandomAccessFile raf = new RandomAccessFile(write_file, "rw");
    long length = raf.length();
    System.out.println(length);
    raf.setLength(length + 1); //+ (integer value) for spacing
    raf.seek(raf.length());
    raf.writeBytes(Content);
    raf.close();
} 
catch (Exception e) {
    System.out.println(e);
}

【讨论】:

    【解决方案4】:
    JFileChooser c= new JFileChooser();
    c.showOpenDialog(c);
    File write_file = c.getSelectedFile();
    String Content = "put here the data to be wriiten";
    try
        {
        FileWriter fw = new FileWriter(write_file);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.append(Content);
        bw.append("hiiiii");
        bw.close();
        fw.close();
        }
    catch(Exception e)
       {
        System.out.println(e);
       `}
    

    【讨论】:

    • 这是最简单的方法
    【解决方案5】:

    您甚至可以使用FileOutputStream 来获得您需要的东西。原来是这样,

    File file = new File(Environment.getExternalStorageDirectory(), "abc.txt");
    FileOutputStream fOut = new FileOutputStream(file, true);
    OutputStreamWriter osw = new OutputStreamWriter(fOut);
    osw.write("whatever you need to write");
    osw.flush();
    osw.close();
    

    【讨论】:

      【解决方案6】:

      您可以更改您的 PrintWriter 并使用方法 getAbsoluteFile(),此函数返回给定抽象路径名的绝对 File 对象。

      PrintWriter out = new PrintWriter(new FileWriter(log.getAbsoluteFile(), true));

      【讨论】:

        【解决方案7】:

        试试这个

        public void writeFile(String arg1,String arg2) {
        		try {
        			if (!dir.exists()) {
        
        				if (dir.mkdirs()) {
        
        					Toast.makeText(getBaseContext(), "Directory created",
        							Toast.LENGTH_SHORT).show();
        				} else {
        					Toast.makeText(getBaseContext(),
        							"Error writng file " + filename, Toast.LENGTH_LONG)
        							.show();
        				}
        			}
        
        			else {
        
        				File file = new File(dir, filename);
        				if (!file.exists()) {
        					file.createNewFile();
        				}
        				
        				FileWriter fileWritter = new FileWriter(file, true);
        				BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
        				bufferWritter.write(arg1 + "\n");
        				bufferWritter.close();
        
                    } catch (Exception e) {
        			e.printStackTrace();
        			Toast.makeText(getBaseContext(),
        					"Error writng file " + e.toString(), Toast.LENGTH_LONG)
        					.show();
        		}
        
        	}

        【讨论】:

          【解决方案8】:

          这是一个简单的例子,说明它是如何工作的,最好的做法是在其中放入 try\catch,但对于基本用途,这应该可以解决问题。为此,您有一个字符串和文件路径,因此适用于 FileWriter 和 BufferedWriter。这将写入“Hello World”(数据变量),然后换行。每次运行它都会将 Data 变量添加到下一行。

          import java.io.BufferedWriter;
          import java.io.File;
          import java.io.FileWriter;
          
          
          String Data = "Hello World";
          File file = new File("C:/Users/stuff.txt");
          FileWriter fw = new FileWriter(file,true);
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(Data);
          bw.newLine();
          bw.close();
          

          【讨论】:

            【解决方案9】:
            BufferedWriter login = new BufferedWriter(new FileWriter("login.txt"));
            

            是一个例子,如果你想在一行中创建一个文件。

            【讨论】:

              猜你喜欢
              • 2011-05-08
              • 1970-01-01
              • 1970-01-01
              • 2023-03-28
              • 1970-01-01
              • 2020-03-28
              • 2016-04-25
              • 2012-06-18
              • 1970-01-01
              相关资源
              最近更新 更多