Java-программа, которая принимает список существующих текстовых файлов из аргументов командной строки - PullRequest
0 голосов
/ 31 августа 2009

Вопрос: написать программу на Java, которая принимает список существующих текстовых файлов из аргументов командной строки и объединяет содержимое всех файлов в «Master.txt».

Мой код выдает ошибку при тестировании 4 endsWith(".txt"). Пожалуйста, дайте мне знать, как это исправить.

import java.io.*;
class FileConcat
{
 public static void main(String[] args)
 {
  FileOutputStream fout;
  FileInputStream fin,fin1;
  File f;
  int b; 
  try
  {
   //open Master file
   try
   {
    fout=new FileOutputStream("Master.txt"); 
   }
   catch(Exception e)
   {
    System.out.print(e.getMessage());
   }
   //traverse all args, check if valid text file, if yes, concatinate
   for(int j=0;j<args.length;j++)
   {
    f=new File(args[j]);
    if(f.isFile()==true)
    {
     if((args[j].endsWith(".txt"))==true)
     {
      try
      {
       fin=new FileInputStream(args[j]);
      }
      catch(Exception e)
      {
       System.out.print("Error Opening "+args[j]);
      }
      while((b=fin.read())!=-1)
      {
       char ch=(char) b;
       fout.write(ch);
      }
     }
    fin.close();
    }
   }
   fout.close();
   fin1=new FileInputStream("Master.txt"); 
   while((b=fin1.read())!=-1)
   {
    char ch=(char) b;
    System.out.print(ch);
   }
   fin1.close();
  }
  catch(Exception e)
  {
   System.out.println(e.getMessage());
  }
 }
}

Выход:

C:\j2sdk1.4.1_01\bin>javac FileConcat.java
FileConcat.java:38: variable fin might not have been initialized
                                                while((b=fin.read())!=-1)
                                                         ^
FileConcat.java:41: variable fout might not have been initialized
                                                        fout.write(ch);
                                                        ^
FileConcat.java:44: variable fin might not have been initialized
                                fin.close();
                                ^
FileConcat.java:47: variable fout might not have been initialized
                        fout.close();
                        ^
4 errors

Как проверить, присвоено ли значение fin или нет?

Ответы [ 9 ]

5 голосов
/ 31 августа 2009

Проблема в том, что вы вообще ничего не назначаете fin и fout при их объявлении, вы назначаете их только в блоке try {}, а код, который впоследствии использует их, находится вне блока try {} ; так что если в блоке try {} возникнет исключение, программа продолжит работу независимо и попытается использовать неинициализированные значения.

Ваши варианты:

  • Переместить код, пытающийся использовать эти переменные, в блок try {}, где они инициализируются
  • Присвойте null этим переменным при их объявлении и поместите код, который пытается использовать их, в блок if (variable != null) {}.
  • Заставить предложения catch () выполнить какое-либо действие, гарантирующее, что код, который в противном случае попытается использовать неинициализированные переменные, не будет выполнен, например, выйти из программы
  • Просто избавьтесь от предложений try .. catch и объявите весь метод как выбрасывающий эти исключения
2 голосов
/ 31 августа 2009

Нет необходимости говорить:

if (b == true)

Когда b равно boolean. Это эквивалентно:

if (b)

Это не отвечает на ваш вопрос (как это уже делают другие), но может быть полезно для вас в любом случае

1 голос
/ 31 августа 2009

Ваша проблема в следующем разделе (и других подобных):

try
{
  fin=new FileInputStream(args[j]);
}
catch(Exception e)
{
  System.out.print("Error Opening "+args[j]);
}

Если выдается исключение, fin не будет инициализировано со значением. Однако, если выдается исключение, возможно, ваша программа не может продолжаться. Поэтому я думаю, что вы должны удалить try / catch и просто объявить, что ваш main метод throws IOException.

0 голосов
/ 11 сентября 2009

вы добавляете оператор return в блоке catch ... остальные в порядке .... например:

попытка {

} catch (ExcepttionName exObject) { заявления; возвращение;

}

вы должны добавить return в каждый блок catch ().

0 голосов
/ 02 сентября 2009
import java.io.BufferedWriter; <br>
import java.io.File;<br>
import java.io.FileWriter;<br>
import java.util.Scanner;<br>

public class ConcatFiles
{
    public static String masterFile;


public static void main(String[] args) throws Exception
{
    MasterFile();
}

public static void MasterFile() throws Exception
{
    System.out.println("Enter Master File Name:");
    Scanner readMasterFileName = new Scanner(System.in);
    masterFile = readMasterFileName.next();
    if (new File(masterFile).exists() && masterFile.contains(".txt"))
    readFileName();
    else
    {
        if (masterFile.contains(".txt"))
        {
            new File(masterFile).createNewFile();
            System.out.println("Master File Created");
            readFileName();
        }
        else
        {
            System.out.println("Invalid File or Input");
            MasterFile();
        }
    }
}
public static void readFileName() throws Exception
{
    System.out.println("Enter File Names:");
    Scanner readOtherFiles = new Scanner(System.in);
    String cmd = readOtherFiles.next();

    if (cmd.equalsIgnoreCase("Exit"))
        System.exit(0);
    else
        if (cmd.equalsIgnoreCase("New"))
            MasterFile();
        else
            if (cmd.contains(".txt") && new File(cmd).exists())
            concatFile(cmd);
            else
            {
                System.out.println("Invalid Input or File");
                readFileName();
            }
}
public static void concatFile(String otherFiles)throws Exception
{
    BufferedWriter out = new BufferedWriter(new FileWriter(masterFile, true));
    File readFiles = new File(otherFiles);
    Scanner reader = new Scanner(readFiles);
    while(reader.hasNext())
    {
        out.write(reader.nextLine()+"\n");
    }
    out.close();
    readFileName();
}
}
0 голосов
/ 31 августа 2009

Инициализируйте переменные следующим образом:

FileOutputStream fout = null;
FileInputStream fin = null, fin1 = null;
0 голосов
/ 31 августа 2009

Просто установите переменные в начале вашего метода:

public static void main(String[] args) {
    FileOutputStream fout = null;
    FileInputStream fin = null;
    FileInputStream fin1 = null;
    ...
0 голосов
/ 31 августа 2009

Чтобы ответить на ваш вопрос по его номинальной стоимости, вы можете проверить, присвоено ли ребру значение, используя

if (null == fin)

Однако действительная причина в том, что вы продолжаете выполнение, если выдается исключение.

 try
  {
   fin=new FileInputStream(args[j]);
  }
  catch(Exception e)
  {
   System.out.print("Error Opening "+args[j]);
  }

Приведенный выше блок не устанавливает fin, если выдается исключение, но вы получаете доступ к fin в следующей строке. Это также относится к fout и fin1.

Вы можете вложить другой код в блок try; на самом деле рекомендуется, если вы используете ресурсы, которые могут вызывать исключения при доступе к ним.

0 голосов
/ 31 августа 2009

Если fout = new FileOutputStream("Master.txt"); выдает исключение, то fout не определено, но вы все еще пытаетесь записать в файл.

Точно так же, если fin = new FileInputStream(args[j]); выдает исключение, то fin не определено, но вы все еще пытаетесь прочитать из файла.

Вы можете заключить весь цикл в блок try или просто объявить main, чтобы выбросить IOException.

Я также рекомендую перевести вызовы на close() в finally блоки и удалить лишние "==true" from some of the tests.</p> <pre>import java.io.*; public class FileConcat { public static void main(String[] args) { FileOutputStream fout; FileInputStream fin,fin1; File f; int b; //open Master file try { fout=new FileOutputStream("Master.txt"); try { //traverse all args, check if valid text file, if yes, concatinate for(int j=0;j<args.length;j++) { f=new File(args[j]); if(f.isFile()) { if(args[j].endsWith(".txt")) { try { fin=new FileInputStream(args[j]); try { while((b=fin.read())!=-1) { char ch=(char) b; fout.write(ch); } } catch (IOException e) { e.printStackTrace(); } finally { fin.close(); } } catch(Exception e) { System.err.println("Error opening "+args[j]+" for input"); } } } } } finally { fout.close(); } fin1=new FileInputStream("Master.txt"); while((b=fin1.read())!=-1) { char ch=(char) b; System.out.print(ch); } fin1.close(); } catch(Exception e) { System.err.println("Error opening Master.txt for output"); } } }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...