Im String nach Zeilenumbruechen suchen

Hallo zusammen,

ich bin echt am verzweifeln…

Ich habe ein StringBuffer und versuche die Zeilenumbrueche aus einem Teilsteuck davon zu zaehlen.

Ich habe schon versucht mit sb.Substring oder sb.CharSequence die Subsequence zu erzeugen und darin auf „\n“ zu vergleichen. Sowohl die Methode indexOf() von String und StringBuffer findet „\n“ nicht.

Dann habe ich veruscht mit einem Regulaeren Ausdruck „\n“ den Substring zu matchen und er findet weider nichts.

Kann es sein, dass beim erzeugen des Strings die lineBreaks irgendwie verlorebn gehen?

Zum Kontext: Ich lese eine .java Datei ein die mir dann spaeter in einem StringBuffer vorliegt. Darin sind auf jeden Fall die LineBreaks noch enthalten.

Waere super dankbar fuer eine Antwort.

Gruesse,

Michael

Moien

Zum Kontext: Ich lese eine .java Datei ein die mir dann
spaeter in einem StringBuffer vorliegt. Darin sind auf jeden
Fall die LineBreaks noch enthalten.

Hast du es mal mit der Property „line.separator“ aus System.getProperties probiert ?

Kannst du den aktuellen Code zum einlesen der Datei und zum suchen nach den newlines mal posten ?

cu

Hallo Michael.

Ich habe ein StringBuffer und versuche die Zeilenumbrueche aus
einem Teilsteuck davon zu zaehlen.

Sowohl die Methode indexOf() von String und StringBuffer
findet „\n“ nicht.

Der Zeilenumbruch ist vom Betriebssystem abhängig
und daher immer ein besonderes Ärgernis bei der Programmierung :wink:

Je nachdem, unter welchem Betriebssystem die Datei erstellt
oder verändert wurde, musst Du bei der Suche also nach einem
anderen Zeilenumbruch suchen.

Zur Verdeutlichung ein bisschen Spielcode ’ StringTest.java’:

import java.util.Iterator;
import java.util.Vector;

public class **StringTest** {
 // constants:
 final static String LINEFEED = "\012";
 final static String CARRIAGE\_RETURN = "\015";

 final static String UNIX\_NEWLINE = LINEFEED;
 final static String DOS\_NEWLINE = CARRIAGE\_RETURN + LINEFEED;
 final static String MAC\_NEWLINE = CARRIAGE\_RETURN;
 final static String SYSTEM\_NEWLINE = System.getProperty("line.separator");

 // methods:
 public static String **determineNewlineType** (String sNewline) {
 String sNewLineType = "UNKNOWN";
 if (UNIX\_NEWLINE.equals(sNewline)) {
 sNewLineType = "UNIX";
 } else if (DOS\_NEWLINE.equals(sNewline)) { 
 sNewLineType = "DOS";
 } else if (MAC\_NEWLINE.equals(sNewline)) {
 sNewLineType = "MAC";
 }
 if (SYSTEM\_NEWLINE.equals(sNewline)) {
 sNewLineType += " (=system default)";
 }
 return sNewLineType;
 }

 public static String **determineCurrentNewlineType** () {
 String sNewlineType = determineNewlineType(System.getProperty("line.separator"));
 System.out.println("Current OS '" + System.getProperty("os.name") + "' uses " + sNewlineType + " newlines");

 return sNewlineType;
 }

 public static int **getNumberOfNewLines** (StringBuffer sb, String sNewline) {
 // check argument:
 if (sb == null || sb.length() testNewlineSearch(StringBuffer sb, String sTest, String sNewlineToSearch) {
 String sNewlineType = determineNewlineType(sNewlineToSearch);
 int iCount = getNumberOfNewLines(sb, sNewlineToSearch);
 System.out.println("\*\*\* " + sTest + " searching for " + sNewlineType + " newlines: " + iCount);
 }

 public static void **main** (String[] args) {
 determineCurrentNewlineType();
 System.out.println("'LF' = " + determineNewlineType(UNIX\_NEWLINE));
 System.out.println("'CRLF' = " + determineNewlineType(DOS\_NEWLINE));
 System.out.println("'CR' = " + determineNewlineType(MAC\_NEWLINE));
 System.out.println("'\\n' = " + determineNewlineType("\n") + "\n");

 Vector vecNewlines = new Vector();
 vecNewlines.add(UNIX\_NEWLINE);
 vecNewlines.add(DOS\_NEWLINE);
 vecNewlines.add(MAC\_NEWLINE);

 for (Iterator iterator = vecNewlines.iterator(); iterator.hasNext(); ) {
 String sNewlineToSearch = (String)iterator.next();

 String sTest = "Text with UNIX newlines";
 StringBuffer sb = new StringBuffer();
 sb.append("Zeile1").append(UNIX\_NEWLINE);
 sb.append("Zeile2").append(UNIX\_NEWLINE);
 sb.append("Zeile3").append(UNIX\_NEWLINE);
 testNewlineSearch(sb, sTest, sNewlineToSearch);

 sTest = "Text with DOS newlines";
 sb = new StringBuffer();
 sb.append("Zeile1").append(DOS\_NEWLINE);
 sb.append("Zeile2").append(DOS\_NEWLINE);
 sb.append("Zeile3").append(DOS\_NEWLINE);
 testNewlineSearch(sb, sTest, sNewlineToSearch);

 sTest = "Text with MAC newlines";
 sb = new StringBuffer();
 sb.append("Zeile1").append(MAC\_NEWLINE);
 sb.append("Zeile2").append(MAC\_NEWLINE);
 sb.append("Zeile3").append(MAC\_NEWLINE);
 testNewlineSearch(sb, sTest, sNewlineToSearch);

 System.out.println("");
 }
 }
}

Ergibt bei mir nach Kompilation und Ausführung:

Current OS 'Windows XP' uses DOS (=system default) newlines
'LF' = UNIX
'CRLF' = DOS (=system default)
'CR' = MAC
'\n' = UNIX

\*\*\* Text with UNIX newlines searching for UNIX newlines: 3
\*\*\* Text with DOS newlines searching for UNIX newlines: 3
\*\*\* Text with MAC newlines searching for UNIX newlines: 0

\*\*\* Text with UNIX newlines searching for DOS (=system default) newlines: 0
\*\*\* Text with DOS newlines searching for DOS (=system default) newlines: 3
\*\*\* Text with MAC newlines searching for DOS (=system default) newlines: 0

\*\*\* Text with UNIX newlines searching for MAC newlines: 0
\*\*\* Text with DOS newlines searching for MAC newlines: 3
\*\*\* Text with MAC newlines searching for MAC newlines: 3

Gruß,
-Andreas.