首先数据库存储数据有自己的格式:基本数据类型、二进制。。
怎么存储文件形式的数据?
1、针对txt文件,读取文本内容,数据库字段设置数据类型text,将读取的文本内容存入数据库。
2、转化为二进制存入数据库,读取文件,转化为二进制流,数据库字段设置bit,之后将二进制数据存入数据库,
3、将txt文件保存服务器制定目录下,在数据库中存储txt的绝对路径,访问时直接访问文件即可。
不知道你要什么样的文本,文本中的内容是否是有格式的:
这里提供下思路,供参考:
1文本文件,基本上式字符格式的了,可以用Reader io流
2如果是格式化的文本,可以按数据的长度读取, readInt readByte
3保存到数据库 当然用JDBC了,如果你读取出来封装成POJO了,也可以选择 OM框架
import javaioBufferedReader;
import javaioFileInputStream;
import javaioIOException;
import javaioInputStreamReader;
/
文件读取和写入数据库
@author 樊云升
/
public class FilesReader {
public FilesReader(){
}
/
读取文件内容
@param FILE
@return
/
public String re_content(String FILE){
String content="";
try{
BufferedReader bufRead=new BufferedReader(new InputStreamReader(new FileInputStream(FILE)));
String str;
while((str=bufReadreadLine())!=null){
content+=str+"\r\n";
}
}catch(IOException ioe){
ioeprintStackTrace();
}
return content;
}
/
将特定字符写入数据库中(原来我写的是重写文件,你这里这里将content写入数据库就OK)
@param path
@return
/
public boolean writeFile(String content){
try{
//数据库写入代码
}catch(Exception e){
outclose();
return false;
}
return true;
}
public static void main(String[] args) {
String content=new FilesReader()re_content("D:\\AJAXhtm");
new FilesReader()writeFile(content);
}
}
两种方案:
方案1:以MYSQL为例存储,表中存文件的字段用blob类型(二进制大文件),利用JDBC或orm框架存入。
方案2:将文件上传至指定的目录,数据库只存储文件的路径,表中建立字段,只保存文件的路径(相对路径),利用JDBC或orm框架存入。推荐使用第二种方式
最近利用空闲时间自己在写一个文件备份工具,因为我磁盘上的很多文件很重要,例如很多PPT和讲义。所以需要经常备份,而且因为这些文件很多,所以需要增量备份。
我尝试用过windows自带的ntbackup工具,但感觉不是很爽。它不支持压缩备份,而且界面也有点复杂。
为了响应伟大领袖的“自力更生,丰衣足食”的号召,咱决定自己写一个工具,专门备份到数据库。支持压缩,支持加密,支持增量。
本文分享一下其中一些重点的技术细节
其中一个关键的技术就是将文件使用二进制的方式存放在数据库的varbinary(max)的字段中。该字段最大允许的长度为2GB。
对于一些小文件,我们可以一次性读取它的所有字节,然后一次提交到数据库
/// <summary>
/// 这个方法演示了如何一次提交所有的字节。这样导致的结果是:应用程序立即需要申请等同于文件大小的内存
/// </summary>
static void SubmitFileByOnce() {
string file = @"F:\功夫熊猫rmvb";//文件大小为519MB
byte[] buffer = FileReadAllBytes(file);
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true")) {
using (SqlCommand cmd = connCreateCommand())
{
cmdCommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)";
cmdParametersAddRange(
new[]
{
new SqlParameter("@fileName",file),
new SqlParameter("@fileContents",buffer)
});
connOpen();
cmdExecuteNonQuery();
connClose();
}
}
}
但是,上面的方法有几个问题,主要体现在如果文件比较大的话
1 它需要一次性很大的内存,具体数据等同于文件大小。因为FileReadAllBytes方法是将所有字节全部读入到内存。
2 它会导致提交失败,就是因为数据太大了。数据库也会拒绝。
那么,我就对这个方法做了一下改进,将文件拆分为5MB一段,也就是说,此时每次申请的内存只有5MB。这就大大地提高了可用性。
/// <summary>
/// 这个方法是将文件切分为5MB的块,每次只是提交5MB,所以可能多次提交,但内存占用就比较小
/// </summary>
static void SubmitFileStepByStep() {
string file = @"F:\功夫熊猫rmvb";//以这个文件为例,大小为519MB,一共需要的时间大约94秒。还是有点慢的,所以还可能需要进行压缩
FileStream fs = new FileStream(file, FileModeOpen);
byte[] buffer = new byte[5 1024 1024];
int readCount;
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true"))
{
connOpen();
while ((readCount = fsRead(buffer, 0, bufferLength)) > 0)
{
using (SqlCommand cmd = connCreateCommand())
{
cmdCommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)";
cmdParametersAddRange(
new[]
{
new SqlParameter("@fileName",file),
new SqlParameter("@fileContents",buffer)
});
cmdExecuteNonQuery();
}
}
connClose();
}
}
这样的话,有一个后果就是一个文件,可能在数据库中会有多条记录。所以在读取的时候,我们需要对其进行合并
static void DownloadFile() {
string file = @"F:\功夫熊猫rmvb";
string destfile = @"E:\Temp\Tempwmv";
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true"))
{
using (SqlCommand cmd = connCreateCommand())
{
cmdCommandText = "SELECT FileContents FROM Files WHERE FileName=@fileName";
cmdParametersAddRange(
new[]
{
new SqlParameter("@fileName",file),
});
connOpen();
SqlDataReader reader = cmdExecuteReader();
FileStream fs = new FileStream(destfile, FileModeAppend, FileAccessWrite);
while (readerRead())
{
byte[] buffer = (byte[])reader[0];
fsWrite(buffer, 0, bufferLength);
}
fsClose();
readerClose();
connClose();
}
}
}
本文由作者:陈希章
以上就是关于怎样把大量的数据通过txt文件直接导入到数据库中全部的内容,包括:怎样把大量的数据通过txt文件直接导入到数据库中、读取文本文件中的内容存到数据库该怎么实现、spring mvc 上传文件 怎么存到数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)