Java 使用FileInputStream的有效文件的FileNotFoundException

Java 使用FileInputStream的有效文件的FileNotFoundException,java,io,filenotfoundexception,Java,Io,Filenotfoundexception,当我编写一个FileInputStream时,当我有一个有效的文件时,它抛出一个FileNotFoundException。 我用了这个: package io; import java.io.*; public class implementIo { public static int i; public static FileOutputStream output; public static FileInputStream input; public sta

当我编写一个
FileInputStream
时,当我有一个有效的文件时,它抛出一个FileNotFoundException。 我用了这个:

package io;
import java.io.*;
public class implementIo {
    public static int i;
    public static FileOutputStream output;
    public static FileInputStream input;
    public static void main(String args[]) {
    try {
                output = new FileOutputStream("writeModification.txt");
            input = new FileInputStream("modification.txt");
            do {
        i = input.read();
        if(i != -1) output.write(i);
        }while(i != -1);
    } catch (Exception e) {
        System.out.println("Exception caught " + e);
    } finally {
        try {
            if(output == null) input.close();
        }catch(IOException e) {
            System.out.println("IOException caught: " + e);
        }
    }
}
}


虽然我在同一个包文件夹中有两个名为“modify.txt”和“printmodify.txt”的独立文件,但系统抛出了一个
FileNotFoundException
。请帮忙

这是因为FileInputStream不像
newFileOutputStream()
那样在初始化期间提供文件创建。因此,如果已经说过这些,我们可以看到一件需要记住的有趣事情:每次初始化
文件输出流时都会创建修改.txt(并且不会被覆盖),这就是为什么您的代码很可能在
新文件输入流()
行中断的原因

如何处理您的异常? 您可以在执行代码之前创建文件(手动使用
New
->
文本文档
等),也可以修改代码并使用
文件
类:

File file = new File("modification.txt");
    try {
        file.createNewFile();
        input = new FileInputStream(file);
        //your code here - output etc.
即使在同一个包文件夹中创建了文件,您的代码仍然无法工作?这是因为流查找文件的默认路径是当前工作目录。以下是一个例子:

myproject
   |___src
   |    |___main
   |          |___java
   |                |___io
   |                     |___implementIo
   |___writeModification.txt
   |___modification.txt
 myproject
   |___src
        |___main
              |___java
                    |___io
                         |___implementIo
                         |___writeModification.txt
                         |___modification.txt
如果您想像以前一样使用流(在stream构造函数参数中只使用一个简单的文件名),那么这是正确的结构。但是如果文件不在那里,则必须指定绝对路径。以下是一个例子:

myproject
   |___src
   |    |___main
   |          |___java
   |                |___io
   |                     |___implementIo
   |___writeModification.txt
   |___modification.txt
 myproject
   |___src
        |___main
              |___java
                    |___io
                         |___implementIo
                         |___writeModification.txt
                         |___modification.txt
访问文件的正确方法是:

FileInputStream input = new FileInputStream("C://myproject//src//main//java//io//modification.txt");

输出流也是如此。(请使用正确的文件位置修改路径)

显示完整堆栈跟踪输出将在当前工作目录中搜索文件,该目录是java启动的目录或IDE中设置的目录-当然不是软件包文件夹。您可以使用类似于
System.out.println(新文件(“modification.txt”).getAbsolutePath())的内容
查看文件的搜索位置为什么编辑帖子而不按要求放入堆栈跟踪?
modification.txt
将在每次调用
new FileOutputStream(“modification.txt”)
时被覆盖,在
new FileInputStream(…)
之前创建一个空的输入文件完全没有意义。“流查找文件的默认路径”不是“项目目录”,而是当前工作目录。答案是完全错误的。我明白你的意思,为什么它完全没有意义,但我在想,也许OP想在他读东西之前修改文件。我想说的是当前的工作目录,而不是项目目录,谢谢你的观察。你不能修改一个不存在的文件。如果OP想在读取新文件之前将一些内容放入新文件中,让他这样做,并且当他在这样做的过程中调用
new fileoutstream()
时,该文件将被创建:尽管在这种情况下他为什么需要文件仍然是个谜
File.createNewFile()
几乎没有正确的用法,这不是其中之一。而且提供完整的路径名来打开文件是不“正确”的,特别是当该路径直接指向特定计算机上特定用户的目录结构时。他没有理由不能继续使用相对路径名,只要他理解它是相对于什么的。好的,谢谢你让我理解为什么我的答案不正确。