程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 數據結構-java寫宿捨管理系統要求用文件存儲數據

數據結構-java寫宿捨管理系統要求用文件存儲數據

編輯:編程解疑
java寫宿捨管理系統要求用文件存儲數據

數據結構的課設 讓寫一個宿捨管理系統,用java寫怎麼才能不用數據庫存儲數據,而用文件啊。。。求大神幫忙!!!!

最佳回答:


對於一些小文件,我們可以一次性讀取它的所有字節,然後一次提交到數據庫

///
/// 這個方法演示了如何一次提交所有的字節。這樣導致的結果是:應用程序立即需要申請等同於文件大小的內存
///
static void SubmitFileByOnce() {
string file = @"F:\功夫熊貓.rmvb";//文件大小為519MB
byte[] buffer = File.ReadAllBytes(file);
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true")) {
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)";
cmd.Parameters.AddRange(
new[]
{
new SqlParameter("@fileName",file),
new SqlParameter("@fileContents",buffer)
});

       conn.Open();
       cmd.ExecuteNonQuery();
       conn.Close();
   }

}
}

但是,上面的方法有幾個問題,主要體現在如果文件比較大的話

  1. 它需要一次性很大的內存,具體數據等同於文件大小。因為File.ReadAllBytes方法是將所有字節全部讀入到內存。

  2. 它會導致提交失敗,就是因為數據太大了。數據庫也會拒絕。

那麼,我就對這個方法做了一下改進,將文件拆分為5MB一段,也就是說,此時每次申請的內存只有5MB。這就大大地提高了可用性。

///
/// 這個方法是將文件切分為5MB的塊,每次只是提交5MB,所以可能多次提交,但內存占用就比較小
///
static void SubmitFileStepByStep() {
string file = @"F:\功夫熊貓.rmvb";//以這個文件為例,大小為519MB,一共需要的時間大約94秒。還是有點慢的,所以還可能需要進行壓縮
FileStream fs = new FileStream(file, FileMode.Open);

 byte[] buffer = new byte[5 * 1024 * 1024];
 int readCount;
 using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true"))
 {
     conn.Open(); 

     while ((readCount = fs.Read(buffer, 0, buffer.Length)) > 0)
     { 

         using (SqlCommand cmd = conn.CreateCommand())
         {
             cmd.CommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)";
             cmd.Parameters.AddRange(
                 new[]
             {
                 new SqlParameter("@fileName",file),
                 new SqlParameter("@fileContents",buffer)
             }); 

             cmd.ExecuteNonQuery();
         } 

     } 

     conn.Close(); 

 }

}

這樣的話,有一個後果就是一個文件,可能在數據庫中會有多條記錄。所以在讀取的時候,我們需要對其進行合並

static void DownloadFile() {
string file = @"F:\功夫熊貓.rmvb";
string destfile = @"E:\Temp\Temp.wmv";
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true"))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT FileContents FROM Files WHERE FileName=@fileName";
cmd.Parameters.AddRange(
new[]
{
new SqlParameter("@fileName",file),
});

       conn.Open();
       SqlDataReader reader = cmd.ExecuteReader();
       FileStream fs = new FileStream(destfile, FileMode.Append, FileAccess.Write); 

       while (reader.Read())
       {
           byte[] buffer = (byte[])reader[0];
           fs.Write(buffer, 0, buffer.Length);
       } 

       fs.Close();
       reader.Close();
       conn.Close();
   }

}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved