Это первый вопрос, который я задаю в stackoverflow, поэтому, если вы заметили что-то неприятное/плохое/неуместное в моем вопросе, будьте добры и укажите его мне.FileNotFoundException с FileInputStream, хотя .getResource (filename) находит его
Я попытался выполнить домашнюю домашнюю работу в школе на Java, потому что я устал от C++, и я уже что-то сделал в Python. Однако у меня были проблемы с чтением из двоичного файла (который должен содержать один двойной и два числа с плавающей запятой, по порядку).
В частности: .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();
}
}
Программа заканчивается двумя сообщениями, которые обрабатывают исключение. Второй путь к файлу, как найдено методом getResource()
:
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
, потому что он говорит, так что в режиме отладки.
Как бы вы сделали этот кусок кода? Вы знаете, в чем проблема? Не могли бы вы привести пример, чтобы исправить проблему или пример альтернативного метода справиться с ней?
РЕШЕНИЕ ПРОБЛЕМЫ
Я пишу это так, что люди с подобной проблемой может найти свое решение.
«сбои» Код
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 может использовать относительный путь, в то время как другой требует абсолютного пути, к какому пути вы можете ошибиться. –
@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