我将文本文件存储在MySQL中,并将其从Java读取到项目文件中。我在这方面面临一个问题。我正在保存3个文件,每个文件包含992行。但是,当我将其读取并保存回java项目文件夹中时,每个文件都以993行的形式写入了2个文件,最后一行是一个空字符串。
如何解决这个问题?
这是我要读写到项目文件夹中的代码。
,我附上了可以访问文件的链接。 file1 file2 file3
在这些文件中,file1和file2正在写多余的行。
这是代码
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ReadBlob
{
public static void main(String[] args) throws Exception
{
Connection myConn = null;
Statement myStmt = null;
ResultSet myRs = null;
InputStream input = null;
FileOutputStream output = null;
try {
// 1. Get a connection to database
myConn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/database", "username", "password");
// 2. Execute statement
myStmt = myConn.createStatement();
String sql = "select file from tablename where id='1'";//I am mention the ID related to the files
myRs = myStmt.executeQuery(sql);
// 3. Set up a handle to the file
File theFile = new File("data2.txt");
output = new FileOutputStream(theFile);
if (myRs.next())
{
input = myRs.getBinaryStream("file");
System.out.println("Reading data from database...");
System.out.println(sql);
byte[] buffer = new byte[2];
while (input.read(buffer) > 0) {
output.write(buffer);
}
System.out.println("\nSaved to file: " + theFile.getAbsolutePath());
System.out.println("\nCompleted successfully!");
}
}
catch (Exception exc)
{
exc.printStackTrace();
}
finally
{
if (input != null)
{
input.close();
}
if (output != null)
{
output.close();
}
close(myConn, myStmt);
}
}
private static void close(Connection myConn, Statement myStmt)
throws SQLException {
if (myStmt != null) {
myStmt.close();
}
if (myConn != null) {
myConn.close();
}
}
}
答案 0 :(得分:1)
文件1的长度为20579字节,文件2的长度为20585字节,文件3的长度为20612字节。工作文件长度均匀。在您的代码中,您读取并写入了字节2 x2。我的猜测是,当您写入文件1和2的最后一个字节时,会在数组中添加一个额外的字节并将其写入文件。
尝试一一读取字节,看看效果是否更好。
答案 1 :(得分:0)
通过忽略read
方法返回的实际读取字节数,您正在错误地读取流。这会导致您写入的字节数出现一一错误,从而导致从较早的读取中重复字节,从而损坏了已写入的文件。
您需要将代码更改为:
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
请注意,我还增加了缓冲区大小,因为这将比每两个字节读取一次更有效。
通过使用try-with-resources关闭流,可以进一步简化代码。
或更简洁地说,不要创建输出流,而是使用:
Files.copy(input, file.toPath());
文件可能仍然不正确,因为您可能在写入文件时犯了类似的错误。