Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole

popeye2803

Mitglied
Moin,
ich möchte ein Programm schreiben, welches den UNIX-Befehl grep nachstellt, d.h. eine Datei einlesen, in dieser Datei nach einen eingegebenen Begriff suchen und die Zeilen, wo der Begriff drin vorkommt in eine neue Datei schreiben.
Das klappt auch alles soweit.
Ich habe nur das Problem, dass die Standardausgabe über die Konsole erfolgen soll, wenn kein Dateiname (writer) für die Ausgabe-Datei angegeben ist.
Allerdings bekomme ich eine NullPointerException, wenn ich Null übergebe.

[CODE lang="java" title="grep"]grep(args[0], new FileReader(args[1]), new FileWriter(args[2]));[/CODE]

[CODE lang="java" title="grep"]static void grep(java.lang.String regex, java.io.Reader reader, java.io.Writer writer) throws IOException {

BufferedReader in = new BufferedReader(reader);

BufferedWriter bufOut = new BufferedWriter (writer);
PrintWriter out = new PrintWriter(bufOut);

String line;

ArrayList<String> text = new ArrayList<String>();
while (null != (line = in.readLine())) {
if(line.contains(regex)) {
text.add(line);
}
}

if (writer != null) {
for (String newText : text)
out.write(newText + "\n");
}else {
for (String newText : text)
System.out.print(newText + "\n");
}
in.close();
out.close();
}
}[/CODE]
 
Beste Antwort
Prinzip:
Java:
Writer writer;
if (args.length == 2) {
    writer = new OutputStreamWriter(System.out);
} else if (args.length == 3) {
    writer = new FileWriter(args[2]);
} else {
    // Fehlermeldung
}
K

kneitzel

Gast
Du musst die Argumente doch nur validieren. Und wenn das Argument nicht gegeben wurde oder ungültig ist, dann erzeugst Du keinen FileWriter sondern erstellst einen neuen OutputStreamWriter auf System.out.

Oder habe ich Dein Problem irgendwie missverstanden?
 

popeye2803

Mitglied
Genau, das habe ich auch.
Eine mögliche Eingabe in der Konsole wäre:
$ java Grep sea kubla.txt

Da würden die folgenden Argumente übergeben:
args[0] = sea
args[1] = kubla.txt
args[2] = null

Hier ist noch meine vorherige Implementierung:

[CODE lang="java" title="Main"]public static void main(String[] args) throws IOException {

String grepComand = "$ java Grep";

Scanner ir = new Scanner(System.in);
String inputComand = ir.nextLine();
String[] input = inputComand.split(" ");

args = input;

String inputGrepComand = input[0] + " " + input[1] + " " + input[2];

if (inputGrepComand.equals(grepComand) && input.length < 4) {
System.out.println("usage: Grep PATTERN [from-file] [to-file]");
} else if (inputGrepComand.equals(grepComand) && input.length < 4) {
System.arraycopy(input, 3, args, 0, input.length - 3);
args[0] = null;
args[1] = null;
args[1] = null;
} else if (inputGrepComand.equals(grepComand) && input.length < 5) {
System.arraycopy(input, 3, args, 0, input.length - 3);
args[1] = null;
args[2] = null;
args[3] = null;
} else if (inputGrepComand.equals(grepComand) && input.length < 6) {
System.arraycopy(input, 3, args, 0, input.length - 3);
args[2] = null;
args[3] = null;
args[4] = null;
} else if (inputGrepComand.equals(grepComand) && input.length < 7) {
System.arraycopy(input, 3, args, 0, input.length - 3);
args[3] = null;
args[4] = null;
args[5] = null;
} else {System.out.println("else");}

grep(args[0], new FileReader(args[1]), new FileWriter(args[2]));

}[/CODE]
 
K

kneitzel

Gast
Also irgendwie kann ich Dir nicht folgen. Wenn es nur 2 Argumente gibt, dann solltest Du eine IndexOutOfBoundsException bekommen, denn das String Array hat dann nur zwei Element!

Aber Du nutzt die übergebenen Argumente ja auch nicht sondern setzt args auf input.

Daher kann ich Deine Logik in keiner Weise nachvollziehen und das kleinste Problem scheint mir zu sein, dass Du da ständig einen neuen FileWriter erstellst - Was natürlich Unsinn ist, wenn Du es nicht in eine Datei schreiben willst.
 

popeye2803

Mitglied
Also irgendwie kann ich Dir nicht folgen. Wenn es nur 2 Argumente gibt, dann solltest Du eine IndexOutOfBoundsException bekommen, denn das String Array hat dann nur zwei Element!
Ja genau, das ist der Grund, warum ich args mit null initialisiere, wenn keine Ausgabedatei angegeben ist.

Wenn z.B. "$ java Grep sea kubla.txt new.txt" eingegeben wird, sollen die Zeilen, in denen "sea" vorkommt, in die Datei "new.txt" geschrieben werden. Das funktioniert auch.

Es klappt nur nicht, wenn ich nur "$ java Grep sea kubla.txt" Eingebe, dass es dann über die Konsole ausgegeben wird.
Und da fehlen mir so ein bisschen die Ansätze, was ich anpassen muss.
 

mihe7

Top Contributor
Prinzip:
Java:
Writer writer;
if (args.length == 2) {
    writer = new OutputStreamWriter(System.out);
} else if (args.length == 3) {
    writer = new FileWriter(args[2]);
} else {
    // Fehlermeldung
}
 
Beste Antwort
K

kneitzel

Gast
Wobei ja die Frage ist, was Du da ja überhaupt treibst. Du sollst soch vermutlich ein Programm schreiben, dass direkt die Parameter auswertet. Also Nix mit Scanner! Nix mit Usereingabe! Nix mit String.split!

Also einfach mal das folgene Programm betrachten und mit Parametern aufrufen:
Java:
public class Test {

    public static void main(String[] args) {
        System.out.println("Anzahl Parameter: " + args.length);
        for (int index = 0; index < args.length; index++) {
            System.out.println(index + ". Argument: " + args[index]);
        }
    }

}
 

popeye2803

Mitglied
Wobei ja die Frage ist, was Du da ja überhaupt treibst. Du sollst soch vermutlich ein Programm schreiben, dass direkt die Parameter auswertet. Also Nix mit Scanner! Nix mit Usereingabe! Nix mit String.split!

Also einfach mal das folgene Programm betrachten und mit Parametern aufrufen:
Java:
public class Test {

    public static void main(String[] args) {
        System.out.println("Anzahl Parameter: " + args.length);
        for (int index = 0; index < args.length; index++) {
            System.out.println(index + ". Argument: " + args[index]);
        }
    }

}
Doch, es soll über eine Eingabe laufen.
Wenn der Befehl "$ java Grep" eingegeben wird, ist der nächste Begriff das Suchwort (regex), dann die Eingabe-Datei (reader) und dann die Ausgabe-Datei (writer).
Eingabe-Datei und Ausgabe-Datei sind aber nur optional. Wenn die Begriffe fehlen, soll für die Eingabe ein standard input definiert werden (Tastatur) und bei fehlender Ausgabe-Datei ein standard output (Konsole).


Grep ist in der API so vorgegeben:

static void grep(java.lang.String regex, java.io.Reader reader, java.io.Writer writer)

Copies all lines containing the search string from the Reader to the Writer.

Parameters:
regex - the search string as regular expression
reader - the input stream
writer - the output stream


Daher klappt meiner Meinung nach auch diese Lösung nicht:
[CODE lang="java" title="java"]Writer writer;
if (args.length == 2) {
writer = new OutputStreamWriter(System.out);
} else if (args.length == 3) {
writer = new FileWriter(args[2]);
} else {
// Fehlermeldung
}[/CODE]
 
K

kneitzel

Gast
Also ehrlich gesagt wundert mich das. Wenn man es als Eingabe im Programm hätte, dann würde das '$ java' bei der Ei gabe keinen Sinn machen. Selbst das Grep nicht, so dass die einzige Funktionalität wäre.

Das, was da in der Aufgabe angegeben wurde sieht nach einem Aufruf aus. Das $ ist das Zeichen der Shell. Das java ist halt das Programm, das aufgerufen wird und Grep der Name der Klasse mit der main Methode.
Danach kommen dann die Parameter, die dann in args zu finden sind.

Wenn du mit der Eingabe arbeiten willst, dann geht das natürlich auch. Aber dann nutzt du NICHT den args Parameter.

Und der vorgegebene Code zeigt, wie du einen Writer als zweites Argument bekommst. Du musst einen Writer für den zweiten Parameter bekommen und das ist entweder ein FileWriter oder eben ein OutputStreamWriter. Da beides von Writer erbt, kann es da verwendet werden.
 

developer418

Mitglied
Dein Code:
Java:
grep(args[0], new FileReader(args[1]), new FileWriter(args[2]));

static void grep(java.lang.String regex, java.io.Reader reader, java.io.Writer writer) throws IOException {
    ...
}

Lösungsansatz:

Java:
grep(args[0], args[1]), args[2]);

static void grep(String regex, String readerS, String writerS) throws IOException {
   Reader reader = new FileReader(readerS);
   Writer writer;
    ...
   if(writerS != null) {
        writer = new FileWriter(writerS);
        BufferedWriter bufOut = new BufferedWriter (writer);
        PrintWriter out = new PrintWriter(bufOut);
   }
   ...
}
 

developer418

Mitglied
Hier noch ein einfacherer Code (Java 11):

[CODE lang="java" title="Idee für grep in file"]public static void grep() {
StringBuilder sb = new StringBuilder();
try {
Files.lines(Path.of("T:\\test.txt"))
.filter(line -> line.matches(".*[0-9].*"))
.forEach(line -> sb.append(line).append("\n"));

Files.writeString(Path.of("T:\\test.filtered.txt"), sb.toString().trim());
} catch (IOException e) {
e.printStackTrace();
}
}[/CODE]

[CODE lang="java" title="grep to console"]public static void grepConsole() {
try {
Files.lines(Path.of("T:\\test.txt"))
.filter(line -> line.matches(".*[0-9].*"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}[/CODE]
 

developer418

Mitglied
Die Idee hat einen entscheidenden Nachteil: die Methode muss nun viele Annahmen über Quelle und Ziel treffen. Wie gibst Du dort z. B. die Standardausgabe, die Fehlerausgabe oder einen Teil des Speichers für die Ausgabe an?
Hier wäre die Nutzung ausschießlich von InputStream und OutputStreams eine Lösung.


Java:
// z.B. Console
grep(regex, ...., System.out)

// z.B. ByteArrayOutputStream für byte[]
ByteArrayOutputStream bOut;   
grep(regex, ...., bOut)

// z.B. FileOutputStream für Date
FileOutputStream fos;   
grep(regex, ...., fos)

static void grep(String regex, ...., OutputStream out) throws IOException {
   ...   
}
 
K

kneitzel

Gast
Das ist doch Code, der komplett an der Aufgabe vorbei geht:
Grep ist in der API so vorgegeben:

static void grep(java.lang.String regex, java.io.Reader reader, java.io.Writer writer)

Daher kann ich diese "Lösungsansätze" in keiner Weise nachvollziehen. Die eigentliche Lösung, die wichtig ist für den TE hat @mihe7 in #7 gegeben: Denn es fehlt schlicht daran, wie ein writer für die gegebene Methode grep erzeugt werden kann.
 
K

kneitzel

Gast
Also generell ist es egal, wie man die Aufgabe versteht:
a) Man nimmt die Parameter der main Methode als Eingabe.
b) Man liest den Befehl ein.

Bei letzterem muss man nur schauen, was denn das Ergebnis von diesem Code ist:
Java:
        String[] s1 = "$ java Grep pattern filein fileout".split(" ");
        String[] s2 = "$ java Grep pattern filein ".split(" ");

Es läuft immer auf das gleiche raus: Mal hat man ein Element mehr als bei der anderen Situation. Ob dies nun bei dem Parameter args ist oder bei einer lokalen Variable input, ist egal.

Bei b könnte man prüfen, ob die ersten Strings wirklich "$" "java" und "Grep" sind.
Aber generell hat man dann 2 oder 3 weitere Parameter.
Bei 3 Parametern hat man die 3 Argumente so wie sie der TE schon hat.
Bei 2 Argumenten ist der 3. Parameter ein Writer auf System.out.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
S Daten aus txt-datei einzeln nach Spalten einlesen Java Basics - Anfänger-Themen 16
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
I Datei einlesen Java Basics - Anfänger-Themen 11
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
E Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern Java Basics - Anfänger-Themen 15
M Methoden Datei einlesen und als return übergeben. Java Basics - Anfänger-Themen 8
P CSV Datei einlesen und damit ein Datenmodell befüllen Java Basics - Anfänger-Themen 2
N Datei einlesen und grafisch anzeigen Java Basics - Anfänger-Themen 31
P csv Datei einlesen und ausgeben Java Basics - Anfänger-Themen 5
J Text Datei einlesen Java Basics - Anfänger-Themen 6
N gerichteter Graph aus einer Datei einlesen Java Basics - Anfänger-Themen 21
E Datei einlesen und bestimmte Wörter ausgeben Java Basics - Anfänger-Themen 2
Z Erste Schritte Versuche ein Labyrinth in einem Terminal zu erstellen, aber kann die properties Datei nicht einlesen Java Basics - Anfänger-Themen 3
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
V Excel Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 4
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
N Mehrdimensionales float Array aus .txt-Datei einlesen? Java Basics - Anfänger-Themen 17
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
J CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Datei einlesen - Dateipfad unter Linux anpassen Java Basics - Anfänger-Themen 12
A Datei in Array einlesen Java Basics - Anfänger-Themen 6
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
Ananaskirsche Input/Output Bestimmte Zeile aus Datei einlesen Java Basics - Anfänger-Themen 4
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
M CSV-File aus datei system einlesen Java Basics - Anfänger-Themen 3
B Datei in Java einlesen Java Basics - Anfänger-Themen 13
S Datei einlesen und ausgeben Java Basics - Anfänger-Themen 8
S Input/Output einlesen aus einer evtl. leeren Datei Java Basics - Anfänger-Themen 5
J Input/Output Datei - Zeilenumbruch einlesen Java Basics - Anfänger-Themen 10
H config Datei erstellen + einlesen Java Basics - Anfänger-Themen 15
F Datei einlesen ( Bytes ) Java Basics - Anfänger-Themen 12
T Klassen CSV datei einlesen und parsen Java Basics - Anfänger-Themen 4
U Datei einlesen Java Basics - Anfänger-Themen 9
S ANSI-Datei einlesen UND UTF-8-Datei schreiben Java Basics - Anfänger-Themen 3
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
I Datei einlesen, Inhalt in MAP ablegen Java Basics - Anfänger-Themen 10
A Erste Schritte Datei einlesen und Buchstaben zählen Java Basics - Anfänger-Themen 13
D txt-Datei zeilenweise als String einlesen Java Basics - Anfänger-Themen 2
E JPane txt datei einlesen Java Basics - Anfänger-Themen 5
D RegExp .txt-Datei einlesen Java Basics - Anfänger-Themen 6
M Datei Einlesen Fortan-Style? Java Basics - Anfänger-Themen 3
A Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 5
S Datei einlesen Java Basics - Anfänger-Themen 21
D Datei einlesen Fehler Java Basics - Anfänger-Themen 17
A Beim txt Datei einlesen kommen zusätzliche Lehrzeichen dazu. Java Basics - Anfänger-Themen 5
H eine Datei schnellstmöglich einlesen Java Basics - Anfänger-Themen 12
0 Log4J Probleme beim einlesen der Log datei Java Basics - Anfänger-Themen 2
E Input/Output Linux datei in Windows zeilenweise einlesen Java Basics - Anfänger-Themen 4
S XML Datei einlesen und Elemente ausgeben Java Basics - Anfänger-Themen 4
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
S Datenströne - Text in eine Datei einlesen, umwandeln und in eine neue Datei schreiben Java Basics - Anfänger-Themen 6
E externe .txt Datei mit Scanner einlesen Java Basics - Anfänger-Themen 7
N Input/Output .txt-Datei einlesen, aufteilen und seperat abspeichern Java Basics - Anfänger-Themen 3
L Datei einlesen Java Basics - Anfänger-Themen 12
L Input/Output Datei in Java einlesen Java Basics - Anfänger-Themen 9
J Datei einlesen Java Basics - Anfänger-Themen 10
I .csv-Datei einlesen klappt aber kann nicht in String geschrieben werden!?!?! Java Basics - Anfänger-Themen 11
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
B Wertetabelle mit versch. Formaten aus txt-Datei einlesen Java Basics - Anfänger-Themen 2
H 200000 Zeilen aus Datei einlesen Java Basics - Anfänger-Themen 13
D CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 23
J byteweise Einlesen einer Datei "Von.. bis.." Java Basics - Anfänger-Themen 3
J Einlesen/Speichern von Strings aus einer Datei Java Basics - Anfänger-Themen 15
Z CSV-Datei einlesen mit dem JFileChooser !!! Java Basics - Anfänger-Themen 5
H Einlesen einer CSV-Datei Java Basics - Anfänger-Themen 2
X einlesen aus Datei, Fehler Java Basics - Anfänger-Themen 9
S Einlesen einer Datei? Java Basics - Anfänger-Themen 9
L Datei einlesen und neu geändert ausgeben Java Basics - Anfänger-Themen 8
B Formel aus Datei einlesen und benutzen Java Basics - Anfänger-Themen 3
C Datei einlesen Java Basics - Anfänger-Themen 19
H Datei einlesen in einer MVC Anwendung Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben