怎样把大量的数据通过txt文件直接导入到数据库中

怎样把大量的数据通过txt文件直接导入到数据库中,第1张

首先数据库存储数据有自己的格式:基本数据类型、二进制。。

怎么存储文件形式的数据?

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 上传文件 怎么存到数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9276925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存