Dateinamen mit laufender Nummer erzeugen! Wie?

Status
Nicht offen für weitere Antworten.
A

Adrian

Gast
Hallo,

ich hab mal wieder ein Problem und komm nicht weiter. Hab leider keine Ahnung wie ich das lösen soll, da es meine momentane
Programmierkenntnisse dieser Art übersteigt. Eine Suche blieb leider auch erfolglos.

Und zwar soll nach Klick auf Speichern eine Datei in einem vorgegebenen Verzeichnis (D:\DATEN) erstellt werden.
Der Dateinamen ist folgendermaßen zusammengesetzt: DATEN00.TXT Wobei "DATEN" immer im Dateinamen stehen soll und die 2 Zeichen "00" eine laufende Nummer darstellten. Die Nummer darf von "00" bis "99" laufen ("100" ist nicht mehr erlaubt).

Um die Problematik zu verdeutlichen möchte ich kurz einige Beispiele erläutern.
1.
Wenn eine Datei (DATEN00.TXT) als einzige im Verzeichnis liegt soll der nächste Dateinamen "DATEN01.TXT" vergebenwerden usw.

2.
Falls bspw. zwei oder mehr Dateien (DATEN00.TXT, DATEN01.TXT, DATEN03.TXT) bereits im Verzeichnis liegen, soll die nächste Datei mit DATEN02.TXT abgespeichert werden. Diese reihen sich sozusagen in die vorhandene Folge ein.

3.
Bei folgender vorhandener Konstellation im Verzeichnis: (DATEN02.TXT, DATEN4.TXT, DATEN06.TXT) soll folglich wieder bei DATEN00.TXT begonnen werden. Und mit DATEN01.TXT, DATEN03.TXT, DATEN05.TXT weitergemacht werden.

Welche Anpassungen am Code wären notwendig um das zu realisieren?


Ich hoffe ihr könnt mir helfen.

Vielen Dank!

Gruß
Adrian


Code:
if(e.getSource().equals(speichern))
		{ 
		System.out.println(" \"SPEICHERN\" geklickt.");    		
    			    
    		String directoy = ("D:\\DATEN\\");
    				        				    
    				    	File dir = new File(directoy);
    				    	
	    				    if (dir.exists())
	    				    {	
	    				        System.out.println(dir + "  Verzeichnis existiert.");}
	    				    else
	    				    {
	    				        dir.mkdir();
		    				    System.out.println("Verzeichnis: " + dir + "  erstellt.");
	    				    }

    		    	   try {	
    		    	   				
    			String dateiname = (directoy+"DATEN00.TXT");  //00 Laufenden Nummer mit 2 Zeichen, bis 99 erlaubt
			      File datei = new File(dateiname);

    			 boolean success = datei.createNewFile();
    				if (success) {
    				    	          	System.out.println(datei + "  Datei existiert nicht.");
    				    	          	
    				    	          	try{		    				    			
						    		if (datei.exists())
						    		 {  
						    	             System.out.println(datei+ "  Datei existiert.");} 				   
						    	        else
						    		    				    {  
						    			    				   System.out.println(datei + "  Datei existiert nicht.");
						    		    				    }
								    				        
								    				        
								    				        
								    				        FileOutputStream fout = new FileOutputStream(datei);
								    				        OutputStreamWriter osw = new OutputStreamWriter(fout, "UTF-8");
								    				        BufferedWriter out = new BufferedWriter(osw);
						
										    						out.newLine();
										    						out.write("----------------------------------");
										    						out.newLine();
										    						out.write("Daten");
										    						out.newLine();
										    						out.write("----------------------------------");
										    						out.close();
										    						System.out.println(datei + "  erfolgreich gespeichert!");
										    				  } 
										    				    catch (IOException e){
											    			}
    				    	        } 
    				    	        
    				    	        else {
    				    	        	System.out.println(datei+ "  Datei existiert.");}
    				    		}
    				    		catch (IOException e) {
    				   		}
	 
}
P
 

anfänger15

Bekanntes Mitglied
Um ein Dateiname mit laufender nummer zu erzeugen musst du einfach nur eine Variable hochzählen bsp.
Code:
for(int f=0;f<100;f++){
"Daten"+f+".TXT"
}


ist natürlich kein compilierbares beispiel soll nur meine Antwort verdeutlichen :D
 
S

SlaterB

Gast
mit jeder Nummer ein File erzeugen und prüfen ob schon vorhanden,
du könntest auch die Dateinamen der bereits vorhandenen Dateien einlesen und deren Nummern extrahieren,

wenn du aber eh jede Nummer einzeln prüfen musst, macht das wohl wenig Unterschied,

---------

wenn es aber schon 10.000 Dateien gibt, wäre es praktisch, die Dateinamen einzulesen, zu sortieren, die höchste Nummer auszulesen und diese weiterzuverwenden,
allerdings auch ein Riesenaufwand, besser die höchste Nummer separat speichern
 

Kim Stebel

Bekanntes Mitglied
private static File getNextFile(String d)
{
File dir = new File(d);
String [] files = dir.list();
Set<String> fileSet = new HashSet<String>();
for (String str : files) fileSet.add(str);
int i;
for (i=0;i<100;i++)
{
if (!fileSet.contains("DATEN" + i/10 + "" + i%10 + ".TXT"))
return new File(d + "DATEN" + i/10 + "" + i%10 + ".TXT");
}
return null;
}
 
A

Adrian

Gast
Hallo Kim,

vielen Dank für deinen Vorschlag. Ich steh aber momentan total auf dem Schlauch. Ich weiss net so recht wie ich das Ganze in meinen Code unterbringen soll.
So wie ich das verstanden habe soll die actionPerformed Funktion verlassen werden. Der Dateiname wird an getNextFile übergeben, das Verzeichnis durchsucht und der neue Dateiname für den FileOutputStream generiert.

Liege ich da komplett falsch?

Hab folgendes versucht: siehe Code. Aber das will irgendwie nicht funktionieren. Habt ihr oder du vielleicht ne Idee woran es liegen könnte?


Danke.

Gruß
Adrian


Code:
private final File getNextFile(String datei)
  	{
  	
  	File dir = new File(datei); 
  	String [] files = dir.list();
  	System.out.println(files);  
  	Set <String> fileSet = new HashSet <String>();
  	
  	for (String str : files) fileSet.add(str); //Compilermeldung: at M2P2.getNextFile(Daten.java:311)
	  	
  		int i;
	  	for (i=0;i<100;i++)
	  						{
	  	if (!fileSet.contains("DATEN" + i/10 + "" + i%10 + ".TXT"))
	  	
	  	return new File(datei + "DATEN" + i/10 + "" + i%10 + ".TXT");
	  	}
  	return null;
  	}
	
public void actionPerformed(ActionEvent e)
	{
		if(e.getSource().equals(mi6))
		{ 
		            	System.out.println(" \"SPEICHERN\" geklickt.");    		
    				    
    				    	String directoy = ("D:\\DATEN\\");
    				        				    
    				    	File dir = new File(directoy);
    				    	
	    				    if (dir.exists())
	    				    {	
	    				        System.out.println(dir + "  Verzeichnis existiert.");}
	    				    else
	    				    {
	    				        dir.mkdir();
		    				    System.out.println("Verzeichnis: " + dir + "  erstellt.");
	    				    }
	    				    		String dateiname = (directoy+"DATEN00.TXT");  //** Laufenden Nummer mit 2 Zeichen
    				    			
	    				    		File datei = new File(dateiname);
	    				    		getNextFile(dateiname); // Compilermeldung: at Daten.actionPerformed(Daten.java:345)
	
    				    	          	try{		    				    			
		    				    			if (datei.exists())
		    		    				    {  
		    				    			   
		    		    				       System.out.println(datei+ "  Datei existiert.");} 				   
		    				    			else
		    		    				    {  
		    				    				//getNextFile(dateiname);
		    				    				System.out.println(datei + "  Datei existiert nicht.");
		    		    				    
				    				        
				    				        
				    				        
					    				        FileOutputStream fout = new FileOutputStream(datei);
					    				        OutputStreamWriter osw = new OutputStreamWriter(fout, "UTF-8");
					    				        BufferedWriter out = new BufferedWriter(osw);
		
						    						out.newLine();
						    						out.write("----------------------------------");
						    						out.newLine();
						    						out.write("Daten");
						    						out.newLine();
						    						out.write("----------------------------------");
						    						out.close();
						    						System.out.println(datei + "  erfolgreich gespeichert!");
		    		    				    	}
						    				  } 
						    				    catch (IOException e){
							    			}
    				   		}


Compilerausgabe:

"SPEICHERN" geklickt.
D:\DATEN Verzeichnis existiert.
null
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at M2P2.getNextFile(Daten.java:311)
at M2P2.actionPerformed(Daten.java:345)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1216)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1257)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
 

Kim Stebel

Bekanntes Mitglied
Nee du musst an getNextFile nur das Verzeichnis, in dem die Daten-Dateien gespeichert werden, als String übergeben. Zurück bekommst du ein File-Objekt für die neu zu erstellende Datei.
 
A

Adrian

Gast
Hallo Kim,

das hab ich jetzt gemacht. Ich übergebe nun mit

Code:
getNextFile(directoy);

das Verzeichnis.

Code:
private static File getNextFile(String datei)
  	{
  	
  	File dir = new File(datei); 
  	String [] files = dir.list();
  	System.out.println("Test1: "+ dir);  
  	Set <String> fileSet = new HashSet <String>();
  	
  	for (String str : files) fileSet.add(str);
	  	
  		int i;
	  	for (i=0;i<100;i++)
	  						{
	  	if (!fileSet.contains("DATEN" + i/10 + "" + i%10 + ".TXT"))
	  	
	  	return new File(datei + "DATEN" + i/10 + "" + i%10 + ".TXT");
	  	System.out.println("Test2: " +datei);
	  	}
  	return null;
  	}

Ausgabe:

"SPEICHERN" geklickt.
D:\DATEN Verzeichnis existiert.
Test1: D:\DATEN
Test2: D:\DATEN\

Wie bekomm ich aber das neue File-Objekt für den FileOutputStream wieder zurück?

Danke.

Gruß
Adrian
 
A

Adrian

Gast
Hallo Kim,

es funktioniert wunderbar. Vielen Dank. Mein Fehler lag im im Methodenaufruf. Aber leider muss ich gestehen, dass ich überhaupt nicht nachvollziehen kann wie die Methode genau arbeitet.

Wäre es möglich, dass du mir erläuterst wie die Methode vorgeht? Vor allem würden mich Zeile 7 bis 16 brennend interessieren.

Vielen Dank!

Gruß
Adrian


Code:
//Methodenaufruf
File datei = getNextFile(directoy);


Code:
private static File getNextFile(String datei)
  	{
  	
  	File dir = new File(datei); 
  	String [] files = dir.list();
  	
        Set <String> fileSet = new HashSet <String>();
  	  	
  	for (String str : files) fileSet.add(str);
  	
  		int i;
	  	for (i=0;i<99;i++)
	  						{
	  	if (!fileSet.contains("DATEN" + i/10 + "" + i%10 + ".TXT"))
	  	
	  		return new File(datei + "DATEN" + i/10 + "" + i%10 + ".TXT");
	  	}
  	return null;
  	}
 

Kim Stebel

Bekanntes Mitglied
Hast du dir mal die Javadocs zu Set und HashSet angeguckt? Set ist ein Interface, dass die üblichen Operationen auf Mengen zur Verfügung stellt. Also add, contains....HashSet implementiert dieses Interface. Das mit dem HashSet mache ich nur, weil man sonst in der for-Schleife noch eine for-Schleife bräuchte, um zu sehen, ob DateiXY.TXT im array ist. So reicht "!fileSet.contains(...)" Ansonsten hab ich mal ein paar Kommentare drangeschrieben.

Code:
private static File getNextFile(String datei) 
{ 
  File dir = new File(datei); //erzeugt neues File-Objekt für das Verzeichnis.
  String [] files = dir.list(); //liest alle Dateinamen des V. in ein Array.
  Set <String> fileSet = new HashSet <String>(); //Erzeugt neues HashSet, mit Strings als Elementen
  for (String str : files) fileSet.add(str); //Kopiert das Array in ein HashSet
  int i; 
  for (i=0;i<99;i++) 
  { 
    if (!fileSet.contains("DATEN" + i/10 + "" + i%10 + ".TXT")) //Wenn die Menge den Dateinamen noch nicht enthält
      return new File(datei + "DATEN" + i/10 + "" + i%10 + ".TXT"); //neues File-Objekt mit diesem Dateinamen zurückgeben
  } 
  return null; //Alle Dateiennamen(00-99) schon vorhanden? Pech gehabt...null zurückgeben
}
 
A

Adrian

Gast
Hallo Kim,

vielen Dank für das kommentieren der Zeilen. Ich habe mir gleich nach deiner ersten Antwort die Javadocs zu Set und HashSet angeschaut, allerdings nicht verstanden was die genau machen und dadurch selbst noch nicht anwenden. Darauf zielte auch meine Frage ab. Jetz ist mir das Ganze viel klarer und ich hab einiges dazugelernt, dank dir.

Gruß
Adrian
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
NightmareVirus Java-Editor (G. Röhner): Fehlende Dateinamen Java Basics - Anfänger-Themen 1
it_is_all For-Schleife - Dateinamen fortlaufende Nummer Java Basics - Anfänger-Themen 2
R Input/Output Dateinamen aus Verzeichnis in Datei schreiben Java Basics - Anfänger-Themen 3
H nio Pfad aus Dateinamen extrahieren Java Basics - Anfänger-Themen 4
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
L String wird nicht gespeichert / Probleme mit Dateinamen Java Basics - Anfänger-Themen 9
K Spezialzeichen in Dateinamen Java Basics - Anfänger-Themen 2
M Fileoutputstream: Linux Dateinamen mit Umlaute Java Basics - Anfänger-Themen 4
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
E Erste Schritte Verzeichnis auslesen, Dateinamen in Array speichern :-( Java Basics - Anfänger-Themen 7
S JFileChooser - Dateinamen vorschlagen/Inhalt der Ausgabe prüfen Java Basics - Anfänger-Themen 3
N JComboBox mit Dateinamen befüllen Java Basics - Anfänger-Themen 7
S Dateinamen in txt einfügen Java Basics - Anfänger-Themen 2
StrikeTom Wie ermittel ich alle dateinamen in einem Ordner Java Basics - Anfänger-Themen 2
C0FFEE Anwendung soll eigenen Dateinamen referenzieren Java Basics - Anfänger-Themen 13
M Filtern von Dateinamen Java Basics - Anfänger-Themen 7
F Dateinamen auslesen und in File speichern! Java Basics - Anfänger-Themen 3
J Dateinamen umbennen Java Basics - Anfänger-Themen 4
I viele Dateinamen in ein String-Array mit File().list() Java Basics - Anfänger-Themen 4
W Dateinamen einlesen und Liste in .txt-Datei ausgeben. Java Basics - Anfänger-Themen 2
J Dateinamen für Download ändern! Java Basics - Anfänger-Themen 3
C Dateinamen Filtern Java Basics - Anfänger-Themen 10
O JFileChooser Filter an Dateinamen hängen Java Basics - Anfänger-Themen 4
L Klassen und Dateinamen Java Basics - Anfänger-Themen 7
N Eindeutige Dateinamen generieren Java Basics - Anfänger-Themen 17
G Alle Dateinamen in ein Choice ausgeben Java Basics - Anfänger-Themen 2
M Leerzeichen in Dateinamen ein Problem ? Java Basics - Anfänger-Themen 4
D Dateinamen vervollständigen Java Basics - Anfänger-Themen 17
G Dateinamen aus einem Verzeichnis ausgeben Java Basics - Anfänger-Themen 3
G Dateinamen ohne Endung ausgeben Java Basics - Anfänger-Themen 4
J Dateinamen ermitteln Java Basics - Anfänger-Themen 3
B TableView: laufender Saldo mit BigDecimal? Java Basics - Anfänger-Themen 6
CT9288 Permanent laufender loop mit Eingabefunktion gesucht Java Basics - Anfänger-Themen 1
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
C Threads Auffindung noch laufender Programmteile Java Basics - Anfänger-Themen 2
S Objekte mit laufender Nummer erzeugen Java Basics - Anfänger-Themen 3
sserio Prüfziffer einer ISBN Nummer herrausfinden. Java Basics - Anfänger-Themen 14
A keine Ergebnisse - String nummer in array nummer converting Java Basics - Anfänger-Themen 1
S Nummer splitten Java Basics - Anfänger-Themen 2
M fortlaufende Nummer Java Basics - Anfänger-Themen 7
E ISBN Nummer mit boolean Java Basics - Anfänger-Themen 5
J Eindeutige Nummer (8 stellig) erzeugen Java Basics - Anfänger-Themen 9
G nach 9 - stelliger Nummer suchen Java Basics - Anfänger-Themen 7
M Druck mit fortlaufende Nummer Java Basics - Anfänger-Themen 6
W Methode um Nummer zu überprüfen. Java Basics - Anfänger-Themen 5
M Unbekannte Nummer bei Aufruf der toString Methode Java Basics - Anfänger-Themen 3
O String name mit fortlaufender Nummer Java Basics - Anfänger-Themen 14
J OOP Vergebene Objekt Nummer abgleichen falls einer entfernt wird ? Java Basics - Anfänger-Themen 5
M automatische laufende Nummer erzeugen Java Basics - Anfänger-Themen 10
J Gültigkeit einer ISBN Nummer prüfen! Java Basics - Anfänger-Themen 5
G Datenbank über Nummer, Daten bekommen Java Basics - Anfänger-Themen 4
M Fortlaufende Nummer Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben