Bom pessoal estou fazendo um programinha que lê o um log(arquivo txt) e procurar por possíveis erros para escreve-los em um outro arquivo e quando um erro é achado eu preciso que um numero x de linhas acima para dar um contexto ao erro
bom eu estava pensando em usar LineNumberReader.getLinerNumber, mas não sei se faz o que desejo fazer.
Você precisa obter 20 linhas acima (por exemplo)?
Crie uma fila circular de tamanho limitado* (contendo no máximo 20 entradas), e vá inserindo as linhas que você já leu. Quando encontrar um erro, então você já tem as últimas 20 linhas.
Para criar uma fila dessas, use um array mesmo. Se quiser, use um java.util.LinkedList, que implementa a interface Queue, mas aí você tem de se lembrar de remover os elementos que excederem a quantidade de 20 à medida que forem inseridos.
P
palmadias
utilize a api FileUtils do projeto apache commons io. O método FileUtils.read retorna um List, ai é só vc iterar o list.
abraços.
A
arthurmenezes
me deram essa ideia de fazer um buffer circular… mas nunca precisei fazer isso e não tenho a menor idéia de como começar
fiz usando array msm de cinco posições e qdo chega no limite vai trocando as strings.. e quando acha um erro é pra exibir as 5 linhas acima ae fiz um outro método para isso, de acordo com a posição do erro:
mas estou com um grande problema pois quando ele acha um erro ele está exibindo duas vezes e sempre com a mesma linha antecedente
A
arthurmenezes
…alguém pra em ajudar???
T
thingol
Não use array. Como você viu, é mais difícil usar arrays que você imagina.
Eu já comecei a classe (que usa uma LinkedList) para você, se você for esperto vai conseguir terminar.
A
arthurmenezes
thingol:
class BufferCircular<E> extends LinkedList<E> {
@Override
public boolean add (E e) {
// Antes de inserir, cheque se o tamanho (size) é >= 20 (por exemplo).
// Se for >= 20, vá removendo elementos do início, com o método poll,
// até que o tamanho fique no valor desejado. Então você pode
// chamar super.add (e).
}
}
mas eu uso o poll no parametro do método???
T
thingol
Tá bom, eu tinha pensado nisto aqui:
importjava.util.*;/** * Implementação boba de uma fila de tamanho limitado. * Esta implementação, em vez de usar um array eficiente, simplesmente * sobrecarrega um LinkedList. */classBufferCircular<E>extendsLinkedList<E>{privateintcapacidade;/** * Construtor. * @param capacidade_ O tamanho máximo do buffer. */publicBufferCircular(intcapacidade_){capacidade=capacidade_;}@Overridepublicbooleanadd(Ee){// Antes de inserir, cheque se o tamanho (size) é >= 20 (por exemplo). // Se for >= 20, vá removendo elementos do início, com o método poll, // até que o tamanho fique no valor desejado. Então você pode // chamar super.add (e). while(size()>=capacidade){poll();}super.add(e);returntrue;}}classTesteBufferCircular{publicstaticvoidmain(String[]args){// Vamos pegar apenas as últimas 10 entradas. BufferCircular<String>buf=newBufferCircular<String>(10);for(inti=1;i<=200;++i){buf.add("Linha "+i);}// Agora vamos listar os elementos.for(Strings:buf){System.out.println(s);}}}
A
arthurmenezes
existe algum método onde eu recupero o indice do elemento… pois tenho que usa-los para fazer comparações
T
thingol
Por favor, olhe a documentação de java.util.LinkedList, que é a classe-base de BufferCircular.
A
arthurmenezes
sei que estou sendo um pouco folgado mas
poxa amigo… não saco nada de inglês to no inicio do curso ainda
=
da essa força ae
T
thingol
Tá bom, onde eu escrevi
for(Strings:buf){System.out.println(s); }
troque por
for(inti=0; i < buf.size(); ++i) {System.out.println(buf.get(i));}
O código é equivalente e faz a mesma coisa. Por favor, compile e rode o programa para ver o que ele faz.
A
arthurmenezes
eu to testando sempre… e está rodando perfeitamente… só que ao invés dele mostrar as 4 linhas antecedentes ao erro + o erro… e depois fazer o mesmo para outro erro ele acha o primeiro erro e mostrar repetidamente as mesmas coisas
T
thingol
Acho que você ainda não entendeu como é que se deve usar isso. A idéia é fazer o seguinte (em pseudo-código):