streamReader em string

Olá Pessoal

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?

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class Leitura{

 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();
 
 }

}

BufferedReader() nao pode usar? Daí vc usa readLine() que retorna uma String

Já estou usando pra ler o arquivo, mas não entendi ainda como usar pra passar pra string, tem alguma ideia?

hum vi seu cod direito agora

Boa tarde.

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?

Abraços!

Everton

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.");
        }

    }
}

Boa tarde.

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

Não seria isto que procuras?
Abraços.

Boa tarde Nel

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.

[code]import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class LerSubstring {

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.

Obrigado a todos pela ajuda

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.

Abraços.