# Nummerierung eines String



## Dexta (28. Mrz 2007)

Hallo,

im folgenden Quellcode habe ich den String "Screenshot.jpeg" gesplittet, so dass am Ende jeweils einen String "Screenshot" und einen String ".jpeg" entsteht. Das hat bisher auch wunderbar geklappt. Nun kau ich mir schon Stunden die Fingernägel ab, weil ich es einfach nicht hinbekomme, eine Schleife zu erstellen, die z.B. 10 Screenshots.jpeg ausgeben soll. Jedoch soll zwischen dem ersten String DatnamePart ("Screenshot") und dem zweiten String DatnamePartEnde (".jpeg") hochnummeriert werden. Also im Endeffekt soll mir die Konsole das ausgeben:

Screenshot.jpeg
Screenshot_1.jpeg
Screenshot_2.jpeg
Screenshot_3.jpeg
....
Screenshot_10.jpeg

Hierzu mein Testprogramm für den Ablauf...


```
public class SubStringDemo {
		
	public static void main (String[] args) {	
		
		String screenName = "Screenshot.jpeg";
		String screenEnde = ".jpeg";
		String DatnamePart = "";

		int iPos = screenName.lastIndexOf(".");
		
		String saParts[] = screenName.split("\\.");
		
		if (saParts.length == 1){
			System.out.println("Ungültiger Dateiname!");
		}
		
		// Schleife zum ermitteln der Zeichen bis zum letzten Punkt "." (-1
		for (int i = 0; i < saParts.length-1; i++){
			DatnamePart = new String(DatnamePart.concat(saParts[i] + "."));	
		}
		
		// Erstellt neuen String für die Ausgabe der Dateiendung
		String DatnamePartEnde = "." + saParts[1];
		
		// Gibt den momentan Wert der DatnamePart aus...	
//		System.out.println(DatnamePartEnde);		
		
		DatnamePart.compareTo(screenEnde);
		
		if(DatnamePartEnde.equals(screenEnde)) {
			DatnamePartEnde = DatnamePartEnde.substring(0, DatnamePartEnde.length());				
			System.out.println("Die gewünschte Zeichenkette ist: " + DatnamePartEnde);				
		}
		else {
			System.out.println("Die gewünschte Zeichenkette konnte nicht gefunden werden! (" + DatnamePart + ")");
		}

// Stelle für den Code zur Hochnummerierung ...
			
	}	
}
```

Für mögliche Lösung wäre ich sehr dankbar!


----------



## mikachu (28. Mrz 2007)

Hi,
du nimmst dir einfach den String mit dem Dateinamen ohne Endung und hängst eine Zahl dran.

Pseudocode:

```
für i von 0 bis einschließlich 10
{
    Dateiname = Dateiname_ohne_Endung + "_" + i + Endung
    gib Dateiname auf Konsole aus
}
```

#edit
wenn man eine Zahl an einen String anhängen will, kann man einfach schreiben
String = String + Zahl


----------



## Dexta (28. Mrz 2007)

Ok, erstmal danke für die schnelle Antwort. Das hab ich mal gerade total vercheckt.


```
for (int i = 0; i < 11; i++) {
			String neuerDatName = DatnamePart + "_" + i + DatnamePartEnde; 
			System.out.println(neuerDatName);
		}
```

Im eigentlich war aber mein Anliegen ein ganz anderes, nur in dem ganzen Rumprobieren hab ich das wesentliche
schon wieder vergessen, was eigentlich am Ende bei herauskommen soll.

Denn jetzt geht es tatsächlich um Screenshots machen. Das funktionert auch gut und er speichert die Datei auch auf den vorgegeben Pfad ab. Aber jetzt stell ich mir folgendes Szenario vor. Was ist, wenn der zweite Screenshot, der abgespeichert werden, ebenfalls heißt wie der erste Screenshot. Er darf dann natürlich nicht einfach überschrieben werden!

Also muss überprüft werden, bevor der zweite Screenshot geschrieben wird, ob ein vorhandener Screenshot in diesem Pfad schon so heißt.

Jetzt weiß ich leider nur nicht, wie die oben schon angesprochene Schleife so implementiert werden soll,
das bei einen doppelt vorkommenden Dateinamen am Ende (vor dem ".jpeg") um eine Nummer hochgezählt werden soll.

In dem unten genannten Code ist natürlich jetzt das Problem, dass die Datei 10mal geschrieben wird, und bei einem zweiten Durchlauf die bestehende Datei ebenfalls wieder 10mal überschrieben wird... (Zeile 55)

Wie geh ich jetzt am besten die Lösung an?


```
public class TakeScreenshot implements ITakeScreenshot {
	
	private String outFileName;
	
	public String doCapture() throws IOException {	
		
		String screenPfad = "C:\\Temp\\";
		String screenName = getCurFileName();
		String screenEnde = ".jpeg";		
		String DatnamePart = "";
		
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Dimension screenSize = toolkit.getScreenSize();
		Rectangle screenRect = new Rectangle(screenSize);
		
		int scPos = screenName.indexOf(".");		
		String saParts[] = screenName.split("\\.");
		
		if (saParts.length == 1){
			return null;
		}		
		
		// Schleife zum zum generieren der Zeichen bis zum "."
		for (int i = 0; i < saParts.length -1; i++){
			DatnamePart = DatnamePart.concat(saParts[i]);
//			DatnamePart = DatnamePart.concat(".");
		}
						
//		Erstellt neuen String für die Ausgabe der Dateiendung
		String DatnamePartEnde = "." + saParts[1];
		
		DatnamePartEnde.compareTo(screenEnde);
		DatnamePart.compareTo(screenName);
		
		System.out.println(DatnamePart);
		
		Robot robot = null;
		
		try { robot = new Robot();} 		
		catch (AWTException e) {e.printStackTrace();}
		
		// Screenshot wird gemacht vom aktuellen Oberflächenzustand...
		BufferedImage image = robot.createScreenCapture(screenRect);	
	
		 // Beginn der Schleifen zur Überprüfung der richtigen Dateinendung und doppelt
		// vorkommenden Dateinamen...

		if(DatnamePartEnde.equals(screenEnde)) {
			DatnamePartEnde = DatnamePartEnde.substring(0, DatnamePartEnde.length());				
			System.out.println("Die gewünschte Zeichenkette ist: " + DatnamePartEnde);
			
			if(outFileName.equals(screenName)) {
				for (int i = 0; i < 11; i++) {
// Schleife zum hochnummerien falls Dateiname doppelt....	
					DatnamePart = DatnamePart.substring(0, DatnamePart.length());
					ImageIO.write(image, "jpeg", new File(DatnamePart + "_" + i + DatnamePartEnde));
					System.out.println("Selber Dateiname ist vorhanden. Datei wird umbenannt und hochnummeriert");
					}
				}
			else {				
				ImageIO.write(image, "jpeg", new File(screenName));
				System.out.println("Datei ist nicht vorhanden und wird neu angelegt");								
				}
			}
			else {
				System.out.println("Die gewünschte Zeichenkette konnte nicht gefunden werden! (" + DatnamePart + ")");
				}
		
		return screenName;
		}

	// generiert das Datum + den Namen "Screenshot" der Datei
	private String getCurFileName() {
		
		Date heute;
		SimpleDateFormat Datumsformat;		
		heute = new Date();
		Datumsformat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
		
		String datum = Datumsformat.format(heute);		
		String	outFileName = "Screenshot.jpeg";
		
// 		fügt dem Datum ein "_" sowie den Dateinamen "Screenshot.jpeg" hinzu
		datum = datum + "_";		
		datum = datum + this.outFileName;
		
		return outFileName;
	}	
	
	public TakeScreenshot(String FileName) {
		this.outFileName = FileName;
	}
}
			
interface ITakeScreenshot {
	public String doCapture() throws IOException;	
}
```

Die Methode getCurFileName() gibt absächlich den Wert outFileName zurück, da ich nur so das Szenario eines doppelt vorkommenden Namen testen kann. Normalerweise wird dort sonst datum stehen....

Ich hoffe mein Anliegen ist verständlich rübergebracht?


----------



## Dexta (28. Mrz 2007)

So, nochmal ne Ladung Gehirnschmalz verbraucht und da bin ich doch noch auf die Lösung gekommen. Wie schnell das manchmal doch noch klappen kann, obwohl man schon so lange daran getüfftelt hat...

Also, die Lösung zum Nummerieren...


```
int zaehler = 0;
		
		// Suche solange nach einem eindeutigen Dateinamen,
		// bis
		// entweder : zaehler ist größer 10
		// oder : eindeutiger Dateiname wurde gefunden
		while (zaehler < 11 && new File(DatnamePart + "_" + zaehler + DatnamePartEnde).exists()){
			zaehler++;
			System.out.println(DatnamePart + "_" + zaehler + DatnamePartEnde);
		}		
		if (zaehler == 11){
			return null;
		}
		
		String DatnameNeu = DatnamePart + "_" + zaehler + DatnamePartEnde;
		
		// Datei schreiben und Dateinamen zurückgeben		
		// Beginn der Schleifen zur Überprüfung der richtigen Dateinendung und doppelt
		// vorkommenden Dateinamen...
		if(DatnamePartEnde.equals(screenEnde)) {
			DatnamePartEnde = DatnamePartEnde.substring(0, DatnamePartEnde.length());				
			System.out.println("Die gewünschte Zeichenkette ist: " + DatnamePartEnde);
			
			if (zaehler != 11) {
				ImageIO.write(image, "jpeg", new File(DatnamePart + "_" + zaehler + DatnamePartEnde));
				System.out.println("Selber Dateiname ist vorhanden. Datei wird umbenannt und hochnummeriert");				
			}
			else {				
				ImageIO.write(image, "jpeg", new File(screenName));
				System.out.println("Datei ist nicht vorhanden und wird neu angelegt");								
			}	
		}		
		else {
			System.out.println("Die gewünschte Zeichenkette konnte nicht gefunden werden! (" + DatnamePart + ")");
		}
		return DatnameNeu;
```

greetz Dexta


----------



## mikachu (28. Mrz 2007)

Siehste :wink:, selber nachdenken löst doch auch Probleme ^^.

Aber noch nen anderer Gedankenansatz.
Im Konstruktor, oder beim initialisieren, kannst du ja die schon höchste Laufnummer für Dateien ermitteln, falls schon Dateien existieren.

Somit könntest du dir wieder ein paar if's sparen.


----------

