即使 .getResource(filename) 找到了 FileInputStream 的 FileNotFoundException
FileNotFoundException with FileInputStream even though .getResource(filename) finds it
这是我在 Whosebug 上提出的第一个问题,所以如果您在我的问题中注意到某些内容 unpleasant/bad/inappropriate,请善待并指出给我。
我曾尝试在 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
因为它在调试模式下是这样说的。
你会如何完成这段代码?你知道问题出在哪里吗?您能否 post 解决问题的示例或解决问题的替代方法示例?
问题的解决方案
我写这篇文章是为了让有类似问题的人找到他们的解决方案。
"Malfunctioning"代码
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()
returns 可用的 Stream 是原样的。我不知道为什么以前的代码不起作用,但启发式告诉我不要太担心,就这样吧!
您可能想看一下 class 加载程序中的 getResourceAsStream
方法。它为您提供了一个可以直接插入的输入流,而不必处理完整路径和那些类型的问题。
这是我在 Whosebug 上提出的第一个问题,所以如果您在我的问题中注意到某些内容 unpleasant/bad/inappropriate,请善待并指出给我。
我曾尝试在 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
因为它在调试模式下是这样说的。
你会如何完成这段代码?你知道问题出在哪里吗?您能否 post 解决问题的示例或解决问题的替代方法示例?
问题的解决方案
我写这篇文章是为了让有类似问题的人找到他们的解决方案。
"Malfunctioning"代码
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()
returns 可用的 Stream 是原样的。我不知道为什么以前的代码不起作用,但启发式告诉我不要太担心,就这样吧!
您可能想看一下 class 加载程序中的 getResourceAsStream
方法。它为您提供了一个可以直接插入的输入流,而不必处理完整路径和那些类型的问题。