- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将文件从客户端发送到服务器并像这样接收它:
//Receive File:
FileOutputStream fis = new FileOutputStream("receivedTest");
DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
int count;
byte[] buffer = new byte[4096];
while ((count = dis.read(buffer)) > 0)
{
fis.write(buffer, 0, count);
}
fis.close();
就像 this subject 中所解释的那样。运作良好。但事实是,我真的不想接收文件本身;我想要一个 BLOB。我读过,BLOB 就像一个 byte[]。
在我的数据库类(我使用 SQLite)中,我有下表:
String sqlFile = "CREATE TABLE IF NOT EXISTS files (\n"
+ " id integer PRIMARY KEY,\n"
+ " shorthash byte[],\n"
+ " filename text NOT NULL,\n"
+ " file blob,\n"
+ " owner text\n"
+ ");";
以及以下函数来插入新的"file":
public void insertFile(byte[] shorthash, String filename, byte[] file, String owner) {
String sql = "INSERT INTO files(shorthash,filename, file, owner) VALUES(?,?,?,?)";
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setBytes(1, shorthash);
pstmt.setString(2, filename);
pstmt.setBytes(3, file);
pstmt.setString(4, owner);
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
如您所见,有 4 列,文件本身位于第三列。在表中,它被声明为 BLOB,但是当我插入它时,我只是执行 setBytes。我不确定这是否正确,这只是我在互联网上找到的。
所以,我在我的服务器上收到这个文件,我想将它存储在我的数据库中。如果可能,我想避免在服务器端创建文件(行 FileOutputStream fis = new FileOutputStream("receivedTest"); 在我的第一个代码中)。我想将它直接存储在数据库中,因为我将它作为字节数组接收,我认为这种方式会更容易。
但我不知道该怎么做。可能是因为我不太理解 Blob 和 byte[] 之间的联系。我的意思是,一个字节数组可能太小而无法容纳整个文件;但一团就可以了。但是,为了将文件插入数据库,我插入一个字节数组。这对我来说简直是无稽之谈。
编辑:
所以,我尝试了两件事:首先,在完成后将文件添加到数据库中 here (几乎在我看过的所有地方,它总是这样做的):
//Receive encrypted File:
FileOutputStream fos = new FileOutputStream("receivedTest");
DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
int count;
byte[] buffer = new byte[4096];
while ((count = dis.read(buffer)) > 0)
{
fos.write(buffer, 0, count);
}
fos.close();
DB.insertFile(shorthash, "test", "receivedTest", user);
//Insert file in DB:
public void insertFile(byte[] shorthash, String filename, String filepath, String owner) throws FileNotFoundException {
String sql = "INSERT INTO files(shorthash, filename, file, owner) VALUES(?, ?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setBytes(1, shorthash);
pstmt.setString(2, filename);
File file = new File(filepath);
FileInputStream fis = new FileInputStream(file);
pstmt.setBinaryStream(3, fis, (int) file.length());
pstmt.execute();
pstmt.setString(4, owner);
pstmt.executeUpdate();
fis.close()
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
其次,将文件作为字节数组插入(但这不适用于大文件),如 SQLite Tutorial 中所述。 :
//Insert file in DB:
public void insertFile(byte[] shorthash, String filename, String filepath, String owner) throws FileNotFoundException {
String sql = "INSERT INTO files(shorthash, filename, file, owner) VALUES(?, ?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setBytes(1, shorthash);
pstmt.setString(2, filename);
File file = new File(filepath);
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
for (int len; (len = fis.read(buffer)) != -1;)
bos.write(buffer, 0, len);
fis.close()
pstmt.setBytes(3, bos.toByteArray());
pstmt.execute();
pstmt.setString(4, owner);
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
然后,当我打印数据库时,其中没有文件。如果我尝试使用数据库浏览器打开数据库也是如此。控制台只说:
Connection to SQLite has been established.
ouverture du server
Clients:
1 admin admin
Files:
最佳答案
byte[]
和 BLOB 只是谈论任意二进制数据集的两种不同方式。在 Java 中,byte[]
是二进制数据的集合。在数据库中,BLOB 代表二进制大型对象,并且是同一回事。只是二进制数据的集合。
所以它们是相同的东西,但根据引用框架的不同名称不同。因此,当您将 byte[]
存储在 blob 列中时,您只是将这些字节从 Java 推送到数据库中。然后,当您读回它们时,如果您愿意,它们可以转回对象,因为数据库没有更改它们。它只是直接存储二进制信息。
您会发现,如果您从其他地方编写了一个 blob,则可能无法将其转换为对象,除非您知道所存储的二进制数据的编码和字节序。
如果您的文件太大而无法存储在单个byte[]
中,或者您想优化使用内存进行存储的方式,则可以使用Stream
> 将数据发送到数据库而不同时将其全部保存在内存中。
最后,如果您需要将 FileInputStream
转换为字节,您可以使用 Apache Commons IO,如下所示:
byte[] bytes = IOUtils.toByteArray(fis);
然后存储您的文件。
关于java - JAVA 中将文件或 byte[] 转换为 BLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51570268/
我有以下代码: foreach (byte b in bytes) { byte inv = byte.MaxValue - b; // Add the new value to a
我需要从这个文本文件source.txt中读取内容并将内容反向写入这个文本文件destination.txt。读取和写入必须使用逐字节完成! 我使用 BufferedReader 和 Buffered
我需要存储大量 RGB 颜色对象。对于某些常见用途,这些占用了我的应用程序总内存的 8% 到 12%。我目前将其定义如下: class MyColor { byte red; byte green;
我有一个由字节数组表示的整数。 byte[] result = getResult(); resultInt1 = Integer.parseInt(Bytes.toString(result));/
我正在尝试使用 Rusoto 库调用 AWS Lambda 函数。该请求有一个 JSON 编码的有效负载,我目前将其作为一个字符串,但该库为此坚持使用 bytes::bytes::Bytes 结构。我
我正在尝试基于 Tokio's example 编写一个 TCP 服务器. 当我尝试发送缓冲区时,编译器返回错误 0277。 我的代码:(playground) extern crate tokio;
我知道我可以通过 IList 进行枚举,例如: public byte[] ConvertToByteArray(IList> list) { IList newList = new List
考虑这样一个文本文件: Some text here. --- More text another line. --- Third part of text. 我想把它分成三部分,用---分隔符分开。
如果我有一个字节变量:byte b = 0; 为什么以下工作: b++; b += 1; // compiles ...但这不是吗? b = b + 1; // compile er
我有一个简单的字节数组,我想从中获取颜色。我的计划是用红色表示三位,绿色表示三位,蓝色表示两位。 8 位。 我认为颜色是正确的: 如有错误请指正 byte[] colours = new byte[
我的目标是比较两个字节数组中的两个字符串值。它实际上需要创建两个新的字符串对象才能使用 contains 方法。是选择正确还是有什么办法可以使用优化方式而不使用新的关键字。 if(new String
我正在使用github.com/tarm/serial来连接一些串行仪器。在开发过程中,我使用/dev/ttyp0和/dev/ptyp0对,其中go进程连接到一个,我使用screen连接到另一个。我编
好的,所以如果一个字节是 8 位,那么半字节就是 4 位。并且您可以将四分之一字节作为 2 位(尽管我想,如果有的话,它会被称为双位)。 虽然这是一致的,但如果我使用这个词,有人会感到困惑(或惊讶)吗
我在解释文件时遇到问题。文件构建如下: "name"-@-"date"-@-"author"-@-"signature" 签名是一个字节数组。当我读回文件时,我将其解析为 String 并拆分它: m
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
Java 让我很难过,因为它需要 ArrayList 的包装类秒。我将如何添加 byte[]到 ArrayList ? 最佳答案 LOL 认为我必须包装所有东西。 ArrayList作品。谢谢一晒。
我有一个 16 字节的 md5 散列,我需要使用 XOR 将其“折叠”成 4 字节数据:{1st 4 bytes} XOR {2nd 4 bytes} XOR {3rd 4 bytes} XOR {4
我正在学习SMSC smc91cx驱动代码,我学习了如何根据Application Note 9-6的说明编写smc91c111网卡的测试代码。 .我无法理解“传输数据包”下的以下说明: Write
我必须附加(可变数量的)字节数组。集合似乎只适用于包装类,即 Byte。大约 20 小时后,我想到了这个,并且它有效,但我想知道它是否可以改进(添加到列表,但欢迎任何其他改进建议:),即 Collec
我有两个基本相同的操作: insert_bytes(from, count) delete_bytes(start, stop) -> delete_bytes(from, count) insert
我是一名优秀的程序员,十分优秀!