2013-03-16 45 views
0

在我的項目,我需要爲每個學生一個文件,我thinki有方法創建的,在這裏它是低於將數據寫入到的RandomAccessFile

public addStudent(String fullName, int grn, String formClass, String formTeacher) 
    { 
     //Default values 
     int creativity = 0; 
     int action = 0; 
     int service = 0; 
     int total = 0; 

     //Initialize File 
     RandomAccessFile adding  = new RandomAccessFile(new File(fullName + ".dat"), "rw"); 
     long fileSize = adding.length(); 
     adding.seek(fileSize); 

     //Variables from Method 
     adding.writeUTF(fullName + "\n"); 
     adding.writeInt(grn + "\n"); 
     adding.writeUTF(formClass + "\n"); 
     adding.writeUTF(formTeacher + "\n"); 

     //Variables created in method 
     adding.writeInt(creativtiy + "\n"); 
     adding.writeInt(action + "\n"); 
     adding.writeInt(service + "\n"); 
     adding.writeInt(total + "\n"); 

     adding.close(); 
} 

我只是一直在想,它不對,想一些澄清某些部件,如這行

RandomAccessFile adding  = new RandomAccessFile(new File(fullName + ".dat"), "rw"); 

全稱是傳遞到方法的變量,它是一個學生(例如:約翰列儂)的名稱和姓。我想要做的是將文件命名爲「John Lennon.dat」。但是我一直認爲我的方法是錯誤的。

另一個問題是關於整數值。他們會不時更新,但通過簡單添加當前+新的。我怎麼做?

回答

0
  1. 你,如果你使用的可能的用戶輸入(fullname)未經過濾的命名你的文件要小心。這可能會導致安全漏洞。您應該檢查fullname以獲取文件系統中不允許的特殊字符,或者更改您的目錄。想象一下,有人可以輸入../importantfile作爲fullname,而不檢查是否可以覆蓋其他目錄中的一些重要文件。 最安全的方法是使用一些通用名稱的模式爲您的文件(如data1.datdata2.dat和存儲之間的關係fullname在另一個地方(可能是文件index.dat)爲filename。

  2. 我假設你有一個很好的理由在這裏使用RandomAccessFile根據你的代碼可以在一個文件中有多個記錄如果你沒有將記錄的起始位置存儲在另一個位置那麼你必須一個接一個地讀取一個記錄如果你發現你的記錄爲那麼你必須在你的整數值之前的所有字段中讀取,以便你的文件位置指向整數起始位置,然後你可以讀取你的整數,改變它的值,把文件位置移回4個字節(seek(-4) )。然後你可以寫你修改後的整數值。

替代方案:

  • 你可以閱讀在整個文件中,修改整數值,然後創建整個新文件並覆蓋舊。對於短文件,如果沒有明顯的性能損失,這可能會更簡單(但這取決於,如果您在短時間內要更改一千個文件,則不推薦使用此替代方法)。
  • 您可以將整型值的文件位置存儲在另一個位置,並使用它們直接訪問這些值。這隻適用於你的字符串是不可變的。
  • 您可以使用XML,JSON或序列化對象等替代文件格式。但所有這些都不支持原位更改。
  • 您可以使用SQLite或H2等嵌入式數據庫,並讓數據庫關心文件訪問和索引。