2016-05-28 1 views
-1

Я хочу прочитать только первые 5 символов из System.in и отбросить остальную часть до символа EOL, если поток содержит больше, чем это (чтобы начать читать следующую строку). Вот что я пробовал:Читайте только первые 5 символов и отбрасывайте отдых

private static final int READ_COUNT = 5; 
public static void main(String[] args) throws IOException, InterruptedException{ 
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
    int readCharacters = 0; 
    int character; 
    do{ 
     character = reader.read(); 
     doJob(); 
     if(++readCharacters >= READ_COUNT){ 
      discardRest(reader); 
      break; 
     } 
    } while(character != '\n'); 

    System.out.println((char) reader.read()); 
} 

private static void discardRest(BufferedReader reader) throws IOException { 
    while(true){ 
     int character = reader.read(); 
     if(character == '\n') 
      break; 
    } 
} 

public static void doJob() throws InterruptedException{ 
    Thread.sleep(1000); 
} 

Это работает, но это боль. И это выглядит уродливо, как черт. Я не совсем уверен, насколько он надежный. Есть ли лучший способ достичь этого?

+0

Почему вы спите? – eldo

+0

@eldo В этом случае для подражания некоторой работе. – stella

+1

Почему бы вам просто не прочитать строку из буферизованного читателя, а затем просто использовать первые пять символов этой строки? – RealSkeptic

ответ

1

я бы просто сделал класс моей:

public class SkipLineBufferedReader extends BufferedReader 
{ 

    public SkipLineBufferedReader(Reader in) 
    { 
     super(in); 
    } 

    public SkipLineBufferedReader(Reader in, int sz) 
    { 
     super(in, sz); 
    } 

    //Return \n or -1 if EOF 
    public int skipLine() throws IOException 
    { 
     int ch; 
     do 
     { 
      ch = read(); 
     } 
     while (ch != -1 && ch != '\n'); 

     return ch; 
    } 
} 

Это просто содержит логику для перехода к следующей строке чтения один символ за один раз.
Остерегайтесь того, что в discardRest, если вы достигнете EOF перед любым EOL вы будете навеки.

Использование указанного класса является интуитивно понятным:

private static final int READ_COUNT = 5; 

public static void main(String[] args) throws IOException 
{ 
    SkipLineBufferedReader li 
     = new SkipLineBufferedReader(new InputStreamReader(System.in)); 

    int readCharacters = 0; 
    int character; 

    do 
    { 
     character = li.read(); 

     System.out.println("JOB WITH " + character); 

     if(++readCharacters >= READ_COUNT) 
     { 
      li.skipLine(); 

      break; 
     } 
    } while(character != '\n'); 

    System.out.println((char) li.read()); 
} 

Я не знаю, если вам нужны более конкретные методы, как тот, который конвертировать первые символы в строку, но BufferedReader имеет read(char[] cbuf) и read(char[] cbuf, int off, int len), которые очень удобны для обработки строк.

Остерегайтесь иметь дело со строкой при чтении пользовательских файлов, вы не можете предположить, что всегда есть не менее пяти символов, слепые substring будут бросать.

+0

Спасибо, мне нравится это решение. Но на самом деле, я читал до конца строки или когда я достигаю выхода за пределы. – stella

1

Как насчет

Scanner reader=new Scanner(System.in); 
String fiveChars=reader.nextLine().substring(0, 5); 

и повторить последнюю строку каждый раз, когда вам нужно следующие 5 символов.

+0

Вы уверены, что если линия очень большая, мы не запускаем OutOfMemoryError? – stella

+0

Забавно, что вы можете использовать BufferedReader и такие –

+0

Я сомневаюсь, что кто-нибудь собирается написать THAT long lines –