2016-09-11 14 views
-2

これは私がstackoverflowで尋ねる最初の質問です。私の質問に不快な/悪い/不適切なことがある場合は、親切にしてください。FileInputStreamでFileInputStreamを使用してもFileInputStreamでエラーが発生する

私はJavaで学校の宿題をやってみました。私はC++に疲れていて、すでにPythonで何かしていました。しかし、バイナリファイル(2つの浮動小数点数を順番に含む)から読み込むことに問題がありました。

具体的には、.getResource(filename)がファイルを検出しますが、FileInputStream(path)public static Integer Leggere(Dati [] dato, String nomefile))を開くと、FileNotFoundExceptionがスローされます。

これは私のコードです:

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(); 
    } 
} 

プログラムが例外を処理二つのメッセージ、で終わります。

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 

私はそれがデバッグモードにして言うので、それはFileNotFoundExceptionだということを知っている:getResource()法で見られるように二つ目は、ファイルのパスです。

このコードをどうやってやりましたか?あなたはその問題が何であるか知っていますか?問題を解決するための例やそれに対処する別の方法の例を投稿できますか?同様の問題を持つ人々が解決策を見つけることができるように私はこれを書いている問題

TO

SOLUTION。

「動作不良」コード

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

何が起こった.getResource("valori.bin")は、ファイルを見つけることができた(と、それは.getPath()とパスです)が、私はFileInputStream(path)を開こうとしたとき、私はFileNotFoundExceptionを得たということでした。

の作業コード

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

この方法では、それをしません。これにより、使用可能なストリームをそのまま返すので、パス名を心配する必要はありません。.getResourceAsStream()なぜ前のコードがうまくいかなかったのか正確にはわかりませんが、ヒューリスティックは私に多くのことを心配しないように指示しています。

+0

APIの1つが相対パスを使用している可能性がありますが、もう1つは絶対パスが必要ですが、間違っている可能性があります。 –

+0

@Tim Biegeleisenああ、そうだ。 FileInputStream()は '/C:/Users/Sebastian/Desktop/Archivio/Scuola/5C%20a.s.%202016-2017/Compiti%20Estate%202016/Informatica/03%20-%20Conversione/bin/ 'になります。 valori.bin'をパラメータとする。これは絶対パスですね。 –

+0

ファイル名は本当にすべてのURLエンコーディングでですか? – Robert

答えて

1

クラスローダーのgetResourceAsStreamメソッドを見てみるとよいでしょう。これは、直接接続できる入力ストリームを提供し、完全なパスとそのような種類の問題に対処する必要はありません。

+0

よろしくお願いいたします。私はこれをmain :: InputStream stream = Dati.class.getClassLoader()。getResourceAsStream( "valori.bin"); 'で行い、Leggere()関数内のすべてを変更して動作させました。今度はファイルを開くことができるようになったようですが、ファイルから数バイトを読み込んだ後でEOF例外が発生していますが、これは処理するのが全く異なる問題だと思います。そのファイルにバイナリで実際に書き込むPythonプログラムを修正する時間。 Java 32ビット浮動小数点エラーが発生している64ビットPython浮動小数点のためかもしれません。 –

関連する問題