2016-09-11 5 views
-2

Это первый вопрос, который я задаю в 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() возвращает полезный поток как есть. Я не знаю точно, почему прежний код не работал, но эвристика говорит мне, чтобы я не волновался, и так будет!

+0

В верхней части моей головы один из API может использовать относительный путь, в то время как другой требует абсолютного пути, к какому пути вы можете ошибиться. –

+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

Хорошо, спасибо. Я попытался сделать это в основном: 'InputStream stream = Dati.class.getClassLoader(). GetResourceAsStream (" valori.bin "); и изменил все в функции Leggere(), чтобы заставить ее работать. Теперь кажется, что ему удается его открыть, но у меня возникло исключение EOF после прочтения нескольких байтов из файла, но я думаю, что это совсем другая проблема. Время исправить программу Python, которая на самом деле записывает в двоичном файле этот файл. Возможно, из-за 64-битного поплавка Python, у меня есть 32-битные ошибки с плавающей запятой Java. –

Смежные вопросы