1

我正在尝试将文本文件存储在 MySQL 数据库中,并在需要时将其保存到文件中。

为了保存文件,我这样做:

public void saveFile_InDB(File file)
{  
     try {

        String sql = "INSERT INTO sent_emails (fileName, time, clientName) values (?, ?, ?)";
        PreparedStatement statement = conn.prepareStatement(sql);
        statement.setString(1, new Date().toString());
        statement.setString(2, new Date().toString());

        InputStream inputStream = new FileInputStream(file); 
        statement.setBinaryStream(3, inputStream);

        int row = statement.executeUpdate();
        if (row > 0) {
            System.out.println("File saved sucessfully.");
        }
        conn.close();

    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

并检索并保存文件:

public void retrieveFile_fromDB()
{
     try {

         Statement stmt = (Statement) conn.createStatement();
         ResultSet res = stmt.executeQuery("SELECT * FROM sent_emails WHERE clientName='sally'");
         FileOutputStream fos = new FileOutputStream("file.txt");  

         if (res.next()) {

             Blob File = (Blob) res.getBlob("fileName");
             InputStream is = File.getBinaryStream();
             int b = 0;

             while ((b = is.read()) != -1) {
                 fos.write(b);   
             }

             fos.flush();

         }
     } catch (IOException e) {
         e.getMessage (); e.printStackTrace(); 
         System.out.println(e); 
     } catch (SQLException e) {
         e.getMessage (); e.printStackTrace(); 
         System.out.println(e); 
     }
}

存储文件有效,但是当我尝试检索并保存它时,输出文件中没有存储任何内容?

4

2 回答 2

1

如果您想从 db Mysql 读取文件,请在代码中更改此部分

  Blob File = (Blob) res.getBlob("fileName");
         InputStream is = File.getBinaryStream();
         int b = 0;

         while ((b = is.read()) != -1) {
             fos.write(b);   
         }

         fos.flush();

使用此代码读取字节数组

    byte [] bs=res.getBytes("fileName");
    fos.write(bs);

如果您从 db 返回多个文件,它将起作用,您必须声明

 FileOutputStream fos = new FileOutputStream("file.txt");

在while循环内并更改文件名以避免覆盖

于 2016-03-06T12:17:05.747 回答
0

您似乎没有将列名描述的内容放入数据库?

fileName并且time例如都设置为时间戳,并clientName设置为文件的内容。当您稍后尝试选择基于时clientName,您实际上是根据文件的内容进行选择。

此外,在读取数据时,您正在从 column 读取 blob 数据fileName,但这是错误的,因为:

  1. fileName包含new Date().toString(),而不是文件的内容
  2. fileName应该肯定包含文件的名称,而不是它的内容?
于 2013-09-05T22:49:22.947 回答