Problemas com InputStream - método de leitura não funciona

Pessoal, é o seguinte :

Tenho uma arquivo texto no C:\, que preciso ler usando um stream. O método abaixo nao funciona, deixando um loop infinito. Mandei mostrar o offset, que deveria ser incrementado a cara leitura o metodo read, ele simplesmente nao sai do canto, fica sempre em zero. O que pode ser? Eu não entendo muito de streams…

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package inputoutputstream;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

/**
 *
 * @author owner
 */
public class AosPoucos {

    public static void main(String[] args) {

        try {

            // link para um arquivo no disco...
            File file = new File("C:\\testeStream.txt");

        // um inpuStream para o arquivo...
        FileInputStream is = new FileInputStream(file);
                  


               // byte onde sera armazenada a leitura...
               byte[] bytes = new byte[(int)file.length()];

               // variaveis auxiliares para o processo de leitura...
               int offset = 0;
               int numRead = 0;
               
               // enquanto nao retorna -1, leia!
               while ((numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                    offset += numRead;
               }
                    

               // so para saber se chegou ao final da leitura...
               System.out.println("n = " + numRead + ", l = " + file.length());
                    
               

              // Ensure all the bytes have been read in
              if (offset < bytes.length) {
                    throw new IOException("Could not completely read file " + "Arquivo");
              }

              // mostra em tela o que foi lido
              System.out.println(new String(bytes));

        } catch (Exception e) {
        }
    }

}

Ninguem consegue dar uma maozinha aqui, pessoal?

Alguem pode ajudar???

Você quer ler um arquivo texto e criar um array de strings, uma por linha? Seria assim:

import java.util.*;
import java.io.*;

class LerArquivoTexto {
    public static void main (String[] args) {
        File nomeArquivo = new File ("arquivo.txt");
        BufferedReader br = null;
        List<String> linhas = new ArrayList<String>();
        try {
            br = new BufferedReader (new FileReader (nomeArquivo));
            for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
                linhas.add (linha);
            }
            System.out.printf ("O arquivo %s foi lido e contém %d linhas. %n", 
                nomeArquivo, linhas.size());
        } catch (IOException ex) {
            System.out.println ("Houve problemas na leitura do arquivo.");
            ex.printStackTrace();
        } finally {
            if (br != null) try { br.close(); } catch (IOException ex) { }
        }
    }
}

Se quer deixar tudo dentro de uma variável string, você pode tentar:

import java.util.*;
import java.io.*;

class LerArquivoTexto2 {
    public static void main (String[] args) {
        File nomeArquivo = new File ("arquivo.txt");
        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();
        String conteudo;
        try {
            br = new BufferedReader (new FileReader (nomeArquivo));
            for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
                sb.append (linha).append ("\r\n");
            }
            conteudo = sb.toString();
            System.out.printf ("O arquivo %s foi lido. Conteudo: %n%s%n", 
                nomeArquivo, conteudo);
        } catch (IOException ex) {
            System.out.println ("Houve problemas na leitura do arquivo.");
            ex.printStackTrace();
        } finally {
            if (br != null) try { br.close(); } catch (IOException ex) { }
        }
    }
}

Oi, estanglement.

Essa sua forma tá correta, eu entendi.

O que eu quero é usar um Stream e ler uma determinada quantidade de bytes, depois que ler, testar se leu tudo. Se nao leu, ler mais bytes, ate chegar no fim. O metodo numRead=is.read(bytes, offset, bytes.length-offset) me dá esse controle. Caso retorne -1, entao é porque chegou no final do buffer e tudo foi lido.

Usei isso num pdf (esse metodo que eu usei) da internet e funcionou. Agora que estou usando num txt local do disco, nao funciona. Estou fazendo uns testes aqui. O que eu quero é que eu POSSA ver e controlar a leitura, entende? tipo… Poderia ser assim como eu falei (leio, verifico que chegou ao fim. Se sim, imprimo na tela, se nao, leio mais).

Ou entao, poderia ser lendo a cada 5 bytes (5 chutei essa quantidade de bytes, o que eu queria é ter uma quantidade de bytes que EU especifique, que eu possa dizer a quantidade).

Resumindo…
Eu quero uma forma em que eu possa controlar a quantidade de bytes lidos, ao inves de fazer de modo automatico. Espero ter sido claro.
*Modo automatico que eu falo é apenas iterando como no br.readline() == null, eu quero ver os numeros, entende? Nao é bem “automatico”, sei la como falar isso… Mas deu pra entender, ne (rsrsrs)?

E desde já, obrigado pela ajuda, amigo! Valeu mesmo!

Ah, entendi.
Você quer algo semelhante ao utilitário “tail” do Unix (opção -f), que permite visualizar as últimas N linhas de um arquivo que está sendo escrito por um outro programa.
Um exemplo de programa Windows que faz a mesma coisa é o BareTail, http://baremetalsoft.com/baretail/
Nesse caso, costuma-se usar RandomAccessFile, não FileInputStream.