Umgebung: Java8
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.
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();
}
}
}
}
}
}
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);
}
}
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;
}
}
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