当前位置:  数据库>mysql

java实现插入mysql二进制文件,blob类型,遇到问题及解决办法

    来源: 互联网  发布时间:2014-09-06

    本文导语:  首先是数据库建立要准备的: 我们要把放置二进制字段设置为Blob类型,根据文件的大小选择合适的Blob类型,一下是各个Blob类型所能容纳二进制文件的大小 MySQL的四种BLOB类型 类型 大小(单位:字节) TinyBlob 最大 255 Blob 最大 65K...

首先是数据库建立要准备的:
我们要把放置二进制字段设置为Blob类型,根据文件的大小选择合适的Blob类型,一下是各个Blob类型所能容纳二进制文件的大小
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
一下是具体操作代码:
代码如下:

/**
*
* 把二进制文件(该二进制文件可以是本地硬盘路径,也可以是一个网络路径)存入数据库
* create date:2009-5-13 author:Administrator
*
* @param file
* 可以是本地文件也可以是网络文件
* @param conn
*/
public void saveBinary(String file, Connection conn) {
// 注意二进制文件写入数据库时所用到的类,以及类包装转换过程
File f = null;
if (file.toLowerCase().contains("http:"))
f = DownLoadWithUrl.downLoadFile(file);
else
f = new File(file);
if (f != null) {
try {
InputStream is = new FileInputStream(f);
PreparedStatement ps = conn
.prepareStatement("insert into bankVoice(name,text) values (?,?)");
ps.setString(1, file);
int i = is.available();
ps.setBinaryStream(2, is, is.available());
ps.executeUpdate();
System.out.println("二进制文件插入成功");
ps.clearParameters();
ps.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("二进制文件插入时出现异常");
}
}
}

注意在操作时候会出现以下异常,那么我们只需做一下设置:以我本地为例:进入D:MySql5.0mysql-5.0.51b-win32 目录,有以下文件可以看到:my-large.ini、my-small.ini、my-medium.ini、my-huge.ini
我们把只需把mysql服务现在加载的ini文件中的配置项:max_allowed_packet 改为 16M
即是:max_allowed_packet = 16M 默认的是1M我们改为16M,然后重启mysql服务器,这样就不会出现下面的异常了。
代码如下:

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1048587 > 1047552). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2632)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2618)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1551)
at com.mysql.jdbc.ServerPreparedStatement.storeStream(ServerPreparedStatement.java:2180)
at com.mysql.jdbc.ServerPreparedStatement.serverLongData(ServerPreparedStatement.java:1199)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1004)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:670)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1159)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1076)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1061)
at SaveBinaryToDB.SaveBinaryToDB.saveBinary(SaveBinaryToDB.java:33)
at SaveBinaryToDB.SaveBinaryToDB.main(SaveBinaryToDB.java:17)
/**
* 从数据库中读取二进制文件 create date:2009-5-13 author:Administrator
*
* @param file
* @param conn
*/
public void getBinary(String file, Connection conn) {
// 注意二进制文件从数据库中读取时所用到的类,以及类的包装转换过程
try {
PreparedStatement ps = conn
.prepareStatement("select text from bankVoice where name=?");
ps.setString(1, file);
Blob blob = null;
ResultSet rs = ps.executeQuery();
if (rs.next()) {
blob = (Blob) rs.getBlob("text");
}
FileOutputStream fos = new FileOutputStream("D:\test1.mp3");
fos.write(blob.getBytes(1, (int) blob.length()));
System.out.println("二进制文件获得成功");
ps.clearParameters();
ps.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("二进制文件读取时出现异常");
}
}

package SaveBinaryToDB;
代码如下:

/**
* 本程序的功能实现网络下载
* 把指定url的文件下载到本地硬盘
*
*/
import java.io.*;
import java.net.*;
/**
* @todo 将网上获取的图像,mp3等文件存储到本地
*
* @version 1.0
*/
public class DownLoadWithUrl {
public static File downLoadFile(String fromUrl) {
URL url;
File file = null;
try {
// url = new
// URL("http://count.koubei.com/showphone/showphone.php?f=jpg&w=96&h=10&bc=255,255,255&fc=0,0,0&fs=10&fn=arial&phone=NzMwNzIyNTE1%236aWCXtTNZYkxASrj");
url = new URL(/blog_article/fromUrl/index.html);
URLConnection uc = url.openConnection();
InputStream is = uc.getInputStream();
// 根据下载文件类型的不同,进行相应的文件命名
file = new File("D:\forever.mp3");
FileOutputStream out = new FileOutputStream(file);
/*
* 该注释内的也是一种写入文件的方法,不过通常下载mp3或者比mp3更小图片
* 等这些文件用这种带缓冲的方法写文件比较慢,所以说小文件下载通常用下面 的写文件方法就可以了 // byte[] b = new
* byte[102400*3]; // int size = 0; // // while ((size = is.read(b)) !=
* -1) { // out.write(b, 1, size); // // }
*/
int i = 0;
while ((i = is.read()) != -1) {
out.write(i);
}
out.flush();
is.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
/**
* 删除本地磁盘指定路径的文件 create date:2009-5-13 author:Administrator
*
* @param file
*/
public static void delFile(String file) {
File f = new File(file);
if (f.exists())
f.delete();
System.out.println(file + "已经被删除");
}
public static void main(String[] args) {
// delFile("D:\forever.mp3");
downLoadFile("");
}
}

    
 
 

您可能感兴趣的文章:

  • 关于JAVA中的负数二进制表示?
  • 问几个关于JAVA二进制非常简单的问题,50分赠送
  • 如何用Java实现二进制文件到文本文件的相互转化?
  • 在java中如果想将一个文件以二进制的方式打开,应如何做?
  • 很奇怪,varchar2类型在sql*plus中可以看到正常的字符串,用java读出来却是二进制?
  • java读写二进制文件的解决方法
  • java 对树的操作,TreeSet,能否插入相同的数据,如果相同,如何解决
  • 急问题:在java中嵌入sql的插入语句,插入成功,但是出现异常
  • JAVA连数据库并插入数据的问题?
  • java二分查找插入法
  • java插入排序 Insert sort实例
  • 有关java.sql.ResultSet 利用SetDate往 oracle 中插入时间和日期的问题!!
  • Java获取最后插入MySQL记录的自增ID值的3种方法
  • JAVA算法起步之插入排序实例
  • java操作mysql入门代码实例(含插入、更新和查询)
  • java直接插入排序示例
  • java 下执行mysql 批量插入的几种方法及用时
  • Java直接插入排序算法实现
  • java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
  • Java获取网络文件并插入数据库的代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • !!!初学Java,遇到一个奇怪问题,请大家回答!!!
  • 大家遇到过Java程序睡不醒的情况吗?
  • 我在Thinking in Java中遇到的Jni问题!
  • 小弟的程序遇到麻烦了,想和哪位谈谈java的线程(57226475)
  • 用java写的ftp下载程序中遇到的问题
  • 用java swing JTable做一个属性编辑器遇到的问题,请高手赐教!急,急!!
  • jni的方法,用java调用c的代码,遇到的问题!
  • lunix下,用java在代码中启动另外一个进程遇到的问题,新启动的进程被阻塞.
  • 同一目录下的两个.java文件使用package时遇到的问题(详情请进)
  • java.net编程时遇到的问题
  • 我遇到了我一些关于java问题不会,请会的人能指点一下吗?万分感谢!
  • 我是初学者,学习java遇到了很多问题,请各位过来之人加以指导阿!!!!
  • 小弟刚开始学JAVA,遇到了难题,请教:
  • 我在学JAVA的第二天遇到的问题
  • 我是菜鸟,请您帮忙!我第一次运行java程序的helloworld,遇到问题
  • ***用JAVA写了一个'搬运工'游戏,画图的时候遇到了点问题,请进!
  • 刚接触java遇到很麻烦的事,打击不小。高手来指教一下!!!谢谢!
  • java调用sh脚本遇到export命令会卡住,sh不能调用子sh
  • 今天刚玩Java就遇到问题了。:~-(
  • 有关JAVA字符集的详细系统资料哪位兄弟或MM有啊!好着急呀!遇到了问题。
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3