写入Java文件时程序冻结

时间:2016-02-25 06:21:36

标签: java

所以,我有这个分配从一个文件读取文本并写入另一个文件,将所有文本更改为大写。我不确定为什么,但是当我运行它时,它在我输入要写入的文件后冻结。非常感谢任何帮助。

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

public class McKinneyBenjaminUpperFile
{
   public static void main(String [] args)throws IOException
   {
      Scanner keyboard = new Scanner(System.in);

      System.out.println("Benjamin's Uppercase File Converter\n");

      String file1;
      String file2;

      System.out.println("Enter the name of the file to read from.");
      file1 = keyboard.nextLine();

      File file1open = new File(file1);

      if(!file1open.exists())
      {
         System.out.println("The file you entered does not exists.");
         System.exit(0);
      }

      Scanner infile = new Scanner(file1);

      System.out.println("Enter the name of the file to write to: ");
      file2 = keyboard.nextLine();

      File file2open = new File(file2);

      if(file2open.exists())
      {
         System.out.println("The file you entered already exists.");
         System.exit(0);
      }

      PrintWriter outfile = new PrintWriter(file2);

      while(infile.hasNext())
      {
         for(int i=0;i<file2open.length();i++)
         {
            String line = infile.nextLine().substring(0,1);
            String newLine = line.toUpperCase();
            outfile.println(newLine);
         }
      }

      System.out.println("Conversion complete. " + file1 + " is now converted to all uppercase in " + file2);
   }
}

2 个答案:

答案 0 :(得分:5)

  

但是当我运行它时,在我输入要写入

的文件后它会冻结

在这个循环中:

for(int i = 0; i < file2open.length(); i++) { ... }
由于您尚未创建目标文件,

file2open.length()将返回0。另请参阅File.length()

  

<强>返回:   此抽象路径名表示的文件的长度(以字节为单位),如果该文件不存在,则为0L。

因此循环永远不会被执行。这导致infile.nextLine()永远不会被调用,因此您的外while循环将永远循环,因为hasNext()将不断返回true

请注意,File仅代表文件的元数据(如名称和属性)。要写入文件,请使用流或编写器类,如FileOutputStream

答案 1 :(得分:2)

这是你的时间和循环

 while(infile.hasNext())
  {
     for(int i=0;i<file2open.length();i++)
     {
        String line = infile.nextLine().substring(0,1);
        String newLine = line.toUpperCase();
        outfile.println(newLine);
     }
  }

file2open.length()应该归咎于因为.length()返回由抽象路径名表示的文件的长度。由于它很长,我认为它正在做一些疯狂的计算,并且你的程序冻结的原因是因为它实际上只是进行了大量的计算并且仍在运行。尽管如此...

这将是更好的隐蔽方式:

  while(infile.hasNextLine())
  {
        String line = infile.nextLine();
        String newLine = line.toUpperCase();
        outfile.println(newLine);
  }

没有理由做个别子串。

编辑:没有正确读取代码,所以.length实际上是返回0.但是无论如何,.length正在做一些不同的事情,你认为我很确定。