2016-02-25 10 views
-1

У меня проблема с этим кодом для домашней работы. Всякий раз, когда я запускаю его, консоль ничего не отображает, я могу писать все, что хочу, но сценарий не заканчивается сам по себе, как если бы он был в бесконечном цикле. Более того, выходной файл также не записывается. В настоящее время я изучаю входные и выходные потоки, поэтому я не знаю, что еще я мог бы сделать, чтобы исправить это. Любая помощь будет высоко ценится.PrintWriter не пишет в файл. [Java]

public class PublicationListingProcess1 extends Publication implements Serializable{ 
static Publication PublicationArray[]; 
static String a, n, line; 
static int y, c = 0, p, count = 0; 
static long z; 
static double s; 

enum PublicationTypes{PUBLICATIONCODE, PUBLICATIONNAME, PUBLICATIONYEAR, PUBLICATIONAUTHORNAME, PUBLICATIONCOST, PUBLICATIONNBPAGES} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    try{ 
     File f = new File("PublicationData_Input.txt"); 
     Scanner input = new Scanner(f); 
     while(input.hasNextLine()) 
     { 
      c++; 
     } 
     PublicationArray = new Publication[c]; 

    System.out.println("Welcome to this organizing software."); 
    System.out.print("Please enter the destiny file for output: "); 
    Scanner kb = new Scanner(System.in); 

    File outFile = new File (kb.next()+".txt"); 
    FileWriter output = new FileWriter (outFile); 
    PrintWriter writer = new PrintWriter (output); 

    while(input.hasNextLine()) 
    { 
     String [] split = input.nextLine().split(" "); 

     for(int i = 0; i < split.length; i++) 
     { 
      z = Long.parseLong(split[0]); 
      n = split[1]; 
      y = Integer.parseInt(split[2]); 
      a = split[3]; 
      s = Double.parseDouble(split[4]); 
      p = Integer.parseInt(split[5]); 
      PublicationArray[count] = new Publication(z, n, a, y, s, p); 
      writer.println(PublicationArray[count]); 
      count++; 
     } 

    } 
output.close(); 
input.close(); 
    } 

    catch(RuntimeException e) 
    { 
     e.getMessage(); 
    } 
    catch (FileNotFoundException ex) { 
     // TODO Auto-generated catch block 
     ex.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

}

+3

Вы никогда не закрываете 'PrintWriter' – 3kings

+0

, который вы читаете в пустом текстовом файле. Ваша программа не имеет ничего для синтаксического анализа – tmaxxcar

+0

попробуйте передать текстовый файл с 1 или 2 строками, чтобы увидеть, что, если таковые имеются, ошибки вы получить – tmaxxcar

ответ

0

Проблемный код:

while(input.hasNextLine()) 
    { 
     c++; 
    } 

Scanner.hasNextLine() делает не переместить указатель вперед. Поэтому, если ваш файл содержит что-то, у вас есть бесконечный цикл.

Чтобы решить эту бесконечную петлю, просто удалите ее во время блокировки. Он ничего не делает с появляющимся значением, по крайней мере, в опубликованном коде. Удалите блок while и измените PublicationArray на массив в ArrayList.

import java.util.*; 

public class PublicationListingProcess1 extends Publication implements Serializable{ 
    static ArrayList<Publication> pubs; 
    static String a, n, line; 
    static int y, p, count = 0; 
    static long z; 
    static double s; 

    enum PublicationTypes{ 
     PUBLICATIONCODE, 
     PUBLICATIONNAME, 
     PUBLICATIONYEAR, 
     PUBLICATIONAUTHORNAME, 
     PUBLICATIONCOST, 
     PUBLICATIONNBPAGES; 
    } 

    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
     try{ 
       File f = new File("PublicationData_Input.txt"); 
      Scanner input = new Scanner(f); 

       pubs = new ArrayList<>(); 

      System.out.println("Welcome to this organizing software."); 
      System.out.print("Please enter the destiny file for output: "); 
      Scanner kb = new Scanner(System.in); 

      File outFile = new File(kb.next()+".txt"); 
      FileWriter output = new FileWriter(outFile); 
      PrintWriter writer = new PrintWriter(output); 

      while (input.hasNextLine()) { 
       String[] split = input.nextLine().split(" "); 

       for (int i = 0; i < split.length; i++) { 
        z = Long.parseLong(split[0]); 
        n = split[1]; 
        y = Integer.parseInt(split[2]); 
        a = split[3]; 
        s = Double.parseDouble(split[4]); 
        p = Integer.parseInt(split[5]); 
        pubs.add(new Publication(z, n, a, y, s, p)); 
        writer.println(pubs.get(count); 
        count++; 
       } 

      } 
      output.close(); 
      input.close(); 
     } catch(RuntimeException e) { 
      e.getMessage(); 
     } catch (FileNotFoundException ex) { 
      // TODO Auto-generated catch block 
      ex.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Приведенный выше примерный код сохранил ваш основной поток управления, но может быть и лучше.

+0

Спасибо за ответ, но я использовал этот цикл while для подсчета количества строк в документе, так как я должен вводить каждую строку в качестве информации в объект PublicationArray. –

+0

OK, моя ошибка. Я обновлю андерсера. – glee8e

+0

Я действительно обнаружил проблему. Случилось так, что я предположил, что сброс указателя. Теперь я дважды открыл поток, так как я знаю, что возобновление потока невозможно. Теперь он работает, теперь я пытаюсь понять, как написать объект в файл. Спасибо за ответ. Не думал о списке массивов, спасибо за отзывы! –

 Смежные вопросы

  • Нет связанных вопросов^_^