[RESOLVIDO] Leitura e copia de um arquivo grande (resync de legendas) - Codificação de arquivos
17 respostas
AndreMendes
Quero criar um programinha pra resyncronizar legendas de uma forma bem simples.
Estou com um problema na hora de regravar os novos valores para dos tempos das legendas.
Basicamente, estou lendo a legenda antiga, atualizando os tempos, e nesse meio tempo vou gravando novamente as legendas em um arquivo temporario.
Se eu colocar uns println’s no meio, todos os valores estão correts e o leitor consegue varrer a legenda inicial até o fim. O problema, é que no arquivo de saida, apenas parte das informações é copiada,e no meio da execução ele dispara um NullPointerException nessa instrução tempoInicio = String.copyValueOf(tempo.toCharArray(), 0, 12); . Não estou entendendo o que pode estar acontecendo, já que em nenhum momento, a variavel tempo fica nula.
Imprima duas linhas antes e duas linhas depois onde está ocorrendo esse erro… que pode te ajudar, muito provavel ser um problema no srt.
AndreMendes
Então, eu já fiz isso, e ele le e imprime todas as linhas normalmente, o problema é que no arquivo de saida ele para no meio … Geralmente umas 150 linhas antes de terminar o arquivo de entrada.
Queres que eu poste as entradas e saidas e os arquivos?
dreampeppers99
AndreMendes:
Então, eu já fiz isso, e ele le e imprime todas as linhas normalmente, o problema é que no arquivo de saida ele para no meio … Geralmente umas 150 linhas antes de terminar o arquivo de entrada.
Queres que eu poste as entradas e saidas e os arquivos?
Tipo pra ajudar poste um pedaço do arquivo e como espera a saída ou como espera que a saída seja (de acrodo com seu sparametros)
AndreMendes
De uma olhada nos arquivos de entrada e saida.
A saida espera é algo no formato
//um numero
##:##:##,### --> ##:##:##,### //o tempo da legenda acrescido do tempo necessario, nesse caso 2000 milisec
// linha em branco
e tudo se repete …
O que acontece, é que apenas parte do arquivo de entrada é copiado …
dreampeppers99
E como pretente interagir e tipo informar qual linha deseja mudar?
AndreMendes
Esse nao é o problema na verdade.
As legendas sempre vem no padrao
NUMERO
TEMPO
LEGENDA
PULA UMA LINHA
Então nao ficou dificil. Tente executar esse metodo para ver o que acontece.
dreampeppers99
Estou pensando numa solução mais ou menos assim.
try {
FileReader legendaAModificar = new FileReader("/home/leandro-rm/Downloads/teste.srt");
Legenda legenda = getLegenda(legendaAModificar);
//pode-se iterar pe
List<Linha> linhas = legenda.getLinhas();
//ou alterar linha 3
legenda.getLinha(3).setInicio("");
legenda.salvar("novo.srt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
AndreMendes
Voce quer passar as obrigações de leitura e escrita para uma classse Legendas?
E fazer toda a manipulação dos dados lá dentro ?
Você acha que isso resolverá meu problema?
Tente executar o método, para o ver o problema que acontece …
dreampeppers99
AndreMendes:
Voce quer passar as obrigações de leitura e escrita para uma classse Legendas?
E fazer toda a manipulação dos dados lá dentro ?
Você acha que isso resolverá meu problema?
Tente executar o método, para o ver o problema que acontece …
Na verdade não estou tentando resolver o seu problema lá do código estou escrevendo um código que faça a mudança e salve um arquivo com as mudanças que deseja!
AndreMendes
Vou tentar fazer dessa forma para ver se o erro não acontece mais.
Vou fazer com que essa classe legendas faça todo o “trabalho sujo”.
Mais tarde eu posto o que aconteceu aqui.
dreampeppers99
Consegui fazer de um modo aqui, não sei se te serve ao todo. O teste abaixo lê a legenda teste.srt e modifica a linha 3 setando o tempo inicio para :P e salva num arquivo chamado novo.srt. Nos testes que fiz aqui funcionou.
Agora vocẽ pode trabalhar na classe Linha e melhorando e adaptando para sua necessidade, eu coloquei como se o tempo fosse inicial e final e pronto. Se quiser especifcar outro métodos como :
public inteface Linha{
void adicionarMilessegundosInicio(int tempoMS) ;
void subtrairMilessegundosFim(int tempoMS);
}
Enfim agora é sua criatividade e necessidade. Disse para colocá-los em linha por conta da facilidade da manutenção, já sabe que está na linha #3 e blá blá blá blá …
Claro que pode também fornecer esse métodos para rolar toda legenda pra frente… daí aplica essas mudanças a todas as Linha’s!
legenda.rolarMsParaFrente(100);//adianta toda legenda
AndreMendes
Perfeito. Misturei seu codigo com o meu e funcionou, apesar de eu não ter identificado meu erro no código anterior.
Agora o problema são os caracteres especiais. Quando vou checar o arquivo de saida, todos os acentos foram omitidos. Isso ocorre durante a manipulação das Strings dentro do código. Alguma ideia de como solucionar isso? Vou ver se acho algo no google e depois posto aqui!
dreampeppers99
AndreMendes:
Perfeito. Misturei seu codigo com o meu e funcionou, apesar de eu não ter identificado meu erro no código anterior.
Agora o problema são os caracteres especiais. Quando vou checar o arquivo de saida, todos os acentos foram omitidos. Isso ocorre durante a manipulação das Strings dentro do código. Alguma ideia de como solucionar isso? Vou ver se acho algo no google e depois posto aqui!
Provavelmente codificação ISO --> UTF. Veja e poste aqui mesmo.