2015-06-21 3 views
1

У меня есть текстовый файл с содержимым abcdefgh, сохраненным на моем компьютере. Я хотел использовать FileInputStream для отображения символов на моей консоли, а также измерения времени, необходимого для этого. Это выглядит следующим образом:Использование FileInputStream для чтения текста из файла

public class Readtime { 
    public static void main(String args[]) throws Exception{ 
     FileInputStream in=new FileInputStream("bolbol.txt"); 
     while(in.read()!=-1){ 
      long startTime = System.nanoTime(); 
      int x = in.read(); 
      long endtime = System.nanoTime(); 
      System.out.println(endtime-startTime); 
      System.out.println((char)x); 
     } 
     in.close(); 
    } 
} 

Что я получаю на консоли следующее:

8863 
b 
7464 
d 
6998 
f 
6997 
h 

Теперь где остальные буквы? Это как если бы было сделано только 4 операции чтения. Мой ум идет в направлении размера символа, и что read() читает только один байт за раз, но я никуда не денусь.

+0

Пожалуйста, покажите вход и ожидаемый результат. – Sybren

+0

Содержимое текстового файла было указано как abcdefgh. Ожидаемым выходом будут буквы от a до h вместе с временем, которое требуется для чтения каждого из них. –

+1

Кроме того, не предполагайте, что каждый байт является символом. Это верно только при некоторых кодировках. Например, это неверно для UTF-8. Используйте Reader для чтения символов. Потоки для байтов. –

ответ

5
while(in.read()!=-1){ 
    long startTime = System.nanoTime(); 
    int x=in.read(); 

Вы читаете данные в состоянии в то время и печати в цикле читать снова

int i=0; 
while((i=in.read())!=-1){ 
    System.out.println((char)i); 
} 

Вы можете проверить официальную документацию here

+0

Спасибо за разъяснение. Вот и все. Довольно очевидно, приветствия! –

2

Изменить

while(in.read()!=-1){ 

в

int x; 
while((x=in.read())!=-1){ 

и удалить

int x=in.read(); 

Вы читали два раза .. и печать альтернативный время .. поэтому персонажи отсутствуют

-1

каждый раз in.read(); называется следующим символом файла, который читается. Поэтому вы должны прочитать символ один раз за итерацию цикла.

int i=0; 
while((i=in.read())!=-1){ 
System.out.println((char)i); 
i=in.read(); 
} 

Если вы видите ваш выход, то вы увидите, что вы прочитали альтернативные символы, потому что вы читаете два раза в цикле, один раз в состоянии в то время как и когда-то напечатать.

+0

Этот код по-прежнему имеет ту же проблему. – EJP

+0

@EJP - Я взял код из вопроса, чтобы объяснить, что случилось. Пожалуйста, прочитайте весь ответ. –

0

Вы можете использовать это, это поможет вам

public class Readtime { 
    public static void main(String args[]) throws Exception{ 
     FileInputStream in=new FileInputStream("bolbol.txt"); 

     long startTime = System.nanoTime(); 

     byte b[]=new byte[in.available()]; 
     fis.read(b); 
     String readOnConsole=new String(b); 
     System.out.println(readOnConsole); 
     long endtime = System.nanoTime(); 
     System.out.println(endtime-startTime); 
     in.close(); 
    } 
}