Ich habe einen ByteArrayOuputStream, den ich von einem diff erhalten habe. Das Parsen von Java ist zu langsam, also habe ich mich entschieden, das Parsing an ein Perl-Skript zu übergeben. Ich habe ein kleines Problem damit, dass das Skript Daten von diesem Ausgabestream empfängt. Wenn ich meinen Code ausführe, hängt die Anwendung auf unbestimmte Zeit. Das ist, was ich bisher habe:Sende ByteArrayOutputStream an Perl-Skript, dann lese Antwort
public static Diff analyzeDiff(ByteArrayOutputStream baos) throws IOException {
ProcessBuilder pb = new ProcessBuilder();
pb.command("perl/path/perl", TEMP.getAbsolutePath());
Process process = pb.start();
OutputStream str = process.getOutputStream();
baos.writeTo(str);
str.flush();
try {
process.waitFor();
} catch (InterruptedException e) {
BufferedReader bf = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bf.readLine()) != null) {
System.out.println(line);
}
}
return null;
}
@Test
public void testDiffParser() throws IOException {
DiffParser.init();
File test = new File("path/to/file/test.diff");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(FileUtils.readFileToByteArray(test));
//String output = baos.toString();
//System.out.println(output);
DiffParser.analyzeDiff(baos);
//DiffParser.analyzeDiff(output);
}
Und hier ist mein Perl-Skript:
#!/usr/bin/perl
use strict;
use warnings;
my $additions = 0;
my $deletions = 0;
my $filesChanged = 0;
my $fileAdded = 0;
my $line;
foreach $line (<>) {
$_ = $line;
chomp($_);
print($_);
if (/^\-\-\-/m) {
$fileAdded = 1;
} elsif (/^\+\+\+/m && $fileAdded) {
$filesChanged++;
$fileAdded = 0;
} elsif (/^\+/) {
$additions++;
$fileAdded = 0;
} elsif (/^\-/) {
$deletions++;
$fileAdded = 0;
} else {
$fileAdded = 0;
}
}
print("$additions $deletions $filesChanged\n")
Gibt es einen Weg, um tatsächlich zu tun, was ich tun möchte?
Edit: Dies ist, wie ich es in Java tat:
private Diff parseDiff(final ByteArrayOutputStream baos) {
final Diff diff = new Diff();
int filesChanged = 0;
int additions = 0;
int deletions = 0;
boolean fileAdded = false;
final String[] lines = baos.toString().split("\n");
for (final String line : lines) {
if (line.startsWith("---")) {
fileAdded = true;
} else if (line.startsWith("+++") && fileAdded) {
filesChanged++;
fileAdded = false;
} else if (line.startsWith("+")) {
additions++;
fileAdded = false;
} else if (line.startsWith("-")) {
deletions++;
fileAdded = false;
} else {
fileAdded = false;
}
}
diff.additions = additions;
diff.deletions = deletions;
diff.changedFiles = filesChanged;
return diff;
}
Edit 2 Wenn Sie etwas Kontext möchten, können Sie auf diese verweisen Related question
'Java's Parsing ist zu langsam 'Die Übergabe an Perl wäre nicht meine erste Wahl (fügt eine zusätzliche Abhängigkeit/Fehlerpunkt hinzu) - in Betracht ziehen, den Java-Parsing-Code zu posten, da es möglicherweise Möglichkeiten gibt, ihn zu optimieren – copeg
@ Copeg sicher, habe hinzugefügt, dass per Vorschlag – Himself12794
Ich denke Multithreading diesen Code wäre eine bessere und schnellere Idee als die Übergabe an einen anderen Prozess ...? – saml