Text suchen und ersetzen im Word Dokument

imox

Aktives Mitglied
Hey Leute,

ich bin auf der Suche nach einer Lösung wie ich in einem Word Dokument "Variablen" suchen und ersetzen kann. Mein Ansatz ist, dass die Variablen immer in "#{}" verpackt werden müssen. Als API nehme ich Apache POI (XWPFDocument usw.).

Der Aufbau sieht ja dann wie folgt aus. XPWFDocument hat ne Liste von XWPFParagraphen die haben dann noch mal eine Liste mit XWPFRuns in dem dann der Text und die jeweilige Formatierung steht.

Dass knifflige ist jetzt, dass jeglicher Text auf verschiedene Paragraphen und Runs aufgesplittet sein kann. Hier mal mein Code was ich bisher gemacht hatte. Klappt auch einigermaßen doch allerdings gibt es immer wieder Fälle wo es nicht mehr hinhaut. Ich glaube ich mach das auch alles viel zu kompliziert, mir fällt aber leider irgendwie keine andere Lösung ein.

Ich hoffe jemand von euch hat den Elan sich meinen code anzuschauen ;) dafür dann schon mal vielen vielen Dank bzw. wenn jemand eine komplett andere Lösung hat wäre super.

Code:
    public static void replaceInParagraphs(List<XWPFParagraph> paragraphs, Map<String, String> replacements) {
        Set<XWPFRun> runsToClear = new LinkedHashSet<>();
        Set<XWPFRun> runsToClearTemp = new LinkedHashSet<>();
        String addNextRunText = "";
        String collectNextRunText = "";
        String tempText = "";
        for (XWPFParagraph paragraph : paragraphs) {
            List<XWPFRun> runs = paragraph.getRuns();
            for (XWPFRun run : runs) {
                if (!addNextRunText.equals("")) {
                    tempText += addNextRunText;
                    addNextRunText = "";
                }
                String[] buildTexte = buildSearchText(tempText, paragraph, run, runsToClearTemp);
                if (buildTexte.length == 3)
                    collectNextRunText = buildTexte[2];
                tempText = buildTexte[0];
                if (!tempText.equals("")) {
                    if (tempText.contains("#{") && tempText.contains("}")) {
                        String searchText = "";
                        // boolean hasReplaced = false;
                        String lastReplacement = "";
                        for (Map.Entry<String, String> replacement : replacements.entrySet()) {
                            if (!tempText.contains("#{") && !tempText.contains("}"))
                                break;
                            searchText = "#{" + replacement.getKey() + "}";
                            if (tempText.contains(searchText)) {
                                tempText = tempText.replace(searchText, replacement.getValue());
                                lastReplacement = replacement.getValue();
                                // hasReplaced = true;
                            }
                        }
                        if (!collectNextRunText.equals("") && !collectNextRunText.startsWith("#")) {
                            int index = collectNextRunText.indexOf("#");
                            tempText += collectNextRunText.substring(0, index);
                            collectNextRunText = collectNextRunText.substring(index);
                        }
                        addNextRunText = collectNextRunText;
                        collectNextRunText = "";
                        if (lastReplacement.equals("")) {
                            tempText = "";
                            runsToClearTemp.clear();
                            continue;
                        }
                        String checkTempText = tempText.substring(tempText.indexOf(lastReplacement));
                        if (checkTempText.contains("#")) {
                            if (checkTempText.endsWith("#")) {
                                tempText = tempText.substring(0, tempText.length() - 1);
                                addNextRunText = "#";
                            } else if (checkTempText.contains("#{")) {
                                int index = 0;
                                while (index < tempText.indexOf(lastReplacement))
                                    index = tempText.substring(index, tempText.length()).indexOf("#{");
                                addNextRunText = tempText.substring(index, tempText.length());
                                tempText = tempText.substring(0, index);
                            }
                        }
                        tempText += buildTexte[1];
                        run.setText(tempText, 0);
                        runsToClear.addAll(runsToClearTemp);
                        runsToClearTemp.clear();
                        tempText = "";
                    }
                }
            }
        }
        for (XWPFRun run : runsToClear)
            run.setText("", 0);
    }

    private static String[] buildSearchText(String tempText, XWPFParagraph paragraph, XWPFRun run,
            Set<XWPFRun> runsToClear) {
        // String text = run.getText(run.getTextPosition());
        String text = run.getText(-1);
        String rest = "";
        if (text == null)
            return new String[] { "", "" };
        if (!tempText.equals("") && text.contains("#")) {
            if (text.contains("}") && text.indexOf("}") < text.indexOf("#")) {
                int firstIndex = text.indexOf("}");
                if (firstIndex == 0)
                    firstIndex = 1;
                return new String[] { tempText += text.substring(0, firstIndex), "", text.substring(firstIndex) };
            } else {
                runsToClear.clear();
                tempText = "";
            }
        }
        if (tempText.equals("")) {
            if (text.contains("#")) {
                if (text.contains("}"))
                    tempText = text;
                else
                    tempText = text.substring(text.indexOf("#"));
                if (!tempText.contains("}") || (!text.startsWith("#") && !tempText.contains("}"))) {
                    run.setText(text.substring(0, text.indexOf("#")));
                    runsToClear.add(run);
                }
                return new String[] { tempText, rest };
            } else
                return new String[] { "", "" };
        }
        if (tempText.startsWith("#")) {
            if ((tempText.length() == 1 || (tempText.length() > 1 && tempText.charAt(1) != '{'))
                    && !text.startsWith("{")) {
                runsToClear.clear();
                return new String[] { "", "" };
            }
            if (tempText.length() == 1 && text.startsWith("{")) {
                tempText += "{";
                text = text.substring(1);
            }
            if (tempText.length() > 1 && tempText.charAt(1) == '{') {
                if (text.contains("}")) {
                    int index = text.indexOf("}");
                    tempText += text.substring(0, text.indexOf("}") + 1);
                    if (text.length() >= index + 2)
                        rest = text.substring(text.indexOf("}") + 1);
                } else {
                    tempText += text;
                    runsToClear.add(run);
                }
            }
        }
        return new String[] { tempText, rest };
    }
 

imox

Aktives Mitglied
Hey Leute,

also ich hab mich gestern noch mal den ganzen Tag ran gesetzt und bin das ganze komplett anders angegangen und hab jetzt ne super Lösung die um einiges strukturierter ist und funktioniert ;). Ich kann mir auch gut vorstellen, dass das den ein oder anderen auch helfen könnte. Ich stelle hier einfach mal mein ganzes XWPFUtil rein.

Gruß
Imox

Code:
public final class XWPFUtil {

    public static boolean remove(XWPFParagraph paragraph, XWPFDocument doc) {
        doc.removeBodyElement(doc.getPosOfParagraph(paragraph));
        return true;
    }

    public static XWPFParagraph insertAfter(XWPFParagraph paragraph, XWPFDocument doc) {
        XWPFParagraph next = next(paragraph, doc);
        XmlCursor cursor = next.getCTP().newCursor();
        return doc.insertNewParagraph(cursor);
    }

    public static XWPFParagraph insertBefore(XWPFParagraph paragraph, XWPFDocument doc) {
        XmlCursor cursor = paragraph.getCTP().newCursor();
        return doc.insertNewParagraph(cursor);
    }

    public static XWPFParagraph next(XWPFParagraph paragraph, XWPFDocument doc) {
        int position = doc.getPosOfParagraph(paragraph);
        return doc.getParagraphs().get(++position);
    }

    public static XWPFParagraph find(String text, XWPFDocument doc) {
        for (XWPFParagraph p : doc.getParagraphs()) {
            if (p.getText().contains(text))
                return p;
        }
        return null;
    }

    public static boolean hasPersonMark(XWPFDocument doc) {
        for (String mark : getMarks(doc))
            if (mark.contains("Person"))
                return true;
        return false;
    }

    public static Set<String> getMarks(XWPFDocument doc) {
        StringBuilder text = new StringBuilder();
        for (XWPFParagraph paragraph : doc.getParagraphs())
            collectAllCharacters(text, paragraph.getRuns());
        Set<String> marks = new HashSet<>();
        marks.addAll(StringUtil.getAllSubstrings(text.toString(), "#{", "}"));
        marks.addAll(getHeaderMarks(doc));
        marks.addAll(getFooterMarks(doc));
        marks.addAll(getTableMarks(doc));
        return marks;
    }

    private static Set<String> getHeaderMarks(XWPFDocument doc) {
        StringBuilder text = new StringBuilder();
        for (XWPFHeader header : doc.getHeaderList())
            for (XWPFParagraph paragraph : header.getListParagraph())
                collectAllCharacters(text, paragraph.getRuns());
        return new HashSet<>(StringUtil.getAllSubstrings(text.toString(), "#{", "}"));
    }

    private static Set<String> getFooterMarks(XWPFDocument doc) {
        StringBuilder text = new StringBuilder();
        for (XWPFFooter footer : doc.getFooterList())
            for (XWPFParagraph paragraph : footer.getListParagraph())
                collectAllCharacters(text, paragraph.getRuns());
        return new HashSet<>(StringUtil.getAllSubstrings(text.toString(), "#{", "}"));
    }

    private static Set<String> getTableMarks(XWPFDocument doc) {
        StringBuilder text = new StringBuilder();
        for (XWPFTable xwpfTable : doc.getTables()) {
            List<XWPFTableRow> tableRows = xwpfTable.getRows();
            for (XWPFTableRow xwpfTableRow : tableRows) {
                List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
                for (XWPFTableCell xwpfTableCell : tableCells) {
                    for (XWPFParagraph paragraph : xwpfTableCell.getParagraphs())
                        collectAllCharacters(text, paragraph.getRuns());
                }
            }
        }
        return new HashSet<>(StringUtil.getAllSubstrings(text.toString(), "#{", "}"));
    }

    private static void collectAllCharacters(StringBuilder text, List<XWPFRun> runs) {
        if (runs != null) {
            for (XWPFRun r : runs) {
                int pos = r.getTextPosition();
                pos = -1;
                // TODO:
                if (r.getText(pos) != null)
                    text.append(r.getText(pos));
            }
        }
    }

    public static void replaceMark(XWPFDocument doc, ObjectMap replacements) {
        Map<String, String> map = new HashMap<>();
        for (Map.Entry<String, Object> entry : replacements.entrySet())
            map.put(entry.getKey(), String.valueOf(entry.getValue()));
        replaceMark(doc, map);
    }

    public static void replaceMark(XWPFDocument doc, Map<String, String> replacements) {
        replaceInParagraphs(doc.getParagraphs(), replacements);
        replaceInTables(doc, replacements);
        replaceInHeader(doc, replacements);
        replaceInFooter(doc, replacements);
    }

    public static void replaceInTables(XWPFDocument doc, Map<String, String> replacements) {
        for (XWPFTable xwpfTable : doc.getTables()) {
            List<XWPFTableRow> tableRows = xwpfTable.getRows();
            for (XWPFTableRow xwpfTableRow : tableRows) {
                List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
                for (XWPFTableCell xwpfTableCell : tableCells) {
                    replaceInParagraphs(xwpfTableCell.getParagraphs(), replacements);
                }
            }
        }
    }

    public static void replaceInHeader(XWPFDocument doc, Map<String, String> replacements) {
        for (XWPFHeader header : doc.getHeaderList())
            replaceInParagraphs(header.getParagraphs(), replacements);
    }

    public static void replaceInFooter(XWPFDocument doc, Map<String, String> replacements) {
        for (XWPFFooter footer : doc.getFooterList())
            replaceInParagraphs(footer.getParagraphs(), replacements);
    }

    public static void replaceInParagraphs(List<XWPFParagraph> paragraphs, Map<String, String> replacements) {
        replaceInParagraphs(paragraphs, replacements, '#', '{', '}');
    }

    public static void replaceInParagraphs(List<XWPFParagraph> paragraphs, Map<String, String> replacements,
            Character startCharacter, Character secondStartCharacter, Character endCharacter) {
        mergeTextForVariables(paragraphs, startCharacter, secondStartCharacter, endCharacter);
        for (XWPFParagraph paragraph : paragraphs) {
            for (XWPFRun run : paragraph.getRuns()) {
                String text = run.getText(-1);
                if (text == null || text.equals(""))
                    continue;
                for (Map.Entry<String, String> replacement : replacements.entrySet()) {
                    String searchText = startCharacter.toString() + secondStartCharacter.toString()
                            + replacement.getKey() + endCharacter.toString();
                    text = text.replace(searchText, replacement.getValue());
                }
                run.setText(text, 0);
            }
        }
    }

    private static void mergeTextForVariables(List<XWPFParagraph> paragraphs, Character startCharacter,
            Character secondStartCharacter, Character endCharacter) {
        for (List<XWPFRun> list : collectSeparatedRuns(paragraphs, startCharacter, secondStartCharacter,
                endCharacter)) {
            XWPFRun firstRun = list.get(0);
            XWPFRun lastRun = list.get(list.size() - 1);
            for (XWPFRun run : list) {
                if (run == firstRun || run == lastRun)
                    continue;
                firstRun.setText(firstRun.getText(-1) + run.getText(-1), 0);
                run.setText("", 0);
            }
            String lastRunText = lastRun.getText(-1);
            firstRun.setText(firstRun.getText(-1) + lastRunText.substring(0, lastRunText.indexOf(endCharacter) + 1), 0);
            lastRun.setText(lastRunText.substring(lastRunText.indexOf(endCharacter) + 1), 0);
        }
    }

    private static List<List<XWPFRun>> collectSeparatedRuns(List<XWPFParagraph> paragraphs, Character startCharacter,
            Character secondStartCharacter, Character endCharacter) {
        List<List<XWPFRun>> collection = new ArrayList<>();
        List<XWPFRun> tempList = new ArrayList<>();
        DetectionType currentType = DetectionType.NONE;
        for (XWPFParagraph paragraph : paragraphs) {
            Character lastCharacter = null;
            for (XWPFRun run : paragraph.getRuns()) {
                String text = run.getText(-1);
                DetectionType type = detectRun(run, currentType, lastCharacter, startCharacter, secondStartCharacter,
                        endCharacter);
                if (text != null) {
                    if (text.length() > 1)
                        lastCharacter = text.charAt(text.length() - 1);
                    else if (text.length() == 1)
                        lastCharacter = text.charAt(0);
                }
                if (currentType == DetectionType.NONE && type == DetectionType.CONTINUE) {
                    tempList.add(run);
                } else if (currentType == DetectionType.CONTINUE && type == DetectionType.CONTINUE) {
                    tempList.add(run);
                } else if (currentType == DetectionType.CONTINUE && type == DetectionType.NONE) {
                    tempList.clear();
                } else if (currentType == DetectionType.CONTINUE && type == DetectionType.END) {
                    tempList.add(run);
                    List<XWPFRun> l = new ArrayList<>();
                    l.addAll(tempList);
                    collection.add(l);
                    tempList.clear();
                    lastCharacter = null;
                }
                currentType = type;
            }
        }
        return collection;
    }

    private static DetectionType detectRun(XWPFRun run, DetectionType type, Character lastCharacter,
            Character startCharacter, Character secondStartCharacter, Character endCharacter) {
        String text = run.getText(-1);
        if (text == null)
            return DetectionType.NONE;
        if (type == DetectionType.NONE) {
            if (!text.contains(startCharacter.toString()))
                return DetectionType.NONE;
            if (isOpen(text, false, null, startCharacter, secondStartCharacter, endCharacter))
                return DetectionType.CONTINUE;
            return DetectionType.END;
        } else if (type == DetectionType.CONTINUE) {
            if (isOpen(text, true, lastCharacter, startCharacter, secondStartCharacter, endCharacter))
                return DetectionType.CONTINUE;
            if (lastCharacter == startCharacter)
                return DetectionType.NONE;
            return DetectionType.END;
        }
        return DetectionType.NONE;
    }

    private static boolean isOpen(String text, boolean state, Character lastCharacter, Character startCharacter,
            Character secondStartCharacter, Character endCharacter) {
        boolean open = state;
        Character last = lastCharacter;
        for (char c : text.toCharArray()) {
            if (last == null)
                last = c;
            if (open) {
                if (last == startCharacter && c != secondStartCharacter)
                    open = false;
                else if (c == endCharacter)
                    open = false;
            } else {
                if (c == startCharacter)
                    open = true;
            }
            last = c;
        }
        return open;
    }

    private enum DetectionType {
        NONE, CONTINUE, END;
    }

}
 
Zuletzt bearbeitet:

imox

Aktives Mitglied
Na dass funktioniert ja jetzt ;-) also das Thema kann hier eigentlich geschlossen werden. Oder aus Interesse für dich? Damit kannste jetzt eigentlich sämtlichen Text in einem Word file ersetzen. Musst die Variablen nur so verpacken #{Alter}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
R Windows-XP-Suchfunktion: Nach Text in Java-Dateien suchen Allgemeine Java-Themen 9
O Mit jsoup Text aus HTML-Datei rausgrabben Allgemeine Java-Themen 29
C EML Email Text in String wandeln Allgemeine Java-Themen 11
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
M Thymeleaf th value und th text Allgemeine Java-Themen 1
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
izoards Bestimmter Text aus PDF extrahieren Allgemeine Java-Themen 3
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
L Text filtern Allgemeine Java-Themen 1
Bluedaishi TEXT Kodierung Allgemeine Java-Themen 3
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
S Ini Text aus String parsen Allgemeine Java-Themen 1
M itext - Button der Text in Zwischenablage stellt Allgemeine Java-Themen 0
E CSV mit Text und Binärdaten auslesen Allgemeine Java-Themen 7
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
windl Text mining / deep learning Allgemeine Java-Themen 0
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
KeexZDeveoper Text Mining Allgemeine Java-Themen 3
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
A Datenexport (Text und Draw) Allgemeine Java-Themen 1
L Text von txt auf JTextArea Allgemeine Java-Themen 4
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T itext: text in ein textfeld hinzufügen Allgemeine Java-Themen 2
B Farbiger Text in der Konsole Allgemeine Java-Themen 1
K Pdf mit dynamischem Text mit iText Allgemeine Java-Themen 0
D Text Analyzer Allgemeine Java-Themen 2
RalleYTN Audiodatein(.ogg/.wav) in Text konvertieren Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
P HTML Text bearbeiten Allgemeine Java-Themen 1
B JFrame Text Ausgabe Allgemeine Java-Themen 7
G Makierter Text in Arbeitsspeicher Allgemeine Java-Themen 2
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
P iText Text zentrieren Allgemeine Java-Themen 3
J Verschlüsselung von Text? Allgemeine Java-Themen 2
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
achillesat Rich Text Editor Allgemeine Java-Themen 2
M CMD-Text anzeigen Allgemeine Java-Themen 10
G Text Mining Allgemeine Java-Themen 7
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
nrg Find and replace Text docx Allgemeine Java-Themen 6
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
Q Text Datei einlesen Allgemeine Java-Themen 27
N .doc text ändern Allgemeine Java-Themen 12
R Komponente hat nicht die gesetzten Eingeschaften (Text, Farbe) Allgemeine Java-Themen 3
M NOA an den Source Text des Dokumentes kommen Allgemeine Java-Themen 7
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
D markierten Text kopieren Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
C Datei als ASCII text einlesen ? Allgemeine Java-Themen 16
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
M String in Html Text umwandeln Allgemeine Java-Themen 2
T eingefügter Text nach dem rendern spiegelverkehrt Allgemeine Java-Themen 2
lumo encoding einer text-datei Allgemeine Java-Themen 2
E Text ans Ende einer Textdatei anfügen Allgemeine Java-Themen 2
E JTextArea / JEditorPane + Text formatieren Allgemeine Java-Themen 3
R Java Text anderer Schriftart einlesen Allgemeine Java-Themen 2
A AES Key aus Text erzeugen Allgemeine Java-Themen 2
S Koordinaten aus einem Text filtern Allgemeine Java-Themen 11
turmaline Text aus Web-Seiten auslesen Allgemeine Java-Themen 1
MQue Graphics2D Text Allgemeine Java-Themen 2
U Text verschmelzen Allgemeine Java-Themen 8
martin82 Java-Code aus Text-Datei parsen Allgemeine Java-Themen 3
W Text curser auswählen für Paste Allgemeine Java-Themen 15
G HTML-Datei einlesen, Plain Text in Textfile speichern Allgemeine Java-Themen 4
S Bestes Text file encoding..? Allgemeine Java-Themen 36
B UTF-8 Text Allgemeine Java-Themen 3
H Passwortgschützter Text Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben