【问题标题】:Reading/Writing a file in Java Error在 Java 错误中读取/写入文件
【发布时间】:2013-06-09 22:34:01
【问题描述】:

我正在尝试完成这项任务:

编写一个程序,读取一个文件并将该文件的副本写入另一个插入行号的文件。

到目前为止,我已经写了这么多代码:

    import java.io.*;
import java.util.Scanner;

public class Question43 
{
public static void main(String[] args) throws IOException
{
    Scanner fileIn = new Scanner(new File("Assign4.txt") );


    FileWriter fileOut = new FileWriter("FileOut.txt");
    PrintWriter output = new PrintWriter(fileOut);

    String []array = new String[10];

    int indx = 0;
    while(fileIn.hasNext( ) )
    {
        array[indx] = fileIn.nextLine( );
    }

    fileIn.close();

    int num = 1;
    for(int i =0; i < array.length; i++)
    {
        output.println(num+"\t"+array[i]);
    }
}
}

当我点击运行时,我得到这个错误:

Exception in thread "main" java.io.FileNotFoundException: Assign4.txt (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at Question43.main(Question43.java:8)

有人可以告诉我该怎么做吗?我应该将名为 Assign4 的文本文件放在哪里,以便 Eclipse IDE 可以读取它?另外,新文件会在哪里创建?

感谢您的帮助!

【问题讨论】:

  • 除非您在项目树中指定另一个目录,否则 Eclipse 和 Java 期望该文件位于执行代码的 same 目录中。那么Question43.java 在哪个目录下?
  • 如果你的文本文件和你的类文件在同一个位置,你也可以尝试获取数据作为资源,Scanner fileIn = new Scanner(Question43.class.getResourceAsStream("Assign4.txt"));
  • @HunterMcMillen 谢谢!这成功了。但是输出的文件是空的。关于如何复制原始文件的内容并将其输出到输出文件中的任何建议?
  • 编辑了我的答案以包含该问题。
  • @selig 感谢您的编辑。我很感激。但是,当我把 output.close();它不会复制整个文本。如果我把它放在 "output.println(num+"\t"+array[i]);" 之后,只需一行如果我放置 output.close();在该声明之前的任何时间,我都会得到一个空白文本文件。请问有什么解决办法吗?

标签: java input io output filereader


【解决方案1】:

请指定 Assign4.txt 文件的路径。扫描仪找不到您指定的路径。指定项目根目录的路径

【讨论】:

    【解决方案2】:

    在 Eclipse 中,程序从顶级目录运行,即源文件夹和 bin 文件夹所在的位置。如有疑问请尝试

       System.out.println((new java.io.File(".")).getAbsolutePath());
    

    这将打印出程序正在运行的目录的路径。

    您还需要记住在使用后关闭您的写入器,以确保您写入的内容被刷新 - 写入器可能会缓冲您写入的内容,如果您的程序在您刷新此缓冲区之前完成,那么您写入的内容丢失了。所以在程序结束时关闭你的作家,即

    import java.io.*;
    import java.util.Scanner;
    
    public class Question43 
    {
      public static void main(String[] args) throws IOException
      {
        Scanner fileIn = new Scanner(new File("Assign4.txt") );
    
    
        FileWriter fileOut = new FileWriter("FileOut.txt");
        PrintWriter output = new PrintWriter(fileOut);
    
        String []array = new String[10];
    
        int indx = 0;
        while(fileIn.hasNext( ) )
        {
            array[indx] = fileIn.nextLine( );
        }
    
        fileIn.close();
    
        int num = 1;
        for(int i =0; i < array.length; i++)
        {
            output.println(num+"\t"+array[i]);
        }
        output.close();
      }
    }
    

    另一条评论 - 您假设您的文件正好有 10 行。为了给您更大的灵活性,请尝试使用按需增长的数据结构,例如ArrayList。此外,您似乎没有在循环中增加 num - 所以您的行都将编号为 1。

    import java.io.*;
    import java.util.*;
    
    public class Question43 
    {
      public static void main(String[] args) throws IOException
      {
        Scanner fileIn = new Scanner(new File("Assign4.txt") );
    
    
        FileWriter fileOut = new FileWriter("FileOut.txt");
        PrintWriter output = new PrintWriter(fileOut);
    
        List<String> list = new ArrayList<String>();
    
        while(fileIn.hasNext( ) )
        {
            list.add(fileIn.nextLine( ));
        }
    
        fileIn.close();
    
        int num = 1;
        for(String line : list)
        {
            output.println(num+"\t"+line);
            num++;
        }
        output.close();
      }
    }
    

    最后,您实际上根本不需要数据结构,因为您可以在读取输入文件时写入输出文件,即

    import java.io.*;
    import java.util.Scanner;
    
    public class Question43 
    {
      public static void main(String[] args) throws IOException
      {
        Scanner fileIn = new Scanner(new File("Assign4.txt") );
    
    
        FileWriter fileOut = new FileWriter("FileOut.txt");
        PrintWriter output = new PrintWriter(fileOut);
    
        int num = 1;
        while(fileIn.hasNext( ) )
        {
            String line = fileIn.nextLine( );
            output.println(num+"\t"+line);
            num++;
        }
    
        fileIn.close();
        output.close();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-31
      • 2014-03-20
      • 2013-03-25
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2011-07-27
      • 2013-01-06
      相关资源
      最近更新 更多