【问题标题】:Append to a certain part of a text file in Java附加到Java中文本文件的某个部分
【发布时间】:2016-05-20 13:38:13
【问题描述】:

我有一项任务,我创建了一个程序来销售和订购电子设备,并在新的销售/订单完成时更新两个文本文件。

我找到了一种更新文本文件而不是覆盖它的方法,因此任何旧订单/销售都不会丢失,新订单/销售将添加到文件末尾,但我的任务要求我将文本文件放在如下形式:

SALES
{
    SALE
    {

       (Sale info here)

     }

    SALE
    {

       (Another sale info here)

     }

}

SALES { } 需要在整个文件中出现一次,我需要使用每个 SALE { } 更新文件。我能做到吗 作者只在 SALES } 之后(因此在第 3 行)和 } 之前(所以在倒数第二行)写入,即使在重新启动应用程序之后?

这是我作者的部分代码:

    File file1= null;
    BufferedWriter writer=null;

    try {
        file1=new File(path);
    }

    catch (NullPointerException e) {
        System.err.println ("Not Found.");
    }

    try {
        writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file1, true)));
    }

    catch (FileNotFoundException e) {
        System.err.println("Error opening file for writing.");
    }

    try 
    {
        writer.write("SALES " + "\n" + "{");

        //Writer writes sale info here

        writer.write("\n" + "}");

    }

    catch (IOException e) {
        System.err.println("Write error!");

    }

基本上到目前为止,每次我运行程序时它都会创建 SALES{ },这是我不想要的。

我想到的另一种方法基本上是使用以下内容开始文件:

SALES
{
}

然后用每个新订单覆盖最后一行,在每次执行结束时,我将在最后添加另一个 },这将关闭上面的 SALES {。但我也不知道该怎么做。

对不起,如果这听起来很业余。提前感谢您的任何回答。

【问题讨论】:

  • 也请分享您的代码
  • 添加了我作者的部分代码。
  • 通常人们通过写一个新文件然后重命名来解决这个问题。在你的情况下这可能吗?
  • @Alexander 你是什么意思?我想到的唯一方法是让作者写入一个临时文件,然后在第 2 行和主要销售文件的最后一行之间复制整个文件。但我也不知道该怎么做。
  • 我不确定,但这可以通过以下方式完成,读取文件并初始化对象或对象集合,将新对象(条目)添加到该集合。将集合写入文件。

标签: java bufferedwriter


【解决方案1】:

您可以尝试的一种方法是检查“SALES {" 字符串存在于您的文件中。如果存在,您可以直接写入销售信息,否则写入整个文件。

您可以在代码中包含以下 sn-p 以逐行扫描文件,如下所示:

Scanner scanner = new Scanner(file1);
while(scanner.hasNextLine()){
 if("SALES{".equals(scanner.nextLine().trim())){
    //Writer writes sale info here
    break;
  }else{
   writer.write("SALES " + "\n" + "{");
    //Writer writes sale info here
    writer.write("\n" + "}");
  }
 } 

【讨论】:

    【解决方案2】:

    首先,用这个作为行分隔符:

    String lineSeparator = System.getProperty("line.separator");
    

    为什么?不同的系统使用不同的方式来分隔行(\n

    在您的代码中,您将 de +"\n"+ 更改为 + lineSeparator + 。

    最好的编写方法是使用销售对象的集合(数组),然后您将通过这个集合进行交互,例如:

    for(Sale sale : sales){
        sale.getters // Infos
        //write  +\t+ (tab) and save infos
        }
    

    然后以“+}+”结束

    在这种情况下,我最好总是创建一个新文件。

    【讨论】:

    • 我已经按照你说的做了,这正是我写的“作家在这里写销售信息”部分的代码的样子,我把它包含在销售{和}中。但是程序的每次新执行都会将该执行中的所有新销售额写入新的 SALES { 和 } 中。我希望 SALES { 写一次,在文件的请求中和最后的 } 中。如果我理解正确的话。
    • “对我来说,在这种情况下最好总是创建一个新文件。”是的,您必须编写一个新文件。读取文件并将旧的销售对象保存在数组中,并将新的销售对象插入数组并保存。
    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2021-11-24
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多