So erstellen Sie eine Zip-Datei beim Gruppieren von Datenbanksuchergebnissen in Java

Umgebung: Java8

Erläuterung

ZipEntry wird für jeden Schlüssel basierend auf einer sortierten zweidimensionalen Tabelle mit sich wiederholenden Werten durch eine einfache SELECT-Anweisung hinzugefügt. Der Inhalt des Eintrags ist eine Textdatei, und der Inhalt der Textdatei wird ebenfalls durch Einrückung gruppiert. Erstellen Sie eine Zip-Datei.

Ausgabe

  1. Erstellen Sie für jede Schlüsseländerung einen Zip-Dateieintrag.
  2. Jeder Eintrag enthält eine Textdatei.
  3. Gruppieren Sie auch den Inhalt der Textdatei. Nach Einzug gruppieren.

Eingang

  1. Die SELECT-Anweisung ist eine flache zweidimensionale Tabelle mit Wiederholungen desselben Werts.

Der Punkt

  1. Verwenden Sie ByteArrayOutputStream als temporären Bereich für die Textbearbeitung mit variabler Länge.
  2. Verwenden Sie den Konstruktor Formatter (OutputStream, String), um die Konvertierung und Formatierung von Zeichencode gleichzeitig durchzuführen.
  3. Rufen Sie nach dem Formatieren des gelesenen Datensatzes Formatter # flush () auf, um den bearbeiteten Textinhalt in den Puffer zu übertragen.
  4. Rufen Sie nach dem Übertragen des Pufferinhalts an ZipOutputStream ByteArrayOutputStream # reset () auf, um zum Anfang des Puffers zurückzukehren.
  5. Nicht schließen.
Bonus
  1. Erstellen Sie eine einfache Zeilenklasse, um Zeilen darzustellen, Schleifen mit for-Anweisungen zu erstellen und auf Spaltenwerte nach Namen zuzugreifen. Dies dient der Klarheit.
  2. Gleichung (cur.a, prev) auch im ersten Prozess, in dem der vorherige Wert nicht wie für (Row prev = new Row (null) existiert, so dass der Vergleich zwischen dem aktuellen Wert (cur) und dem vorherigen Wert (prev) immer gilt. Machen Sie .a) gültig.
  3. Bereiten Sie eine praktische Methode vor, die Nullen für den Zeichenfolgenvergleich zulässt und es Ihnen ermöglicht, Nullen mit Zeichenfolgen zu vergleichen. Dies soll verhindern, dass NullPointerException und IllegalArgumentException in null.equals (s) und s.equals (null) auftreten.
  4. Der Anfangswert von prev stimmt mit den tatsächlichen Daten überein. Dieses Mal wird angenommen, dass es keine Null als Daten in der Tabelle gibt. Dies sollte in den meisten Fällen in Ordnung sein. Die Spaltenwerte für die Gruppierung sollten niemals null sein.

Quellcode

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();
          }
        }
      }
    }
  }
}
Komfortmethode, die einen Vergleich mit Null ermöglicht
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);
  }
}
Ein einfacher Mechanismus zum Schleifen von 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;
  }
}

wichtiger Punkt

Sowohl Puffer als auch Formatierer müssen für den darin enthaltenen Code sichtbar sein. Wenn Sie wie folgt schreiben, treten Probleme auf, da Sie die Daten aufgrund von ZipOutputStream # write (byte []) nicht gehorsam abrufen können. Es gibt eine Möglichkeit, dies zu tun, aber dann müssen Sie es nicht so schreiben.

Formatter formatter = new Formatter(new ByteArrayOutputStream(1024), cs.name());
...
zos.write(???);//Was ist zu tun?

Recommended Posts

So erstellen Sie eine Zip-Datei beim Gruppieren von Datenbanksuchergebnissen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
So erstellen Sie einen Daten-URI (base64) in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
[Java] Erstellen Sie eine temporäre Datei
Erstellen Sie ein Java-Servlet und eine JSP-WAR-Datei für die Bereitstellung auf Apache Tomcat 9 mit Gradle
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Ich möchte eine Parkettdatei auch in Ruby erstellen
Erstellen Sie eine Datenbank in einer Produktionsumgebung
Entpacken Sie die Zip-Datei in Java
Protokollausgabe in Datei in Java
So erstellen Sie ein neues Gradle + Java + Jar-Projekt in Intellij 2016.03
Erstellen Sie eine TODO-App in Java 7 Create Header
Beispiel zum Entpacken einer gz-Datei in Java
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
So erstellen Sie überall eine H2-Datenbank
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Erstellen Sie eine CSR mit erweiterten Informationen in Java
[Rails] Rails neu, um eine Datenbank mit PostgreSQL zu erstellen
[Java] Erstellen Sie so etwas wie eine Produktsuch-API
[Android / Java] Betreiben Sie eine lokale Datenbank in Room
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Lassen Sie uns mit Java ein supereinfaches Webframework erstellen
Die Geschichte des Versuchs, JAVA File zu bedienen
So erstellen Sie ein Thema in Liferay 7 / DXP
Eine Bat-Datei, die Java in Windows verwendet
[Hinweis] Java: Erstellen Sie ein einfaches Projekt, während Sie lernen, wie die Einstellungsdatei funktioniert.
So erstellen Sie einfach ein Pulldown mit Rails
Erstellen wir eine vielseitige Dateispeicher (?) - Operationsbibliothek, indem wir die Dateispeicherung / -erfassung mit Java abstrahieren
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [0. Basisdatei]
<java> Zip-Datei lesen und direkt in String konvertieren
3. Erstellen Sie eine Datenbank für den Zugriff über das Webmodul
So springen Sie von Eclipse Java zu einer SQL-Datei
So erstellen Sie eine JDBC-URL (Oracle Database, Thin)
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Basisdatei]
Java / Twitter-Klon- / Aufgabenverwaltungssystem (1) Erstellen Sie eine Datenbank
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
So schreiben Sie eine Datumsvergleichssuche in Rails
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
[Java] Erstellen Sie einen Filter
Erstellen Sie JSON in Java
So lesen Sie Ihre eigene YAML-Datei (*****. Yml) in Java
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
So erstellen Sie ein leichtes Container-Image für Java-Apps
Erstellen Sie eine JAR-Datei, die auf Gradle ausgeführt werden kann
Konvertieren Sie ein Java-Byte-Array in eine hexadezimale Zeichenfolge
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Aktivieren Sie die Zelle A1 jeder Excel-Datei mit Java