Запись дополнительной строки при чтении текстового файла из базы данных MySQL и записи в папку проекта - PullRequest
0 голосов
/ 21 сентября 2018

Я храню текстовые файлы в MySQL и считываю их с Java в файл проекта.Я сталкиваюсь с проблемой в этом.Я сохраняю 3 файла, которые содержат 992 строки каждый.Но когда я читаю и сохраняю его обратно в папку проекта Java, 2 файла записываются по 993 строки каждый, последняя строка - пустая строка.

Как решить эту проблему?

Вотмои коды для чтения и записи в папку проекта.

и я прилагаю ссылки, где файлы могут быть доступны. 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();
      }
   }
 }

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы неправильно читаете поток, игнорируя фактическое число прочитанных байтов, возвращенное методом 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());

Файлы могут все еще быть неправильными, так как возможно, что вы допустили схожие ошибки при записи файла.

0 голосов
/ 21 сентября 2018

Файл 1 имеет длину 20579 байт, файл 2 имеет длину 20585 байт, а файл 3 имеет длину 20612 байт.Рабочий файл имеет четную длину.В вашем коде вы читаете и записываете байты 2 на 2. Я предполагаю, что, когда вы пишете последний байт файла 1 и 2, вы добавляете дополнительный байт в свой массив и записываете его в свой файл.

Попробуйтечитать байты один за другим, чтобы увидеть, работает ли он лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...