Como contar palavras em TXT no java?

ola pessoas
Sou novato aqui e tbm iniciante em progamacao java eu estou com problema em executar meu codigo

primeiramente eu tenho abrir dois arquivoTxt no java e contar quantas palavras tem em cada arquivo e dps comparar qual dos arquivo tem mais palavras:
Tbm tenho que instanciar os dois arquivo TXT em somente uma classe chamada arquivoComparar.

o meu primeiro problema é que nao consigo contar as palavras em somente um arquivo txt. preciso de um exemplo de como contar palavras para poder avancar nos outros objetivos.
Codigo Abaixo:
dentar texto pré-formatado por 4 espaços
import java.io.BufferedReade ir;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

//import arquivatura.ex;

public class Texto {
private int tam;
private static String conteudo;

			public int getTam() {
				
				return tam;
			}
			
			public void setTam(int tam) {
				this.tam = tam;
			}
			
			
			
	public static String getConteudo() {
				return conteudo;
			}



			public static void setConteudo(String conteudo) {
				Texto.conteudo = conteudo;
			}



	public void LerTexto() {
		String linha;
				try {
					FileReader fr;
					fr =new FileReader("CaminhodoArquivo");
					
					BufferedReader bf;
					bf= new BufferedReader(fr);
					
					
					linha = bf.readLine();
					while(linha!=null) {
				
						System.out.println(linha);
						linha=bf.readLine();
						tam++;
					
					}
					System.out.println(tam);
					
					
				}catch (Exception e) {
					System.out.println("Error"+e.getMessage() );
				}
				
			
				
				
			}

Cara, isso é trabalho de faculdade certo?

Só fazem 16 anos, sim 16, quase 17, que existe a classe Scanner para fazer leitura de texto de arquivos e outros streams. Como tem professor ridículo mesmo…

Em relação à sua dúvida. Você consegue ler o arquivo com o que tem aí e mostrar o que está entrando?

Se sim, o conteúdo de cada linha do arquivo deve estar na sua variável linha, certo? Agora pense. Se vc tem uma linha de texto e você contar a quantidade de espaços que essa linha tem, provavelmente você terá um número que corresponde à quantidade de palavras -1 unidade. Isso assumindo que o arquivo está formatado corretamente, sem mais de um espaço separando palavras.

Enfim, para contar a quantidade de espaços. Crie um contador (tem que inicializar com 0, certo?), faça um for para processar cada caractere da linha (do caractere 0 até o caractere tamanho-1). Dentro do for, se o caractere for um espaço, incrementa o contador.

Tenta aí resolver essa parte.

Obrigado por me responder.
É sim trabalho da faculdade e nao posso usar scanner.
ainda nao consigo contar as palavras

public void LerTexto() {
			String linha;
			 int ccount= 0;
			 int tam=0;
					try {
						FileReader fr;
						fr =new FileReader("C:/Users/luize/Desktop/texto.txt");
						
						BufferedReader bf;
						bf= new BufferedReader(fr);
						
						
						linha = bf.readLine();
						linha.charAt(ccount++) ;
						
						while(linha!=null) {
					
							System.out.println(linha);
							linha=bf.readLine();
							//tam++;
							
						}
						
						for(int i=0;i<linha.charAt(ccount);i--) {
							//ccount++;
						}
					
						 System.out.println(ccount);
					}catch (Exception e) {
						System.out.println("Error"+e.getMessage() );
					}
					
				
					
					
				}

eu modifiquei mas ainda nao conta

Depende de como está o arquivo e da definição de “palavra”.

Uma palavra é uma sequência de letras separadas por espaço, ou tem também vírgula, sinais de pontuação, etc? Tem palavras compostas, acentuadas, etc?

Dependendo do quão simples (ou complicado) for o arquivo, muda a solução…

Ta aí, veja se entende. É preciso entender.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * @author David
 */
public class ArquivoComparar {
    
    public static void main( String[] args ) {
        
        ArquivoComparar ac = new ArquivoComparar();
        int palavrasArquivo1 = ac.obterQuantidadeDePalavras( 
                "C:/Users/david/Desktop/texto.txt" );
        
        System.out.printf( "O arquivo processado tem %s palavras\n", palavrasArquivo1 );
        
    }

    public int obterQuantidadeDePalavras( String caminho ) {
        
        String linha;
        int contPalavrasPorLinha;
        int contPalavrasArquivo = 0;
        
        // esse é um try with resources.
        // ele vai fechar o stream assim que terminar
        try ( BufferedReader bf = new BufferedReader( new FileReader( caminho ) ) ) {
            
            linha = bf.readLine();

            while ( linha != null ) {

                System.out.println( "Dados da linha: " + linha );

                // remove espaços no início e do fim da linha
                linha = linha.trim();

                // se não for uma linha vazia
                if ( !linha.isEmpty() ) {

                    // há pelo menos uma palavra
                    contPalavrasPorLinha = 1;

                    // cada espaço indica mais uma palavra
                    // aqui assumimos que seu arquivo é muito bem comportado
                    // com apenas um espaço entre palavras.

                    // se quiser trocar todas as ocorrências de mais de um
                    // símbolo de espaço (espaço, tabulação...) para exatamente
                    // um espaço, vc deve fazer assim:
                    linha = linha.replaceAll( "\\s+", " " );

                    // na linha anterior, substitui-se um ou mais espaços
                    // denotado pela expressão regular \s+, por um espaço,
                    // indicado no segundo parâmetro

                    for ( int i = 0; i < linha.length(); i++ ) {
                        if ( linha.charAt( i ) == ' ' ) {
                            contPalavrasPorLinha++;
                        }
                    }

                    // a contagem de espaços pode ser feita assim tbm, visto que
                    // a posição do espaço é indiferente
                    /*for ( char c : linha.toCharArray() ) {
                    if ( c == ' ' ) {
                    contPalavrasPorLinha++;
                    }
                    }*/

                    System.out.printf( "há %d palavras na linha %s\n\n",
                            contPalavrasPorLinha, linha );

                    contPalavrasArquivo += contPalavrasPorLinha;

                }

                linha = bf.readLine();

            }

            System.out.printf( "há %d palavras no arquivo\n", 
                    contPalavrasArquivo );
            
        } catch ( IOException e ) {
            System.out.println( "Erro: " + e.getMessage() );
        }
        
        return contPalavrasArquivo;

    }

}

Para o arquivo com o conteúdo abaixo, serão contadas 40 palavras:

a a a    a a a a a a a     

    a a a a a a a a a            a
a a   a a a a a a a a


a a a a a      a a a    a    aaaa

davidbuzatto muito obrigado me ajudou muito, agora estou resolvendo o problema do compare to.
vou postar mais tarde aqui até onde fui com meu codigo.

avançei no meu no codigo mas nao consigo usar compare to codigo abaixo:

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;

    public class orginalText implements Comparable<orginalText> {
    	 
    	int contPalavrasArquivo = 0;

    	
    public int getContPalavrasArquivo() {
    		return contPalavrasArquivo;
    	}

    	public void setContPalavrasArquivo(int contPalavrasArquivo) {
    		this.contPalavrasArquivo = contPalavrasArquivo;
    	}

    public int LerTexto() {
    	
            String linha;
            int contPalavrasPorLinha;
           int contPalavrasArquivo = 0;
            
            
            try  {
            	FileReader fr;
    			fr =new FileReader("C:/Users/luize/Desktop/texto.txt");
    			
    			BufferedReader bf;
    			bf= new BufferedReader(fr);
                linha = bf.readLine();

                while ( linha != null ) {

                    

                    
                    linha = linha.trim();

                    
                    if ( !linha.isEmpty() ) {

                       
                        contPalavrasPorLinha = 1;
                        
                        linha = linha.replaceAll( "\\s+", " " );

                       
                        for ( int i = 0; i < linha.length(); i++ ) {
                            if ( linha.charAt( i ) == ' ' ) {
                                contPalavrasPorLinha++;
                            }
                        }
                        
                        
                       //    System.out.println(linha);

                        contPalavrasArquivo += contPalavrasPorLinha;

                    }

                    linha = bf.readLine();

                }

                System.out.println( contPalavrasArquivo );
                
            } catch ( IOException e ) {
                System.out.println( "Erro: " + e.getMessage() );
            }
            
            return contPalavrasArquivo;

        }

    public int LerTexto2( ) {
        
        String linha;
        int contPalavrasPorLinha;
        int contPalavrasArquivo = 0;
        
        
        try  {
        	
        	FileReader fr;
    		fr =new FileReader("C:/Users/luize/Desktop/texto2.txt");
    		
    		BufferedReader bf;
    		bf= new BufferedReader(fr);
            linha = bf.readLine();
            
            while ( linha != null ) {

                

                
                linha = linha.trim();

                
                if ( !linha.isEmpty() ) {

                   
                    contPalavrasPorLinha = 1;
                    
                    linha = linha.replaceAll( "\\s+", " " );

                   
                    for ( int i = 0; i < linha.length(); i++ ) {
                        if ( linha.charAt( i ) == ' ' ) {
                            contPalavrasPorLinha++;
                        }
                    }
                    
                    
                      // System.out.println(linha);

                    contPalavrasArquivo += contPalavrasPorLinha;

                }

                linha = bf.readLine();

            }

           System.out.println(contPalavrasArquivo );
            
        } catch ( IOException e ) {
            System.out.println( "Erro: " + e.getMessage() );
        }
        
        return contPalavrasArquivo;

    }
    						
    		@Override
    				public int compareTo(orginalText tex) {
    			if(this.contPalavrasArquivo > tex.getContPalavrasArquivo() ) {
    				return -1;
    		}else if (this.contPalavrasArquivo < tex.getContPalavrasArquivo() ) {
    				return 1;
    		}
    	
    								return 0;
    }

    		@Override
    		public String toString() {
    			return "orginalTex" + " LerTexto()=" + LerTexto()
    					+ ", LerTexto2()=" + LerTexto2() + "]";
    		}

    	
    }


import java.util.ArrayList;
import java.util.List;
import java.util.ArrayList;

import java.util.Collections;
import java.util.List;
public class OriginalTextTest {

	  public static void main( String[] args ) {
	      	 
		  try {
			  //orginalText [] t =new orginalText[2];
				
			  ArrayList<orginalText> listaDeTexto = new ArrayList<>();
			  orginalText t1 = new orginalText ();
			//  orginalText t2 = new orginalText ();
				
			  listaDeTexto.add(t1);
			 // listaDeTexto.add(t2);
				
			  System.out.println(listaDeTexto);
				
				
				System.out.println("------------------------------");
			  
			
				Collections.sort(listaDeTexto);
				System.out.println(listaDeTexto);
			
			}
			catch ( ArrayIndexOutOfBoundsException e) {
				System.err.println("Informe tres arquivos para comparacao.");
			}

Sobre os seus métodos LerTexto e LerTexto2: para que ter 2 métodos que fazem a mesma coisa? Repare que a única coisa que muda é o nome do arquivo, todo o resto é igual. Então seria mais simples ter um único método que recebe como parâmetro o nome do arquivo.

Outro ponto é que não parece fazer sentido a mesma instância ter a contagem de 2 arquivos. Se quer usar compareTo, imagino que a ideia seja comparar um arquivo com outro, levando em conta a quantidade de palavras. Então você teria que ter uma classe que representa a contagem de um único arquivo, e duas ou mais instâncias desta classe, cada uma lendo de um arquivo (mas o método para ler é um só). Mais ou menos isso:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

// classe que conta as palavras de um arquivo
public class ContadorDePalavras implements Comparable<ContadorDePalavras> {
    private int qtdPalavras;
    private String nomeArquivo;
    public int getQtdPalavras() {
        return qtdPalavras;
    }
    public String getNomeArquivo() {
        return nomeArquivo;
    }

    // construtor recebe um nome de arquivo e conta as palavras dele
    public ContadorDePalavras(String nomeArquivo) throws IOException {
        this.nomeArquivo = nomeArquivo;
        this.qtdPalavras = 0;
        try (BufferedReader reader = new BufferedReader(new FileReader(nomeArquivo))) {
            String linha;
            while ((linha = reader.readLine()) != null) {
                for (String s : linha.split("\\s+")) {
                    if (!s.isEmpty())
                        this.qtdPalavras++;
                }
            }
        }
    }

    @Override
    public int compareTo(ContadorDePalavras o) {
        return Integer.compare(this.qtdPalavras, o.qtdPalavras);
    }
}

Mudei o nome da classe para algo que faça um pouco mais de sentido, de acordo com a função dela. Pode parecer um detalhe besta, mas dar nomes melhores ajuda a programar melhor.

Eu não criei um setter para a quantidade de palavras porque não faz sentido. A quantidade de palavras é obtida somente a partir da leitura do arquivo, então não há motivo para poder alterá-la diretamente (no seu código, imagine que eu li um arquivo com 1000 palavras, e depois eu chamo setContPalavrasArquivo(10), a contagem ficaria errada). O mesmo vale para o nome do arquivo, faz sentido mudá-lo depois que eu já li? Enfim, só crie setters (e getters) se realmente fizer sentido.

Eu mudei o algoritmo de contagem. Como o outro código parece ter funcionado, estou assumindo que as palavras são “qualquer coisa separada por espaços”. Então eu uso split para separar cada linha por espaços, e verifico se os resultados não têm strings vazias (isso acontece se a linha começa ou termina com espaços).
E repare que eu já fiz a leitura do arquivo no construtor, pois se a classe representa a contagem de palavras de um arquivo, só faz sentido ela existir se eu já tiver a contagem feita (claro que em sistemas reais isso dependeria dos requisitos, mas neste caso eu acho que faz mais sentido assim).

Também uso um bloco try-with-resources (funciona a partir do Java 7), que já fecha o arquivo ao final. Eu não estou capturando as exceções com um catch, e em vez disso estou deixando a exceção estourar, afinal, se der erro na leitura do arquivo, eu não terei a contagem de palavras, então nesse caso nem faz sentido deixar o construtor criar a instância. Só faz sentido existir um ContadorDePalavras se eu conseguir ler o arquivo até o final - se deu algum erro, eu deixei ele ser lançado e quem tentou criá-lo que faça o catch, algo assim:

// no main
try {
    // tento ler o arquivo e contar as palavras
    ContadorDePalavras c1 = new ContadorDePalavras("arquivo.txt");
    System.out.printf("Arquivo %s tem %d palavras", c1.getNomeArquivo(), c1.getQtdPalavras());
} catch (IOException e) { // se deu erro, não faz sentido criar o contador, mostra a mensagem de erro
    System.out.println("Erro ao ler arquivo: " + e.getMessage());
}

E no compareTo eu usei um método já pronto (Integer.compare), que faz o mesmo que você estava fazendo manualmente.


Agora você pode criar sua lista de contadores de palavras e ordená-la de acordo com a quantidade de palavras:

// try-catch omitido
List<ContadorDePalavras> contadores = new ArrayList<>();
contadores.add(new ContadorDePalavras("arquivo.txt"));
contadores.add(new ContadorDePalavras("outro_arquivo.txt"));
contadores.add(new ContadorDePalavras("mais_outro_arquivo.txt"));

Collections.sort(contadores); // ordenar pela quantidade de palavras
for (ContadorDePalavras cont : contadores) {
    System.out.printf("Arquivo '%s' tem %d palavras\n", cont.getNomeArquivo(), cont.getQtdPalavras());
}

Primeiramente, vc tem que se preocupar com o processo de leitura. Á medida em que seu algoritmo conseguir fazer a leitura, vc deve armazenar todo o conteúdo em uma String (caso vc concatene cada linha do arquivo) ou em um array de string (caso vc deseje armazenar cada linha separado). Aí no caso de um string que vc concatenou todo o conteúdo do documento vc deve obter o tamanho da string invocando o método lenght ou getLenght. No caso de um array de string, vc faz isso para cada posição do array e vai somando o tamanho da string de cada posição

Não precisa. Em uma passada é possível ler e processar. Como não há necessidade alguma de realizar algum tipo de backtracking, é besteira e desperdício de memória ficar mantendo tudo armazenado. Não existe o método getLength() na classe String.

Mas ele não quer o tamanho da string, e sim a quantidade de palavras. Então length não é a solução…

Quero agradecer a todos vcs de coraçao que tiveram a paciência em me ajudar, eu consegui fazer o fazer meu codigo do meu jeito, baseado no código vcs e nas explicaçoes vcs.
tem algum comando que vcs usam que eu desconhecia mas estou pesquisando em relação há isso .
Algum de comando que eu nao conhecia eram: isEmpty(), replaceAll("[^ ]","").length() ,charAt() Character.isWhitespace(c) .

Tbm me falaram para testar oStringTokenizer countTokens() eo HashMap .
Eu vi na internet uns exemplo sobre esses comando, porem não consegui aplicar esses comando em arquivotxt.

Postarem meu codigo final aqui dps de alguns ajuste há mais.

código Feito:

package teste.contarpalavrastexto;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LerTexto2  implements Comparable<LerTexto2>  {
	
	private String arquivo;
	private int totalPalavras;
	
	
	
	public int getTotalPalavras() {
		return totalPalavras;
	}
	public void setTotalPalavras(int totalPalavras) {
		this.totalPalavras = totalPalavras;
	}
	
	
	public int getQtdPalavras() {
        return totalPalavras;
        }
	
	
	
	public LerTexto2(String arquivo) {
		this.arquivo = arquivo;
	}
	public int contarPalavras() {
		
		try {
			FileReader arq = new FileReader(this.arquivo);
			BufferedReader lerArq = new BufferedReader(arq);

			this.totalPalavras = 0;
			String linha = lerArq.readLine();
			
			totalPalavras += linha.split(" ").length;

			while (linha != null) {
				linha = lerArq.readLine();

				if (linha != null) {
					totalPalavras += linha.split(" ").length;
				}
			}

			arq.close();
			//System.out.println(totalPalavras);
			return totalPalavras;
	    } catch (IOException e) {
	        System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
	    }

		return 0;
	}

	@Override
	public int compareTo(LerTexto2 tex) {
		if( this.totalPalavras < tex.getQtdPalavras() ) {
			return -1;
	}else if (this.totalPalavras > tex.getQtdPalavras()  ) {
			return 1;
	}
		
		
		
		return 0;
	}
	@Override
	public String toString() {
		return "Texto"+"["+contarPalavras()+"]";
	}
	
	

}

MAIN2
package teste.contarpalavrastexto;

import java.util.ArrayList;
import java.util.Collections;

public class Main2 {

	public static void main(String[] args) {
       

		try {
			
		ArrayList<LerTexto2> ListaDeTexto = new ArrayList<LerTexto2>();
		 LerTexto2 t1 = new LerTexto2("C:/Users/Genus/Desktop/texto.txt");
		 LerTexto2 t2 = new LerTexto2("C:/Users/Genus/Desktop/texto2.txt");
		 LerTexto2 t3 = new LerTexto2("C:/Users/Genus/Desktop/texto3.txt");
		 		 
		 ListaDeTexto.add(t1);
		 ListaDeTexto.add(t2);
		 ListaDeTexto.add(t3);

		 	 
		 System.out.println("Lista Desordenada");		 
		 System.out.println( ListaDeTexto );		 
		 System.out.println("---------------------------------------");
		 Collections.sort(ListaDeTexto);
		 System.out.println("Lista Ordenada");
		 System.out.println(ListaDeTexto);
		  
		
		}
		catch ( ArrayIndexOutOfBoundsException e) {
			System.err.println("Informe tres arquivos para comparacao.");
		}
		
		
		
	}

	

}