2016-09-11 3 views
-2

Das ist die erste Frage, die ich auf stackoverflow stelle, wenn Sie also etwas Unangenehmes/Schlechtes/Unpassendes in meiner Frage bemerken, bitte seien Sie freundlich und weisen Sie es auf mich.FileNotFoundException mit FileInputStream obwohl .getResource (filename) findet es

Ich habe versucht, meine Hausaufgaben in Java zu machen, weil ich von C++ müde war und ich schon etwas in Python getan hatte. Ich hatte jedoch Probleme mit dem Lesen von einer Binärdatei (die eine doppelte und zwei Gleitkommazahlen enthalten sollte, in der Reihenfolge).

Im Einzelnen: .getResource(filename) findet die Datei, aber wenn ich öffnen Sie eine FileInputStream(path) (innen public static Integer Leggere(Dati [] dato, String nomefile)), wirft es FileNotFoundException.

Dies ist mein Code:

import java.util.*; 
import java.io.*; 

public class Main{ 
    public static void main(String[] args) { 
     Dati [] data = new Dati[23500]; 
     int contatore = 0; 
     for(; contatore < 23500; contatore++){ 
      data[contatore] = new Dati(0, 0, 0); 
     } 
     contatore = 0; 

     String path = Dati.class.getClassLoader().getResource("valori.bin").getPath().toString(); 
     contatore = Leggere(data, path); 
     Acquisire(data, contatore); 
     Scrivere(data, "risultati.txt", contatore); 
    } 

    public static Integer Leggere(Dati [] dato, String nomefile){ 
     int j = 0; 
     try{ 
      DataInputStream in = new DataInputStream(new FileInputStream(nomefile)); 
      while(in.available() > 0){ 
       dato[j].dato1 = in.readDouble(); 
       dato[j].dato2 = in.readFloat(); 
       dato[j].dato3 = in.readFloat(); 
       j++; 
      } 
      in.close(); 
     } 
     catch(IOException e){ 
      System.out.println("Problemi nell'apertura del file"); 
      System.out.println(nomefile); 
      System.exit(0); 
     } 

     return j; 
    } 

    public static void Scrivere(Dati [] dato, String nomefile, int count){ 
     PrintWriter output; 
     try { 
      output = new PrintWriter(nomefile); 

      Integer j = 0; 
      while(j < count){ 
       output.println(dato[j]); 
       j++; 
      } 

      output.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


    } 

    public static void Acquisire(Dati [] dato, int count){ 
     Scanner cinput = new Scanner(System.in); 
     double c = 0.0; 
     int j = 0; 

     System.out.println("Inserisci un fattore di conversione: "); 
     while(c == 0.0){ 
      c = cinput.nextDouble(); 
     } 

     while(j < count){ 
      dato[j].dato1 *= c; 
      dato[j].dato2 *= c; 
      dato[j].dato3 *= c; 
     } 

     cinput.close(); 
    } 
} 

Das Programm endet mit zwei Nachrichten, die die Ausnahme behandeln. Der zweite ist der Pfad der Datei, wie durch die getResource() Methode gefunden:

Problemi nell'apertura del file 
/C:/Users/Sebastian/Desktop/Archivio/Scuola/5C%20a.s.%202016-2017/Compiti%20Estate%202016/Informatica/03%20-%20Conversione/bin/valori.bin 

Ich weiß, dass es ein FileNotFoundException ist, weil es so im Debug-Modus sagt.

Wie hätten Sie diesen Code gemacht? Weißt du, was das Problem ist? Können Sie ein Beispiel zur Behebung des Problems oder ein Beispiel für eine alternative Methode veröffentlichen?

Lösung des Problems

Ich schreibe dies so, dass die Menschen mit einem ähnlichen Problem ihre Lösung finden.

„Versagende“ Code

String path = Dati.class.getClassLoader().getResource("valori.bin").getPath().toString(); 
DataInputStream in = new DataInputStream(new FileInputStream(path)); 

Was war passiert, dass .getResource("valori.bin") es geschafft, die Datei zu finden (und es ist Weg mit .getPath()), aber wenn ich einen FileInputStream(path) zu öffnen versuchte, bekam ich einen FileNotFoundException.

Arbeits Code

InputStream stream = Dati.class.getClassLoader().getResourceAsStream("valori.bin"); 
DataInputStream in = new DataInputStream(stream); 

Auf diese Weise macht es. Auf diese Weise muss ich mich nicht um den Pfadnamen kümmern, da .getResourceAsStream() den verwendbaren Stream zurückgibt, wie er ist. Ich weiß nicht genau, warum der frühere Code nicht funktioniert hat, aber Heuristiken sagen mir, dass ich mir keine Sorgen machen sollte, und so sei es!

+0

Von meinem Kopf aus kann eine der APIs einen relativen Pfad verwenden, während die andere einen absoluten Pfad erfordert, den Sie falsch verstehen können. –

+0

@Tim Biegeleisen Oh, ich verstehe. Nun, FileInputStream() bekommt '/C:/Users/Sebastian/Desktop/Archivio/Scuola/5C%20a.s.%202016-2017/Compiti%20Estate%202016/Informatica/03%20-%20Conversione/bin/ valori.bin' als Parameter. Das ist ein absoluter Pfad, oder? –

+0

Ist der Dateiname wirklich so, mit all der URL-Codierung? – Robert

Antwort

1

Sie können sich die Methode getResourceAsStream im Klassenlader ansehen. Es gibt Ihnen einen Eingabestrom, den Sie direkt verbinden können und nicht mit vollen Pfaden und solchen Problemen umgehen müssen.

+0

Okay, danke. Ich habe versucht, dies in main zu tun: 'InputStream stream = Dati.class.getClassLoader(). GetResourceAsStream (" valori.bin ");' und änderte alles in der Funktion Leggere(), damit es funktioniert. Es scheint jetzt, dass es es zu öffnen, aber ich habe eine EOF-Ausnahme nach dem Lesen ein paar Bytes aus der Datei, aber ich denke, das ist ein ganz anderes Problem zu behandeln. Zeit, das Python-Programm zu reparieren, das tatsächlich in Binärdatei für diese Datei schreibt. Könnte sein, wegen der 64-Bit-Python-Float, ich habe Java 32 Bit Float-Fehler. –

Verwandte Themen