2014-10-27 1 views
1

По какой-то причине моя программа перезаписывает файл и не добавляет его.Зачем это происходит с перепиской?

Это метод, который я использую, чтобы создать файл и назовите его:

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(); 

} 

Я не понимаю, почему это происходит, может ли кто-нибудь мне помочь?

+0

Вы действительно привязаны к использованию «RnadomAccessFile»? – Makoto

+1

Вы также можете проверить https://stackoverflow.com/questions/1625234/how-to-append-text-to-an-existing-file-in-java –

ответ

2

Если вы хотите добавить к файлу, вам нужно до seek(long). Нечто подобное,

raf.seek(raf.length()); 

От связанного Javadoc,

Устанавливает файл-указатель смещение, измеренное с начала этого файла, при котором происходит следующая операция чтения или записи. Смещение может быть установлено за пределами файла. Установка смещения за пределы файла не изменяет длину файла. Длина файла будет изменяться только путем записи после того, как смещение будет установлено за пределами файла.

3

По умолчанию RandomAccessFile начинает запись в начале файла и перезаписывает существующие данные. Для записи в конец файла, вам нужно использовать пропустить до конца следующим образом:

raf.skipBytes((int)raf.length()); 
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 
4

seek до конца файла, прежде чем начать писать, например:

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

Соответствующие javadoc.

2

Перед началом записи вам нужно будет установить указатель на файл до начала записи, по умолчанию он будет начинаться.

raf.seek(raf.length()); 

, помещенный перед любыми операциями записи, должен сделать трюк.

Смежные вопросы