2014-01-10 2 views
1

Я в настоящее время находится в процессе создания программы, которая получает от пользователя суффикс («ing», «er» и т. Д.), А затем прикрепляет этот суффикс к списку слов из входного файла. Проблема в том, что я использую буферизованный читатель, чтобы получить суффикс, который пользователь хочет использовать, но я все время получаю сообщение об ошибке (Исключение в потоке «main» java.io.IOException: Stream closed) при компиляции. Ниже вы заметите, что я не закрываю буферизованный читатель нигде, потому что когда я получаю сообщение об ошибке (Где его закрыть?), Я просто хочу принять вход пользователя и установить его как строковую переменную, которая будет использоваться внутри класс. Какие-либо предложения??Java/Eclipse - разрешение IOException при использовании BufferedReader вне основного метода

public static String GetSuffix (String psSingular1) throws IOException { 

    //Use BufferedReader to get suffix 
    BufferedReader brGetSuffix = new BufferedReader(new InputStreamReader(System.in)); 

    //Prompt the user for a suffix 
    System.out.println("Please insert a suffix that you would like add to the words (ex. er, ing, ance,etc.)"); 

    //Set a string to the user entered suffix 
    String sUserSuffix = brGetSuffix.readLine(); 

    //Initialize sSuffix 
    String sSuffix = ""; 

    //Each string represents the last characters of the word from the input file 
    String sLast1 = psSingular1.toLowerCase().substring(psSingular1.length()-1, psSingular1.length()); 


    String s2ndLast = psSingular1.toLowerCase().substring(psSingular1.length()-2, psSingular1.length()-1); 

    //This string represents the last letter of the word 
    String sLastLetter = psSingular1.toLowerCase().substring(psSingular1.length()-1, psSingular1.length()); 

    //This string represents a double vowel. It will be used in a word like "keep" 
    String sDoubleVowel = psSingular1.toLowerCase().substring(psSingular1.length()-3, psSingular1.length()-1); 

    //This String will represent the first character of the users suffix which will be needed to determine how the suffix is added to the word 
    String s1stSuffix = sUserSuffix.toLowerCase().substring(0, 0); 


    //If the word ends in 2 vowels and a consonant the suffix is added 
    if (bIsVowel(sDoubleVowel) && !bIsVowel(sLast1)){ 

     sSuffix = psSingular1 + sUserSuffix; 
    } 


     //Checks if psSingular1 ends in a consonant and y, changes the y to i and adds a suffix. 
     else if (sLast1.equals("y") && !bIsVowel(s2ndLast)){ 

     //Drop the "y" add "ies" 
     sSuffix = psSingular1.substring(0, psSingular1.length()-1) + "i" + sUserSuffix; 
     } 

     //Checks if psSingular1 ends in a vowel and y 
     else if (sLast1.equals("y") && bIsVowel(s2ndLast)){ 

      sSuffix = psSingular1 + sUserSuffix; 
     } 

     //Checks if psSingular1 ends in e and if the suffix starts with a vowel 
     else if (sLast1.equals("e") && bIsVowel(s1stSuffix)){ 

      sSuffix = psSingular1.substring(0, psSingular1.length()) + sUserSuffix; 
     } 

     //Checks if psSingular1 ends in e and if the suffix starts with a consonant 
     else if (sLast1.equals("e") && !bIsVowel(s1stSuffix)){ 

      sSuffix = psSingular1 + sUserSuffix; 
     } 

     //Checks if the word ends in two consonants 
     else if (!bIsVowel(s2ndLast) && !bIsVowel(sLast1)){ 

      sSuffix = psSingular1 + sUserSuffix; 

     } 

     //If the the word ends in a vowel and a consonant the last letter is doubled and the suffix is added 
     else if (bIsVowel(s1stSuffix) && bIsVowel(s2ndLast) && !bIsVowel(sLast1)){ 


      sSuffix = psSingular1 + sLastLetter + sUserSuffix; 
     } 

     //Add the suffix 
     else { 

      sSuffix = psSingular1 + sUserSuffix; 

     } 


    return sSuffix; 

} 
+0

Не могли бы вы просто попробовать: 'BufferedReader brGetSuffix = new BufferedReader (новый InputStreamReader (новый CloseShieldInputStream (System.in)));' и сообщите нам, если он все еще не работает? – ccjmne

+0

@ccjmne Скопируйте и вставьте именно то, что у вас есть, и я получаю сообщение об ошибке в CloseShieldInputStream. Является ли это частью класса, который может понадобиться импортировать? – NDFB76

+0

К сожалению ... вы правы ... это из 'org.apache.commons.io.input'. На самом деле, возможно, вы могли бы просто использовать «Сканер сканер = новый сканер (System.in);' then 'String sUserSuffix = scanner.nextLine();'. Если вы просто получаете несколько символов с пользовательского ввода, вам может не понадобиться использовать BufferedReader. Я знаю, что он не отвечает на ваш вопрос, но, возможно, по крайней мере, вы могли бы продолжить :) – ccjmne

ответ

0

кажется, что нам не хватает какой-то код (где psSingular1 приходит?), Но, возможно, попробуйте закрыть буферизованного читателя где-нибудь и посмотреть, если это помогает. Как только вы закончите добавлять ввод к читателю, вы можете закрыть его. Это может быть даже прямо перед заявлением о возвращении.

+0

'psSingular1' приходит как аргумент его функции. Я думаю, он дал нам количество кода, которое имеет значение (но поскольку что-то явно не так, возможно, фактическое закрытие потока выполняется где-то в другом месте). – ccjmne

+0

AH спасибо. Это было действительно глупо со мной - я почему-то это забыл. Я не думаю, что закрытие потока выполняется в другом месте, поскольку поток является локальным объектом, и весь метод, кажется, размещен. –

+0

PsSingular исходит из параметра string в начале класса. Я не думаю, что это относится к ошибке, о которой я упоминал. Я попытался закрыть буферизованный считыватель в нескольких разных областях, но, как я уже говорил, я все равно получаю ту же ошибку. – NDFB76

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