当前位置: 首页 > 知识库问答 >
问题:

从MySQL数据库读取文本文件并写入project文件夹时额外写入一行

顾昊穹
2023-03-14

我正在MySQL中存储文本文件,并将其从Java读入项目文件。我在这方面面临一个问题。我正在保存3个文件,每个文件包含992行。但当我读取并将其保存回java项目文件夹时,两个文件被写成每行993行,最后一行是空字符串。

对此如何化解?

这里是我的代码读取和写入项目文件夹。

我正在附上可以访问这些文件的链接。文件1文件2文件3

这是密码

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();
      }
   }
 }

共有1个答案

乜胜泫
2023-03-14

通过忽略read方法返回的实际读取字节数,您将错误地读取流。这会导致写入的字节数出现偏离一的错误,这会导致重复先前读取的字节数,从而损坏写入的文件。

您需要将代码更改为:

byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
    output.write(buffer, 0, bytesRead);
}

注意,我还增加了缓冲区大小,因为这将比每两个字节读取的效率更高。

或者更简洁,不要创建输出流,而是使用:

Files.copy(input, file.toPath());

文件可能仍然是不正确的,因为有可能您在编写文件时犯了类似的错误。

 类似资料:
  • 档案员。txt包含两类员工的详细信息,即月薪和小时津贴。如果是月薪员工,则该文件包含名字、姓氏、性别、职级、类型和基本工资,如果是小时薪员工,则包含小时工资和工作小时数。该文件的示例如下所示: 约翰·史密斯M经理每月45000.00 Sunil Bates M高级每小时700.00 45 梁爱娃F警官每月30500.00 我要写一个程序,会看每个员工,计算奖金占基本工资的百分比,对于一个按小时计酬

  • 问题内容: 我必须阅读tomcat日志文件,并在一段时间(例如:一个小时)后再次读取该文件(仅针对新添加的内容),因此我创建了RandomAccessFile来记录我完成的最后一个位置并使用BufferedReader.readLine()方法。 但是,我发现有时我无法读取文件的整行。 例如,tomcat正在尝试编写以下内容(仅作为示例): 192.168.0.0本地主机/index.html .

  • 问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至:

  • 问题内容: 我需要在文本文件中读写数据,但是还无法弄清楚该怎么做。 我在Swift的iBook中找到了此示例代码,但我仍然不知道如何写入或读取数据。 问题答案: 为了进行读写,您应该使用可写的位置,例如documents目录。以下代码显示了如何读写简单的字符串。您可以在操场上进行测试。 雨燕3.x-5.x 斯威夫特2.2 斯威夫特1.x

  • 问题内容: 我认为能够将文本文件读入和写出字符串数组的能力是相当普遍的要求。从一种语言开始消除最初访问数据库的需求时,它也非常有用。Golang中是否存在? 例如 和 我宁愿使用现有的而不是重复的。 问题答案: 从Go1.1版本开始,有一个bufio.Scanner API可以轻松读取文件中的行。考虑上面的以下示例,该示例使用Scanner重写:

  • 问题内容: 我目前正在阅读“用困难的方式学习Python”,已经读到了第16章。 写入文件后,似乎无法打印文件的内容。它只是不打印任何内容。 问题答案: 你不调用函数和,而不是你只是得到他们的 指点 。由于它们是函数(或更准确地说,是方法),因此您需要在函数名称后调用它:。 那就是问题所在; 您以写入模式打开文件,该模式将删除文件的所有内容。您写入了文件,但从未关闭它,因此更改从未提交,文件保持为