使用FileInputStream的FileNotFoundException,即使.getResource(filename)找到它

时间:2016-09-11 15:03:19

标签: java filenotfoundexception fileinputstream getresource

这是我在stackoverflow上提出的第一个问题,所以如果你在我的问题中发现一些不愉快/不好/不合适的事情,请善待并指出给我。

我尝试用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,因为它在调试模式下是这样说的。

你将如何完成这段代码?你知道问题是什么吗?您可以发布一个示例来解决问题或者替代方法的示例吗?

解决问题的方法

我写这篇文章,以便有类似问题的人可以找到他们的解决方案。

&#34;失灵&#34;代码

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

发生了什么事.getResource("valori.bin")设法找到了文件(以及.getPath()的路径),但当我尝试打开FileInputStream(path)时,我收到了FileNotFoundException {1}}。

工作代码

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

这样做。通过这样做,我不需要担心路径名称,因为.getResourceAsStream()按原样返回可用的流。我不确切知道为什么前代码没有用,但启发式告诉我不要太担心,所以就这样吧!

1 个答案:

答案 0 :(得分:1)

您可能想要查看类加载器中的getResourceAsStream方法。它为您提供了一个输入流,您可以直接插入,而不必处理完整路径和这些问题。