新聞中心
教你文件夾傳至數(shù)據(jù)庫的方法

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供陸河網(wǎng)站建設(shè)、陸河做網(wǎng)站、陸河網(wǎng)站設(shè)計(jì)、陸河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、陸河企業(yè)網(wǎng)站模板建站服務(wù),十年陸河做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
現(xiàn)今,數(shù)據(jù)已成為人們?nèi)粘I钪胁豢苫蛉钡囊徊糠?。無論是在工作中還是在日常娛樂中,我們都需要對(duì)數(shù)據(jù)進(jìn)行管理。因此,數(shù)據(jù)存儲(chǔ)設(shè)備的出現(xiàn),給我們生活帶來了極大的便利。傳統(tǒng)的數(shù)據(jù)存儲(chǔ)方式是將數(shù)據(jù)存儲(chǔ)在硬盤、光盤、U盤等設(shè)備中。但是這些設(shè)備需要我們手動(dòng)打開文件夾復(fù)制粘貼等繁瑣的操作才能找到需要的數(shù)據(jù)。而數(shù)據(jù)庫則是另外一種存儲(chǔ)方式,數(shù)據(jù)庫對(duì)各種數(shù)據(jù)進(jìn)行高效的管理,讓我們的數(shù)據(jù)操作變得更加方便快捷。在這篇文章中,我們將會(huì)為你介紹如何將文件夾中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中,從而實(shí)現(xiàn)更高效的數(shù)據(jù)管理方式。
1. 前置條件
在進(jìn)行文件夾傳至數(shù)據(jù)庫的操作之前,我們需要保證我們安裝了MySQL數(shù)據(jù)庫以及Java環(huán)境。如果你還沒有安裝,可以通過官方網(wǎng)站去下載并安裝。此外,我們還需要掌握一些基礎(chǔ)的Java編程知識(shí),以便進(jìn)行Java編程操作。
2. 數(shù)據(jù)庫表的設(shè)計(jì)
在將文件夾中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫之前,我們需要先設(shè)計(jì)數(shù)據(jù)庫表結(jié)構(gòu),以便于我們存儲(chǔ)文件夾中的數(shù)據(jù)。我們可以在MySQL數(shù)據(jù)庫中創(chuàng)建一個(gè)名為“file”,包含三個(gè)字段:id、name和content。其中,id為整型,表示文件的唯一標(biāo)識(shí)符;name為字符串型,表示文件名;content為字符串型,表示文件內(nèi)容(我們可以將文件轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)后存儲(chǔ)至數(shù)據(jù)庫中)。通過這樣一個(gè)簡(jiǎn)單的表格設(shè)計(jì),我們就可以存儲(chǔ)文件夾中的數(shù)據(jù)了。
3. Java代碼實(shí)現(xiàn)
接下來我們需要進(jìn)行Java編程操作,將文件夾中的數(shù)據(jù)導(dǎo)入到我們所設(shè)計(jì)的數(shù)據(jù)庫表中。我們需要編寫一個(gè)Java程序,實(shí)現(xiàn)讀取文件夾中的數(shù)據(jù)并將其轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)的操作。代碼如下:
“`
import java.io.*;
public class BinaryFile {
public static byte[] read(File file) throws IOException {
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
try {
byte[] data = new byte[inputStream.avlable()];
inputStream.read(data);
return data;
} finally {
inputStream.close();
}
}
}
“`
上述代碼中,我們定義了一個(gè)二進(jìn)制文件操作類,它可以從文件中讀取二進(jìn)制數(shù)據(jù),并將其返回為一個(gè)字節(jié)數(shù)組。
接下來,我們需要編寫Java程序,實(shí)現(xiàn)將文件夾中的數(shù)據(jù)導(dǎo)入到我們所設(shè)計(jì)的數(shù)據(jù)庫表中。代碼如下:
“`
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ImportFile {
private static final String DB_URL = “jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8”;
private static final String USER_NAME = “root”;
private static final String PASSWORD = “root”;
private static final String INSERT_SQL = “INSERT INTO file (id, name, content) VALUES (?, ?, ?)”;
public static void mn(String[] args) {
Connection connection = null;
PreparedStatement statement = null;
try {
Class.forName(“com.mysql.jdbc.Driver”);
connection = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD);
File folder = new File(“C:/myfolder”);
File[] files = folder.listFiles();
for (int i = 0; i
File file = files[i];
statement = connection.prepareStatement(INSERT_SQL);
statement.setInt(1, i + 1);
statement.setString(2, file.getName());
statement.setBytes(3, BinaryFile.read(file));
statement.executeUpdate();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
“`
上述代碼中,我們通過連接MySQL數(shù)據(jù)庫,讀取文件夾中的數(shù)據(jù)并將其導(dǎo)入到我們所設(shè)計(jì)的數(shù)據(jù)庫表中。此代碼中,我們假設(shè)文件夾的路徑為“C:/myfolder”,并將其下的所有文件均導(dǎo)入到數(shù)據(jù)庫表中。
4. 結(jié)尾
通過上述步驟,我們就已經(jīng)完成了文件夾傳至數(shù)據(jù)庫的操作。相比于傳統(tǒng)的數(shù)據(jù)存儲(chǔ)方式,數(shù)據(jù)庫可以更加方便快捷地對(duì)數(shù)據(jù)進(jìn)行管理,提高了我們的數(shù)據(jù)操作效率。而通過Java編程實(shí)現(xiàn)文件夾傳至數(shù)據(jù)庫的操作,則讓我們可以輕松地實(shí)現(xiàn)這一高效的數(shù)據(jù)管理方式。
相關(guān)問題拓展閱讀:
- 如何將大文件寫入到數(shù)據(jù)庫中
- 文本文件導(dǎo)入到數(shù)據(jù)庫中的幾種方法(如何將文本文件導(dǎo)入數(shù)據(jù)庫表中)
如何將大文件寫入到數(shù)據(jù)庫中
最近利用空閑時(shí)間自己在寫一個(gè)文件備份工具,因?yàn)槲掖疟P上的很多文件很重要,例如很多PPT和講義。所以需要經(jīng)常備份,而且因?yàn)檫@些文件很多,所以需要增量備份。
我嘗試用過windows自帶的ntbackup工具,但感覺不是很爽。它不支持壓縮備份,而且界面也有點(diǎn)宏則復(fù)雜。
為了響應(yīng)偉大領(lǐng)袖的“自力更生,豐改衫衣足食”的號(hào)召,咱決定自己寫一個(gè)工具,專門備份到數(shù)據(jù)庫。支持壓縮,支持加密,支持增量。
本文分享一下其中一些重點(diǎn)的技術(shù)細(xì)節(jié)
其中一個(gè)關(guān)鍵的技術(shù)就是將文件使用二進(jìn)制的方式存放在數(shù)據(jù)庫的varbinary(max)的字段中。該字段更大允許的長(zhǎng)度為2GB。
對(duì)于一些小文件,我們可以一次性讀取它的所有字節(jié),然后一次提交到數(shù)據(jù)庫
///
/// 這個(gè)方法演示了如何一次提交所有的字節(jié)。這樣導(dǎo)致的結(jié)果是:應(yīng)用程序立即需要申請(qǐng)等同于文件大小的內(nèi)存
///
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();
}
}
}
但是,上面的方法有幾個(gè)問題,主要體現(xiàn)在如果文件比較大的話
1. 它需要一次性很大的內(nèi)存,具體數(shù)據(jù)等同于文件大小。因?yàn)镕ile.ReadAllBytes方法是將所有字節(jié)全部讀入到內(nèi)存。
2. 它會(huì)導(dǎo)致提交失敗,就是因?yàn)閿?shù)據(jù)太大了。數(shù)據(jù)庫也會(huì)拒絕。
那么,我就對(duì)這個(gè)方法做了一下改進(jìn),將文件拆分為5MB一段,也就是說,此時(shí)每次申請(qǐng)的內(nèi)存只有5MB。這就大大地提高了可用性。
///
/// 這個(gè)方法是將文件切分為5MB的塊,每次只是提交5MB,所以可能多次提交,但內(nèi)存占用就比較小
///
static void SubmitFileStepByStep() {
string file = @”F:\功夫熊貓.rmvb”;//以這個(gè)文件為例,大小為519MB,一共需要的時(shí)間大約94秒。還是有點(diǎn)慢的,所以還可能需要進(jìn)行壓縮
FileStream fs = new FileStream(file, FileMode.Open);
byte buffer = new byte;
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();
}
}
這樣的話,有一個(gè)后果就是一個(gè)文件,可能在數(shù)據(jù)庫中會(huì)有多條記錄。所以在讀取的時(shí)候,我們需要對(duì)其進(jìn)行合并
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;
fs.Write(buffer, 0, buffer.Length);
}
fs.Close();
reader.Close();
conn.Close();
}
}
}
文本文件導(dǎo)入到數(shù)據(jù)庫中的幾種方法(如何將文本文件導(dǎo)入數(shù)據(jù)庫表中)
這個(gè)如果要自己管理數(shù)據(jù)的話還是挺有難度的。
不過借用數(shù)據(jù)庫也許可以折中一下,把每個(gè)文檔譽(yù)磨悉的數(shù)據(jù)放到數(shù)據(jù)庫的一個(gè)字段中,然后用like’%…%’匹配慶乎。(下策^_^)
推薦使用桌面游咐搜索
文件夾怎么傳到數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于文件夾怎么傳到數(shù)據(jù)庫,「教你文件夾傳至數(shù)據(jù)庫的方法」,如何將大文件寫入到數(shù)據(jù)庫中,文本文件導(dǎo)入到數(shù)據(jù)庫中的幾種方法(如何將文本文件導(dǎo)入數(shù)據(jù)庫表中)的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)建站主營(yíng):成都網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動(dòng)網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
網(wǎng)站名稱:「教你文件夾傳至數(shù)據(jù)庫的方法」(文件夾怎么傳到數(shù)據(jù)庫)
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/djsehpg.html


咨詢
建站咨詢
