File Seperator unter verschiedenen OS

BlubBlub

Bekanntes Mitglied
Hi ich möchte eine Datei in ein anders Verzeichnis kopieren.
Dazu verwende ich folgenden Code:

Java:
String filename = file.getAbsolutePath(); //unter windows7 z.B. "C:\Users\Ich\Documents\MeinBild.jpg"
File inF = new File(filename);
				File outF = new File("PICTURES\\pictrash.jpg");
				if(!outF.exists())
				{
					try
					{
						outF.createNewFile();
					}
					catch (IOException e)
					{
						e.printStackTrace();
					}
				}
				
		
				FileChannel inChannel = null;
			    FileChannel outChannel = null;
				try
				{
					inChannel = new FileInputStream(inF).getChannel(); //Exception wird geworfen falls  "C:\Users\Ich\Documents\MeinBild.jpg" anstelle von " "C:\\Users\\Ich\\Documents\\MeinBild.jpg" unter Windows
					outChannel = new FileOutputStream(outF).getChannel();
					inChannel.transferTo(0, inChannel.size(), outChannel);
				}
				catch (FileNotFoundException e1)
				{
					e1.printStackTrace();
				}
			    catch (IOException e) 
			    {
			        e.printStackTrace();
			    }
			    finally 
			    {
			        if(inChannel != null)
			        {
			        	try
			        	{
			        		inChannel.close();
			        	}
			        	catch (IOException e)
			        	{
			        		e.printStackTrace();
			        	}
			        }
			        
			        if(outChannel != null)
			        {
			        	try
			        	{
			        		outChannel.close();
			        	}
			            catch(IOException e)
			            {
			            	e.printStackTrace();
			            }
			        }
			    }

Ich habe nun ein Problem mit den File Seperatoren.
Wenn ich unter Windows 7 eine Datei habe und mir über file.getAbsolutePath() den Pfad hole erhalte ich den Namen in dieser Form: C:\Users\Ich\Documents\MeinBild.jpg

Dadurch kommt es bei der Ausführung von
inChannel = new FileInputStream(inF).getChannel();
zu einer Exception. Dies liegt an dem File Seperator.
Wenn anstelle von
C:\Users\Ich\Documents\MeinBild.jpg

dies hier steht:
C:\\Users\\Ich\\Documents\\MeinBild.jpg oder C:/Users/Ich/Documents/MeinBild.jpg
dann funktioniert alles bestens.

Das Problem: Wie forme ich den Pfadnamen den ich über file.getAbsolutePath() immer so
automatisch um, dass mir FileInputStream(inF).getChannel() keine Exception schmeißt.
Dies soll aber auf allen Betriebssystem funktionieren.


Für Windows könnte ich filename.replace('\', '\\') aufrufen.
Bei Linux müsste ich denk ich nichts ändern.
Und für Macs und andere Betriebssysteme, weiß ich grad nicht wie ich da was ändern müsste.
Allerdings müßte ich dann auch im Code abfragen um welches Betriebssystem es sich handelt um eine
korrekte Ersetzung machen zu können. Doch das erscheint mir irgendwie hässlich, mal abgesehen davon dass ich grad spontan auch nicht weiß, ob das einfach so möglich ist.

filename.replace('\', File.separator);
würde aus zwei Gründen nicht funktionieren.

(Problem mit dem ersten Parameter der der Methode replace übergeben wird)
zum einen habe ich beim ersten Parameter jetzt einfach gesagt ersetze mir '\' durch File.Seperator. Der erste Parameter '\' wäre aber nur unter Windows richtig, denn auf anderen Betriebssystemen würde ich über file.getAbsoulutePath() einen String erhalte der andere Seperatoren verwendet.
Also muss ich den ersten Parameter bei replace() dynamisch setzen.
Doch wie erfahre ich welche Seperatoren in file.getAbsoulutPath() String verwendet werden um diese als ersten Parameter der Methode replace übergeben zu können.

(Problem mit dem zweiten Parameter der der Methode replace übergeben wird)
Der Zweite Grund wieso dies nicht funktioniert ist, dass ich bei Windows 7 zum Beispiel mit File.seperator '\' erhalte. Doch im zweiten Parameter bei replace müßte '\\' oder '/' damit alles korrekt funktioniert.
 
Interessant wäre woher kommt
Code:
file
und warum erstellst Du wenn Du bereits ein File Objekt hast über dessen AbsolutPath ein neues File-Objekt statt das bestehende zu verwenden?
Wenn da keine manuelle Eingabe/Codierung im Spiel ist, sollte es funktionieren.
Die Maskierung von Backslashes ist nur bei direkter Eingabe im Code notwendig. Wenn eine Methode einen String mit Backslashes liefert ist das für's Programm nicht relevant.

#####EDIT#####
Soll heißen, der in der Variable
Code:
file
hinterlegte Pfad ist bereits falsch. Lass doch einfach mal
Code:
file.getAbsolutePath()
auf der Konsole ausgeben.
 
Zuletzt bearbeitet:
Der Code hier stellt nur einen Teil meines gesamten Codes.
Den Pfadnamen habe ich aus einer xml Datei ausgelesen und in einem Objekt
gespeichert. Dieses Objekt beinhaltet ein Attribut String filename.
Nun hole ich den Pfandname aus dem Attribut und erzeige ein new File(filename).

Ich hab grad noch ein wenig weiter geschaut im Forum:
java-forum
Dort steht man kann durch Verwendung eines "/" plattformunabhänigkeit gewährleisten.
Somit sollte also laut den dortigen Aussagen auf windos, unix und mac diese Pfadangabe funktionieren "mein/pfad/ist/plattformunabhängig"
 

Zurück
Oben