Pour créer un fichier Zip lors du regroupement des résultats de recherche de base de données en Java

Environnement: Java8

La description

ZipEntry est ajouté pour chaque clé en fonction d'un tableau bidimensionnel trié avec des valeurs répétées par une simple instruction SELECT, le contenu de l'entrée est sous forme de fichier texte et le contenu du fichier texte est également groupé par indentation. Créez un fichier Zip.

production

  1. Créez une entrée de fichier Zip pour chaque changement de clé.
  2. Chaque entrée contient un fichier texte.
  3. Regroupez également le contenu du fichier texte. Regrouper par retrait.

contribution

  1. L'instruction SELECT est un tableau bidimensionnel plat avec la répétition des mêmes valeurs.

Le point

  1. Utilisez ByteArrayOutputStream comme zone temporaire pour l'édition de texte de longueur variable.
  2. Utilisez le constructeur Formatter (OutputStream, String) pour gérer simultanément la conversion et la mise en forme du code de caractère.
  3. Après avoir mis en forme l'enregistrement lu, appelez Formatter # flush () pour transférer le contenu de texte modifié vers la mémoire tampon.
  4. Après avoir transféré le contenu du tampon vers ZipOutputStream, appelez ByteArrayOutputStream # reset () pour revenir au début du tampon.
  5. Ne fermez pas.
prime
  1. Créez une classe Row simple pour représenter des lignes, faites une boucle avec des instructions for et accédez aux valeurs de colonne par nom. C'est pour plus de clarté.
  2. eq (cur.a, prev) même dans le premier processus où la valeur précédente n'existe pas comme pour (Row prev = new Row (null) afin que la comparaison entre la valeur actuelle (cur) et la valeur précédente (prev) soit toujours valable. Rendre .a) valide.
  3. Pour la comparaison de chaînes, préparez une méthode pratique qui autorise null et peut comparer null avec une chaîne. Cela permet d'éviter que NullPointerException et IllegalArgumentException ne se produisent dans null.equals (s) et s.equals (null).
  4. La valeur initiale de prev est cohérente avec les données réelles. Cette fois, il est supposé qu'il n'y a pas de valeur null comme données dans la table. Cela devrait être bien dans la plupart des cas. Les valeurs de colonne pour le regroupement ne doivent jamais être nulles.

Code source

Charset cs = Charset.defaultCharset();
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file), cs)) {
  try (ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024)) {
    try (Formatter formatter = new Formatter(buffer, cs.name())) {
      try (PreparedStatement select = con.prepareStatement("SELECT DISTINCT a, b, c, d, e, f FROM foo ORDER BY a, b, c desc, d, e, f")) {
        try (ResultSet rs = select.executeQuery()) {
          for (Row prev = new Row(null), cur = Row.next(rs); cur != null; prev = cur, cur = Row.next(rs)) {
            if (!eq(cur.a, prev.a) || !eq(cur.b, prev.b)) {
              zos.putNextEntry(new ZipEntry(String.format("%s-%s.txt", cur.a, cur.b)));
              formatter.format("%s%n", cur.c);
              formatter.format("  %s%n", cur.d);
            } else if (!eq(cur.c, prev.c)) {
              formatter.format("%s%n", cur.c);
              formatter.format("  %s%n", cur.d);
            } else if (!eq(cur.d, prev.d)) {
              formatter.format("  %s%n", cur.d);
            }
            formatter.format("    %s: %s%n", cur.e, cur.f);
            formatter.flush();
            zos.write(buffer.toByteArray());
            buffer.reset();
          }
        }
      }
    }
  }
}
Méthode pratique qui permet la comparaison avec null
public static boolean eq(String l, String r) {
  if (l == r) {
    return true;
  } else if (l != null && r == null) {
    return false;
  } else if (l == null && r != null) {
    return false;
  } else {
    return l.equals(r);
  }
}
Un mécanisme simple pour boucler ResultSet
public class Row {
  public static Row next(ResultSet rs) throws SQLException {
    return (rs.next()) ? new Row(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6)) : null;
  }

  String a;
  String b;
  String c;
  String d;
  String e;
  String f;
  
  public Row(String v) {
    this(v, v, v, v, v, v);
  }

  public Row(String a, String b, String c, String d, String e, String f) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    this.e = e;
    this.f = f;
  }
}

point important

Le tampon et le formateur doivent être visibles pour le code qu'ils contiennent. Si vous écrivez comme suit, vous aurez des problèmes car vous ne pouvez pas récupérer les données docilement à cause de ZipOutputStream # write (byte []). Il existe un moyen de le faire, mais vous n'êtes pas obligé de l'écrire comme ça.

Formatter formatter = new Formatter(new ByteArrayOutputStream(1024), cs.name());
...
zos.write(???);//Que faire?

Recommended Posts

Pour créer un fichier Zip lors du regroupement des résultats de recherche de base de données en Java
Essayez de créer un babillard en Java
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
Comment créer un environnement Java en seulement 3 secondes
J'ai essayé de créer une compétence Clova en Java
Comment créer un URI de données (base64) en Java
Comment convertir un fichier en tableau d'octets en Java
[Java] Créer un fichier temporaire
Créer un servlet Java et un fichier WAR JSP à déployer sur Apache Tomcat 9 avec Gradle
Créer une méthode pour renvoyer le taux de taxe en Java
Je veux créer un fichier Parquet même en Ruby
Créer une base de données dans un environnement de production
Décompressez le fichier zip en Java
Enregistrer la sortie dans un fichier en Java
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03
Créer une application TODO dans Java 7 Créer un en-tête
Exemple pour décompresser le fichier gz en Java
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Comment créer une base de données H2 n'importe où
Deux façons de démarrer un thread en Java + @
Lire une chaîne dans un fichier PDF avec Java
Créer un CSR avec des informations étendues en Java
[Rails] rails nouveau pour créer une base de données avec PostgreSQL
[Java] Créez quelque chose comme une API de recherche de produits
[Android / Java] Exploitez une base de données locale dans la salle
Code pour échapper aux chaînes JSON en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Créons un framework Web ultra-simple avec Java
Histoire d'essayer de faire fonctionner le fichier JAVA
Comment créer un thème dans Liferay 7 / DXP
Un fichier bat qui utilise Java dans Windows
[Note] Java: créez un projet simple tout en apprenant comment fonctionne le fichier de paramètres.
Comment créer facilement un pull-down avec des rails
Créons une bibliothèque d'opérations de stockage de fichiers polyvalente (?) En faisant abstraction du stockage / acquisition de fichiers avec Java
J'ai essayé de créer une compétence Alexa avec Java
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Java] Créons un Minecraft Mod 1.14.4 [0. Fichier de base]
<java> Lire le fichier Zip et le convertir directement en chaîne
3. Créez une base de données à laquelle accéder à partir du module Web
Comment passer d'Eclipse Java à un fichier SQL
Comment créer une URL JDBC (Oracle Database, Thin)
Comment créer un projet Spring Boot dans IntelliJ
[Java] Créons un Minecraft Mod 1.16.1 [Fichier de base]
Système de gestion des tâches / clones Java / Twitter ① Créer une base de données
J'ai essayé de créer une fonction de connexion avec Java
Comment écrire une recherche de comparaison de dates dans Rails
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Essayez de résoudre un problème FizzBuzz restreint en Java
Java11: exécuter le code Java dans un seul fichier tel quel
[Java] Créer un filtre
Créer JSON en Java
Comment lire votre propre fichier YAML (*****. Yml) en Java
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
Comment créer une image de conteneur légère pour les applications Java
Créez un fichier jar qui peut être exécuté sur Gradle
Convertir un tableau d'octets Java en une chaîne hexadécimale
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Activez la cellule A1 de chaque feuille de fichier Excel avec Java