これは私が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()
なぜ前のコードがうまくいかなかったのか正確にはわかりませんが、ヒューリスティックは私に多くのことを心配しないように指示しています。
APIの1つが相対パスを使用している可能性がありますが、もう1つは絶対パスが必要ですが、間違っている可能性があります。 –
@Tim Biegeleisenああ、そうだ。 FileInputStream()は '/C:/Users/Sebastian/Desktop/Archivio/Scuola/5C%20a.s.%202016-2017/Compiti%20Estate%202016/Informatica/03%20-%20Conversione/bin/ 'になります。 valori.bin'をパラメータとする。これは絶対パスですね。 –
ファイル名は本当にすべてのURLエンコーディングでですか? – Robert