Estou utilizando o código abaixo para ler um arquivo para ler um arquivo texto, como o arquivo é muito grande em torno de 44 MB e mais de 400.000 linhas, eu preciso ler o arquivo e passar para uma string. Alguém sabe como ler um arquivo e passar o texto para dentro da string?
public static void main(String[] args) throws FileNotFoundException, IOException {
FileInputStream stream = new FileInputStream("clamarei.txt"); //abre o arquivo numa stream
InputStreamReader streamReader = new InputStreamReader(stream); // converte bytes em caracteres
BufferedReader reader = new BufferedReader(streamReader); //Coloca o arquivo lido num buffer
String line = null;
while((line=reader.readLine())!=null) {
System.out.println(line); //Imprime a saída do arquivo lido
}
//Fechamento dos processos abertos
reader.close();
streamReader.close();
stream.close();
}
Sempre que postar código, por favor, poste entre as tags code ok?
E sobre o seu código, da forma como está fazendo, ele já não está conseguindo extrair as linhas do arquivo?
Porque se estiver, utilize a StringBuffer para construir a String com todas as linhas que vocë deseja, depois, para transformar para uma String basta utilizar o método .toString() ok?
Usando o BufferedReader() eu consigo um retorno, pelo menos na tela, com o mesmo formato do arquivo original, com seus espaços e mudanças de linha, seria melhor se eu conseguisse usar esta classe mas a minha variável do tipo string retorna “null” quando tento receber usando o readline(). Só obtive sucesso imprimindo na tela mesmo, mas não resolve porque preciso fazer buscas dentro da string. O arquivo que preciso trabalhar de verdade é muito grande, pra fazer uma leitura leva em torno de 12 minutos, já mencionei o tamanho dele.
Nel
Obrigado pela dica da tag Code, não tinha me dado por conta disso. Quanto ao StringBuffer, também não consegui resultados.
Só consegui passar o conteúdo lido para uma string com o código abaixo, mas desta forma ele me retorna tudo numa linha só, sem espaços e quebras de linhas.
Eu esqueci de dizer que sou novo no mundo java, agradeço muito se vocês tiverem alguma sugestão de código
import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
import java.util.regex.Pattern;
public class lerarquivo {
public static void main(String args[]) {
int linhas = 0;
String novodoc=null;
try {
File arquivo = new File("clamarei.txt");
FileInputStream in = new FileInputStream(arquivo);
Scanner scanner = new Scanner(in);
while (scanner.hasNext()) {
String readLine = scanner.next();
linhas++;
System.out.println(readLine = readLine.substring(0)); //imprime na tela
novodoc = (novodoc+readLine.substring(0));// variavel recebe as sequencias do documento
}
} catch (Exception e) {
}
System.out.println("****************************************************");
System.out.println(novodoc);
System.out.println("****************************************************");
String pesquisa = "HELOISA"; //substring a ser pesquisada
String frase = novodoc; //string que contém todo o texto
//Informa se encontrou ou não a substring
if (frase.matches(".*" + pesquisa + ".*")) {
System.out.println("***A string contém a substring pesquisada.");
} else {
System.out.println("***A string não contém a substring pesquisada.");
}
}
}
Já utilizou alguma vez o StringBuffer? Se sim, o que houve de errado?
A ideia é que consiga extrair todas as linhas do seu arquivo texto e salvas em uma única String, certo? Foi pensando assim, que indiquei o StringBuffer.
Você poderia fazer algo assim:
//Pula uma linha
String newLine = System.getProperty("line.separator");
StringBuffer sb = new StringBuffer();
sb.append("Minha Primeira Linha do Arquivo");
sb.append(newLine);
sb.append("Minha Segunda Linha do Arquivo");
String result = sb.toString();
System.out.println(result);
//Resultado:
//Minha Primeira Linha do Arquivo
//Minha Segunda Linha do Arquivo
Ainda não utilizei o StringBuffer porque não entendi como passar de um arquivo lido para StringBuffer, ainda vou tentar fazer isso porque pelo que li o StringBuffer deixa o sistema mais leve, é isso mesmo? Como os arquivos que preciso ler são extremamente grandes vou precisar otimizar os processos.
Por enquanto, resolvi o problema com o código abaixo.
public static void main(String[] args) {
String novodoc = "";
try {
File arquivo = new File("alt_Celera_chr222.gbk"); //Localiza o arquivo
FileInputStream in = new FileInputStream(arquivo);
Scanner scanner = new Scanner(in);
//Enquanto houver um proximo caracter a variavel recebe o scanner
while (scanner.hasNext()) {
String readLine = scanner.next();
novodoc = (novodoc + readLine.substring(0));// variavel recebe as sequencias do documento
}
} catch (Exception e) {
System.out.println("Ocorreu algum erro. Erro: " + e);
}
System.out.println(novodoc);
String locus = "LOCUS" + JOptionPane.showInputDialog("Informe o LOCUS: "); //Variavel recebe o valor do LOCUS
int index = novodoc.lastIndexOf(locus); //Variavel int que vai receber a posição do locus
String subfrase = novodoc.substring(index, novodoc.indexOf("//")+4);
System.out.println(subfrase);
System.exit(0);
}
}[/code]
Com este código estou passando também para uma substring
Se você puder adaptar este código para usar com StringBuffer eu agradeço muito.
Vou esperar alguma resposta, depois vou encerrar o post como Resolvido.
Bom, na realidade depende muito da sua utilização, como você vai usar o StringBuffer e em qual ponto do seu sistema.
Mas a ideia, é que você não precisa ficar utilizando a String naquele formato, a mudança que eu sugeri foi a seguinte:
StringBuffer sb = new StringBuffer();
while (scanner.hasNext()) {
String readLine = scanner.next();
sb.append(readLine.substring(0));
//Caso queira adicionar uma nova linha para cada código, faça assim:
//sb.append(System.getProperty("line.separator"));
//Neste caso, a string ficaria assim:
//10
//20
//...
//separada por linhas
}
novodoc = sb.toString();
No caso de utilizar System.getProperty("line.separator"); você pode fazer com que uma String receba este valor e depois apenas utiliza-la, sem que precise a todo instante chamar o método getProperty(). É uma ideia apenas, se isto vai melhorar ou não perfomance, já não sei afirmar. Talvez,teria que rever todo o código afim de se buscar uma outra alternativa.