为什么这会被覆盖?

时间:2014-10-27 18:12:44

标签: java

出于某种原因,我的程序正在覆盖文件而不是添加它。

这是我用来创建文件并命名它的方法:

public void filenameMethod() throws IOException{

    System.out.println("Input the name of the file");

    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    filename = br.readLine();

    raf = new RandomAccessFile(filename, "rw");

}    

我使用此方法接收用户的输入,它将值设置为一个变量,然后写入文件:

public void inputMethod() throws IOException{

    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);

    System.out.println("Input Carname, ID, Existing Mileage, Gas Cost, Number of Days, Rate, Total Charge, Discount, Tax, Net Charge and Return Milage");

    String tokenString;
    tokenString = br.readLine();

    StringTokenizer st;
    st = new StringTokenizer(tokenString);

    carName = st.nextToken();
    id = Integer.parseInt(st.nextToken());
    existingMileage = Integer.parseInt(st.nextToken());
    gasCost = Integer.parseInt(st.nextToken());
    ndays = Integer.parseInt(st.nextToken());
    rate = Integer.parseInt(st.nextToken());
    totalCharge = Integer.parseInt(st.nextToken());
    discount = Integer.parseInt(st.nextToken());
    tax = Integer.parseInt(st.nextToken());
    netCharge = Integer.parseInt(st.nextToken());
    returnMileage = Integer.parseInt(st.nextToken());
}

然后我使用此方法将它们写入文件:

public void fileWriterMethod() throws IOException{

    raf.writeInt(id);
    raf.writeInt(existingMileage);
    raf.writeInt(gasCost);
    raf.writeInt(ndays);
    raf.writeInt(rate);
    raf.writeInt(totalCharge);
    raf.writeInt(discount);
    raf.writeInt(tax);
    raf.writeInt(netCharge);
    raf.writeInt(returnMileage);
    raf.writeBytes(carName + "\r\n");

    //Closing the stream

    raf.close();

}

我不明白为什么会发生这种情况,有人可以帮助我吗?

5 个答案:

答案 0 :(得分:4)

在开始撰写之前,

seek到文件的末尾,例如:

File f = new File(filename);
long fileLength = f.length();
RandomAccessFile raf = new RandomAccessFile(filename, "rw");
raf.seek(fileLength);
raf.writeInt(id);
...

相关javadoc

答案 1 :(得分:3)

默认情况下,RandomAccessFile开始在文件开头写入,并将覆盖现有数据。要写入文件末尾,您需要使用跳到最后,如下所示:

raf.skipBytes( (int)raf.length() );

答案 2 :(得分:3)

当你打开RandomAccessFile时,它的指针指向文件的开头。如果要移动到特定位置,则必须使用方法seek()。在您的情况下,您必须移至文件末尾,即seek(fileLength)

File f = new File(filename);
long fileLength = f.length();
RandomAccessFile raf = new RandomAccessFile(f, "rw");
raf.seek(fileLength);
// now write your bytes

答案 3 :(得分:2)

如果要附加到文件,则需要seek(long)到最后。像,

raf.seek(raf.length());

来自链接的Javadoc,

  

设置从此文件的开头开始测量的文件指针偏移量,在该位置进行下一次读取或写入操作。偏移量可以设置在文件末尾之外。将偏移量设置为超出文件末尾不会更改文件长度。只有在将偏移量设置为超出文件末尾之后才能通过写入来更改文件长度。

答案 4 :(得分:2)

在开始编写之前,您需要将文件指针设置为文件末尾,默认为开头。

raf.seek(raf.length());

在任何写操作之前放置应该做的伎俩。