Input/Output FileInputStream java.io.FileNotFoundException

purzel

Bekanntes Mitglied
Hallo Community,

ich arbeite das erste Mal mit einlesen und speichern von Dateien. Mein Problem:

Wenn ich eine Datei über FileInputStream einlesen will bekomme ich immer eine java.io.FileNotFoundException! Sobald ich aber die Datei mit Pfad angebe geht es, nur wenn ich die Datei über das Package laden will geht nix mehr 🙁

Wer kann mir einen Tipp geben?

Fehlermeldung:
java.io.FileNotFoundException: file:/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:120)
at java.io.FileInputStream.<init>(FileInputStream.java:79)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:76)
at java.lang.Thread.run(Thread.java:662)
Exception in thread "Thread-1" java.lang.NullPointerException
at japanisch_lernen.SelectInstallDirectory.<init>(SelectInstallDirectory.java:43)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:84)
at java.lang.Thread.run(Thread.java:662)

Mein Code (Auschnitt):
Java:
/*
* Datei kopieren
 */
FileInputStream fis = null;
try {
	fis = new FileInputStream(getClass().getResource("Files/meine_jp_schriftart.TTF").toString()); (geht nicht!)
	//fis = new FileInputStream("/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF"); (geht!)
} catch (FileNotFoundException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
}
 FileOutputStream fos = null;
try {
	fos = new FileOutputStream(new SelectInstallDirectory().getPath() + "/meine_jp_schriftart.TTF"); (geht nicht!)
	//fos = new FileOutputStream("/home/purzel/Desktop/meine_jp_schriftart.TTF"); (geht!)
} catch (FileNotFoundException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
}
...

Die Datei befindet sich im Package japanisch_lernen.Files! Sie ist auch im "bin"-Verzeichnis vorhanden!

Danke schon mal! 🙂

LG Purzel
 
Code:
/japanisch_lernen
fehlt davor
und man könnte auch
Code:
getResourceAsStream
statt
Code:
getResource
verwenden (jedenfalls beim einlesen)
 
Zuletzt bearbeitet:
Java:
fis = new FileInputStream(new File(getClass().getResource("japanisch_lernen/Files/meine_jp_schriftart.TTF").toURI()));
und so?

EDIT besser so:
Java:
fis = new FileInputStream(getClass().getResource("japanisch_lernen/Files/meine_jp_schriftart.TTF").getFile());
 
Zuletzt bearbeitet:
Java:
fis = new FileInputStream(new File(getClass().getResource("japanisch_lernen/Files/meine_jp_schriftart.TTF").toURI()));
und so?

EDIT besser so:
Java:
fis = new FileInputStream(getClass().getResource("japanisch_lernen/Files/meine_jp_schriftart.TTF").getFile());

Da bekomme ich das raus:
Exception in thread "Thread-1" java.lang.NullPointerException
at japanisch_lernen.InstallFont$2.run(InstallFont.java:80)
at java.lang.Thread.run(Thread.java:662)
 
Zuletzt bearbeitet:
und was steht in Zeile 80 ?

Da steht:

Java:
/*
* Datei kopieren
 */
FileInputStream fis = null;
try {
    //fis = new FileInputStream(getClass().getResource("Files/meine_jp_schriftart.TTF").toString());
    fis = new FileInputStream(getClass().getResource("japanisch_lernen/Files/meine_jp_schriftart.TTF").getFile());
    //fis = new FileInputStream("/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF");
} catch (FileNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace(); <-- Zeile 80!
}
 FileOutputStream fos = null;
try {
    fos = new FileOutputStream(new SelectInstallDirectory().getPath() + "/meine_jp_schriftart.TTF");
    //fos = new FileOutputStream("/home/purzel/Desktop/meine_jp_schriftart.TTF");
} catch (FileNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
 
kopiere mal den Ordner (mit allen Inhalten) Files direkt auf die Root deines Projektes Japanisch_lernen
und dann kannst du einfach mit [c]new File("./Files/meine_jp_schriftart.TTF")[/c] darauf zugreifen.
 
zum ersten der beiden Probleme:

immer ruhig und strukturiert vorgehen, kein Code beißt:
> fis = new FileInputStream(getClass().getResource("Files/meine_jp_schriftart.TTF").toString());

da ist eine Zwischenstufe doch [c]getClass().getResource("Files/meine_jp_schriftart.TTF").toString()[/c],
schau dir doch diesen String an!
du weißt außerdem dass der String "/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF"
funktioniert, und die Fehlermeldung gibt einen ähnlichen String aus,
man kann den Fehler eigentlich schon an der Fehlermeldung erkennen, aber bitte mal den String ausgeben und selber lernen
 
zum ersten der beiden Probleme:

immer ruhig und strukturiert vorgehen, kein Code beißt:
> fis = new FileInputStream(getClass().getResource("Files/meine_jp_schriftart.TTF").toString());

da ist eine Zwischenstufe doch [c]getClass().getResource("Files/meine_jp_schriftart.TTF").toString()[/c],
schau dir doch diesen String an!
du weißt außerdem dass der String "/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF"
funktioniert, und die Fehlermeldung gibt einen ähnlichen String aus,
man kann den Fehler eigentlich schon an der Fehlermeldung erkennen, aber bitte mal den String ausgeben und selber lernen

Zum ersteren:

Java:
FileInputStream fis = null;
😉 - oder meinst Du was anderes? ???:L

Zu 2.:


;(
 
keine Ahnung wo du inzwischen bist,
ich jedenfalls bezog mich auf den Anfang,

ohne Rätsel nun:
> getClass().getResource("Files/meine_jp_schriftart.TTF").toString()
liefert: "file:/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF"
genau das meckerte die Fehlermeldung im ersten Post auch an, das "file:" muss am Anfang weg,
das könnte manuell geschnippelt werden, aber auch erreicht werden indem getPath() statt toString() aufgerufen wird

wenn du inzwsichen ganz andere Ideen wie verschobenes Verzeichnis verfolgst, dann vielleicht nicht mehr so nützlich
 
keine Ahnung wo du inzwischen bist,
ich jedenfalls bezog mich auf den Anfang,

ohne Rätsel nun:
> getClass().getResource("Files/meine_jp_schriftart.TTF").toString()
liefert: "file:/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF"
genau das meckerte die Fehlermeldung im ersten Post auch an, das "file:" muss am Anfang weg,
das könnte manuell geschnippelt werden, aber auch erreicht werden indem getPath() statt toString() aufgerufen wird

wenn du inzwsichen ganz andere Ideen wie verschobenes Verzeichnis verfolgst, dann vielleicht nicht mehr so nützlich

Naja der Test war auf den ersten Post von mir bezogen! Ok, ich dachte dieses "file:" kommt nur in der Fehlerausgabe, aber nun bin ich etwas schlauer - Danke 🙂

PS: erhalte trotzdem noch eine NullPointerException! 🙁

€dit:

try-block: FileInputStream: java.io.FileInputStream@3f96ee
Exception in thread "Thread-1" java.lang.NullPointerException
at japanisch_lernen.SelectInstallDirectory.<init>(SelectInstallDirectory.java:43)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:86)
at java.lang.Thread.run(Thread.java:662)
 
Zuletzt bearbeitet:
ein
Code:
/
vor japanisch_lernen fehlt, dann sollte es funktionieren! (bezogen auf meinen letzten Vorschlag!)
 
@TR und SlaterB


Fehlermeldung:
try-block: FileInputStream: java.io.FileInputStream@3f96ee
Exception in thread "Thread-1" java.lang.NullPointerException
at japanisch_lernen.SelectInstallDirectory.<init>(SelectInstallDirectory.java:43)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:86)
at java.lang.Thread.run(Thread.java:662)

Code:
Java:
/* // Zeile 70
* Datei kopieren
 */
FileInputStream fis = null;
try {
    fis = new FileInputStream(getClass().getResource("/japanisch_lernen/Files/meine_jp_schriftart.TTF").getPath());
    System.out.println("try-block: FileInputStream: " + fis);
    //fis = new FileInputStream("/home/purzel/workspace/Japanisch_lernen/bin/japanisch_lernen/Files/meine_jp_schriftart.TTF");
} catch (FileNotFoundException e1) {
    // TODO Auto-generated catch block
    System.out.println("catch-block: FileInputStream: " + fis);
    e1.printStackTrace();
}
 FileOutputStream fos = null;
try {
    fos = new FileOutputStream(new SelectInstallDirectory().getPath() + "/meine_jp_schriftart.TTF");
    //fos = new FileOutputStream("/home/purzel/Desktop/meine_jp_schriftart.TTF");
} catch (FileNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
} // Zeile 90
 
Zuletzt bearbeitet:
vielleicht kannst du die Fehlermeldung nicht lesen, da übersetze ich sie dir:

> at japanisch_lernen.InstallFont$2.run(InstallFont.java:86)
spricht von Zeile 86 in dem von dir geposteten Code, noch halbwegs auffindbar

> at japanisch_lernen.SelectInstallDirectory.<init>(SelectInstallDirectory.java:43)
besagt dann klipp und klar, dass in einem Konstruktor ("<init>") von SelectInstallDirectory irgendwas schiefgeht, in Zeile 43

und die einzige Information die du also postest, ist der Aufruf new SelectInstallDirectory(),
die Klasse SelectInstallDirectory selber verschweigst du, wäre sie nicht extrem hiflreich?
 
Ah, Ok Danke, Ihr habt Recht! War ein Fehler von mir *schäm*

hier die Klasse "SelectInstallDirectory":

Java:
package japanisch_lernen;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * @author purzel
 *
 */
public class SelectInstallDirectory {
	File f = null;
	
	public SelectInstallDirectory() {		
		JFrame jframe = new JFrame("Select Installations Directory...");
		jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		jframe.setSize(500, 350); //Width, Height
		
		JPanel pane = new JPanel(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		
		JFileChooser filechooser = new JFileChooser();
		filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = filechooser.showOpenDialog(null);
        
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            f = filechooser.getSelectedFile();
            System.out.println(f.getPath());
        }
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 0; // Column
		c.gridy = 0; // Row
		c.gridwidth = 2;
		pane.add(new JLabel(f.getPath()), c);
		
		JButton okbtn = new JButton("OK");
		okbtn.addActionListener(new ActionListener() {
	        public void actionPerformed(ActionEvent arg0) {
	        	//closeFrame();
	        }
        });
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 1;
		pane.add(okbtn, c);
		
		jframe.add(pane);
		jframe.setVisible(true);
		jframe.dispose();
	}
	
	public String getPath() {
		return f.getPath();
	}
}

Angeblich hat er was mit dem
Code:
public String getPath() { return f.getPath(); }

Sorry!
 
das ist doch ein Riesenberg an neuen Informationen,
es öffnet sich also ein FileChooser in dem du etwas auswählst kurz vor der Execption?
wie kann man das denn verschweigen? 😉

anscheinend wählst du da komisch oder gar nicht aus, bist du dir da in der Bedienung sicher, hat das schon je irgendwo funktioniert?

oder kommt die Exception vor dem FileChooser, bist du dir mit der Zeile sicher?
du kannst vor Zeile 35 auch
System.out.println("fi ist: "+f);
schreiben, erscheint die Ausgabe "f ist: null"?

> Angeblich hat er was mit [Methode]
nein halt, die Exception tritt doch im Konstruktor auf? welche Zeile ist 43?

edit: wenn der FileChooser abgebrochen wird, bleib f natürlich für immer null und die Methode ist eine tickende Zeitbombe,
wie siehts also aus, was macht der FileChooser? Info über Info benötigt, ist doch alles eigentlich klar 😉
 
Zuletzt bearbeitet von einem Moderator:
das ist doch ein Riesenberg an neuen Informationen,
es öffnet sich also ein FileChooser in dem du etwas auswählst kurz vor der Execption?
wie kann man das denn verschweigen? 😉

anscheinend wählst du da komisch oder gar nicht aus, bist du dir da in der Bedienung sicher, hat das schon je irgendwo funktioniert?

oder kommt die Exception vor dem FileChooser, bist du dir mit der Zeile sicher?
du kannst vor Zeile 35 auch
System.out.println("fi ist: "+f);
schreiben, erscheint die Ausgabe "f ist: null"?

Na es kommt wie du schon richtig sagst, der FileChooser 🙂
Dann wähle ich ein Verzeichnis aus, klick auf Öffnen und komme zu dem vorherigen Fenster zurück.
Da steht dann: Install-Directory: /home/purzel/Desktop (habe ich mal testweise ausgewählt!)

Kann es sein das ihm der / am Ende vom Install-Directory fehlt? :rtfm:

Zeile 43 ist:
Code:
JButton okbtn = new JButton("OK");

Habe mal testweise alles was zum JFrame gehört auskommentiert, dann zeigt er folgende Zeile als Fehlerquelle an:

public String getPath() {
return f.getPath(); <-- FEHLER!
}
 
Zuletzt bearbeitet:
ich hab mein letztes Posting noch weiter editiert,
ich bin jetzt auch viel zu schnell,

im Grunde wieder ganz ruhig: was ist eigentlich der Fehler aktuell?, in welcher Zeile exakt, noch im Konstruktor oder später beim Methodenaufruf?.
was ist f usw., den ganzen Ablauf der Reihe nach verfolgen und den Fehlerzustand feststellen
 
Java:
 pane.add(new JLabel(f.getPath()), c);

Diese Zeile wird knallen. wahrscheinlich weil er im Filechooser "Abbrechen" gedrückt hat.
Den das System.out der ausgewählten Datei wird auch nicht ausgegeben!
 
ich hab mein letztes Posting noch weiter editiert,
ich bin jetzt auch viel zu schnell,

im Grunde wieder ganz ruhig: was ist eigentlich der Fehler aktuell?, in welcher Zeile exakt, noch im Konstruktor oder später beim Methodenaufruf?.
was ist f usw., den ganzen Ablauf der Reihe nach verfolgen und den Fehlerzustand feststellen

Edit siehe oben 😉

f ist der Filechosser, der Fehler kommt nach dem ich auf den Button installieren drücke bei der Klasse InstallFont (siehe ersten Post)
 
Java:
 pane.add(new JLabel(f.getPath()), c);

Diese Zeile wird knallen. wahrscheinlich weil er im Filechooser "Abbrechen" gedrückt hat.
Den das System.out der ausgewählten Datei wird auch nicht ausgegeben!

Nein, ich drücke Öffnen, bei Abbrechen kommt:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at japanisch_lernen.SelectInstallDirectory.<init>(SelectInstallDirectory.java:41)
at japanisch_lernen.InstallFont.<init>(InstallFont.java:52)
at japanisch_lernen.Help$1.actionPerformed(Help.java:41)
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.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6288)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Zeile 52 von InstallFont ist:

Code:
pane.add(new JLabel("Install-Directory: " + new SelectInstallDirectory().getPath()), c);
 
> f ist der Filechosser
f ist das File!
und wenn du abbrichst dann kommt der Fehler irgendwann bei Zugriff auf das File welches null ist,
ist ja klar, ist ja langweilig, wo immer das auch überall passiert, gibt ja anscheinend mehrere Stellen,

ansonsten noch ne Frage?
bitte alles nochmal neu sortieren und neu posten, der neue StackTrace ist ja ein ganz anderer, GUI-Code wird auskommentiert oder nicht usw..
 
Also:

habe mal die Gui auskommentiert, hier das Ergebnis:
Java:
package japanisch_lernen;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * @author purzel
 *
 */
public class SelectInstallDirectory {
	File f = null;
	
	public SelectInstallDirectory() {		
		/*JFrame jframe = new JFrame("Select Installations Directory...");
		jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		jframe.setSize(500, 350); //Width, Height
		
		JPanel pane = new JPanel(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();*/
		
		JFileChooser filechooser = new JFileChooser();
		filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = filechooser.showOpenDialog(null);
        
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            f = filechooser.getSelectedFile();
            System.out.println(f.getPath());
        }
		/*c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 0; // Column
		c.gridy = 0; // Row
		c.gridwidth = 2;
		pane.add(new JLabel(f.getPath()), c);
		
		JButton okbtn = new JButton("OK");
		okbtn.addActionListener(new ActionListener() {
	        public void actionPerformed(ActionEvent arg0) {
	        	//closeFrame();
	        }
        });
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 1;
		pane.add(okbtn, c);
		
		jframe.add(pane);
		jframe.setVisible(true);
		jframe.dispose();*/
	}
	
	public String getPath() {
		return f.getPath();
	}
}

Fehler tritt bei
Code:
return f.getPath()
auf in der Methode
Code:
public String getPath()

Desweiteren ist zuständig folgende if-Clausl:

Java:
JFileChooser filechooser = new JFileChooser();
filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = filechooser.showOpenDialog(null);

if (returnVal == JFileChooser.APPROVE_OPTION) {
f = filechooser.getSelectedFile();
System.out.println(f.getPath());
}

Ich will bei
Code:
f = filechooser.getSelectFile();
das Verzeichnis auswählen, kann es sein, dass das
Code:
getSelectFile()
nur für Dateien zustängig ist? ???:L
 
Zuletzt bearbeitet:
nö.
aber dein
Code:
System.out.println(f.getPath());
wird ausgegeben?
Wie schaut dein Log dazu jetzt aus?
 
nö.
aber dein
Code:
System.out.println(f.getPath());
wird ausgegeben?
Wie schaut dein Log dazu jetzt aus?

Ja wird ausgegeben! Habe allerdings dazu noch was gefunden:

Java:
f = filechooser.getCurrentDirectory();

speichert das Verzeichnis, nicht als Datei wie ich es vorher hatte - dummer Fehler :/

Jetzt habe ich es so:

Java:
public File getPath() {
	//return f.getPath();
	return f;
}

ich übergebe das Verzeichnis dann der Klasse InstallFont, korrigiert mich bitte wenn ich falsch liege...

Ach und noch was, wenn ich dann das Verzeichnis auswähle und öffnen klicke geht die Übertragung los, allerdings wir bei jedem Prozent der FileChooser neu geöffnet - wie kann ich das beseitigen?

€dit: Kommando zurück,
Code:
f = filechooser.getSelectFile()
war schon richtig :bahnhof:

aber das File ist schon richtig in der Methode getPath().

Nur kommt trotzdem jedesmal immer diese Abfrage...
 
Zuletzt bearbeitet:
Ah bin ich dämlich, hatte den FileOutputStream in einer Schleife drin, deshalb kam immer wieder dieses Fenster - naja ist ja auch schon spät :lol:

Jetzt funktioniert es wie gewünscht! 🙂

Danke euch beiden :toll:
 
Hi,

Sorry wenn ich das Thema noch mal aufwärme, aber ich habe jetzt das Programm in ein Jar-Archiv umgewandelt. Leider kann er jetzt die Datei nicht mehr laden, wenn ich ausführe (ohne jar) geht es...

Hat jemand eine Ahnung?

Exception:
java.io.FileNotFoundException: file:/home/purzel/Japanisch_lernen.jar!/japanisch_lernen/Files/meine_jp_schriftart.TTF (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:120)
at java.io.FileInputStream.<init>(FileInputStream.java:79)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:79)
at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
at japanisch_lernen.InstallFont.copy(InstallFont.java:139)
at japanisch_lernen.InstallFont.access$0(InstallFont.java:135)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:88)
at java.lang.Thread.run(Thread.java:662)
Exception in thread "Thread-1" java.lang.NullPointerException
at japanisch_lernen.InstallFont$2.run(InstallFont.java:93)
at java.lang.Thread.run(Thread.java:662)

Was mich ein wenig verwirt ist, das hinter dem .jar ein ! steht:
Code:
/home/purzel/Japanisch_lernen.jar!/japanisch_lernen/Files/meine_jp_schriftart.TTF

Hier der relevante Code:
(InstallFont)
[JAVA=77]
FileInputStream fis = null;
try {
fis = new FileInputStream(getClass().getResource("/japanisch_lernen/Files/arialuni.TTF").getPath());
} catch (FileNotFoundException e) {
e.printStackTrace();


/*
/* Datei kopieren
*/
try {
copy(fis, fos);
} catch (Exception e) {
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
[/code]

Danke schon mal 🙂
 
Hi,

so wie dein Code am Anfang beschrieben hast geht es natürlich auch.
Einfach über den FileReader einlesen, jedoch kommt es auf deine IDE(Entwicklerumgebung) an.
In Eclipse bspw. musst du den File so einlesen: C:\\Programs\\...\\
also immer doppel Backslash, das gilt für viele IDE´s
einfach ausprobieren. würde da nicht tausend Methoden ausprobieren, dein passt

LG

Tobi
 
Einfach über den FileReader einlesen, jedoch kommt es auf deine IDE(Entwicklerumgebung) an.
In Eclipse bspw. musst du den File so einlesen: C:\\Programs\\...\\
also immer doppel Backslash, das gilt für viele IDE´s
einfach ausprobieren. würde da nicht tausend Methoden ausprobieren, dein passt

LG

Tobi

Hi, Danke für deine Antwort!

Ich benutze Eclipse und Debian (Linux). Ich habe schon verschiedene Möglichkeiten ausprobiert, aber nichts hat geholfen 🙁

Wenn ich dann mit dem InputStream mache, statt mit dem FileInputStream - dann bekomme ich aus einer 23 MB großen Datei eine 2,2 GB große Datei ;(

Hast du vllt. einen Codeschnipsel, der helfen könnte?

LG

Purzel
 
mit FileInputStream und File kannst du nicht mehr arbeiten wenn es um eine Datei innerhalb eines Jars geht,
dann hilft nur noch getClass().getResourceAsStream(), was vielleicht sowieso angenehmer ist


wäre auch lockerleicht überall zu finden gewesen.., Suchbegriffe 'java datei aus jar lesen'
 
mit FileInputStream und File kannst du nicht mehr arbeiten wenn es um eine Datei innerhalb eines Jars geht,
dann hilft nur noch getClass().getResourceAsStream(), was vielleicht sowieso angenehmer ist

Ok, habe das jetzt mal angewendet:

InstallFont.java (Ausschnitt):
[JAVA=83]
FileInputStream fis = null;
InputStream is = null;
BufferedInputStream bis = null;
try {
//fis = new FileInputStream(getClass().getResource("/fonts/meine_jp_schriftart.TTF").getPath());
//fis = new FileInputStream(inputFile);
is = getClass().getResourceAsStream("/fonts/meine_jp_schriftart.TTF");
bis = new BufferedInputStream(is);
byte[] byBuf = new byte[10000];
try {
int byteRead = bis.read(byBuf, 0, 10000);
} catch (IOException e) {
ready.setText("<html><font color=\"red\">Es ist ein Fehler aufgetreten!</font></html>");
e.printStackTrace();
}
//} catch (FileNotFoundException e) {
//ready.setText("<html><font color=\"red\">Es ist ein Fehler aufgetreten!</font></html>");
//e.printStackTrace();
} finally {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
[/code]

Die Datei wird jetzt auch angelegt und beim lesen gefunden, allerdings bekomme ich jetzt diesen Fehler:
java.io.IOException: Bad file descriptor
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:282)
at japanisch_lernen.InstallFont.copy(InstallFont.java:161)
at japanisch_lernen.InstallFont.access$0(InstallFont.java:156)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:109)
at java.lang.Thread.run(Thread.java:662)
java.io.IOException: Bad file descriptor
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:282)
at japanisch_lernen.InstallFont.copy(InstallFont.java:161)
at japanisch_lernen.InstallFont.access$0(InstallFont.java:156)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:109)
at java.lang.Thread.run(Thread.java:662)
java.io.IOException: Bad file descriptor
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:282)
at japanisch_lernen.InstallFont.copy(InstallFont.java:161)
at japanisch_lernen.InstallFont.access$0(InstallFont.java:156)
at japanisch_lernen.InstallFont$2.run(InstallFont.java:109)
at java.lang.Thread.run(Thread.java:662
etc....

Danke schon mal, für den Tipp, wenn das Problem dann auch gelöst ist bin ich glücklich 🙂 DANKE :toll:

wäre auch lockerleicht überall zu finden gewesen.., Suchbegriffe 'java datei aus jar lesen'

Mh, danach hatte ich bis jetzt noch nicht gesucht :bahnhof:
 

Zurück
Oben