Contador de Palabras de un .txt traido por un FileChooser

Necesito separar las palabras y contarlas, sin que me las marque dos veces, o sea que me muestre una palabra y cuantas veces se repite, lo traigo con el JFileChooser y ssi lo lee pero no se como hacer lo demas.
Esto es lo que tengo del codigo

import java.io.*;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

public class LeerArchivos {

   
    static JFileChooser selector;
       // File file ;
        FileInputStream fis;
        BufferedInputStream bis;
        DataInputStream dis;
    public static void main(String args[]) throws Exception {
        selector = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("txt Texto", "txt");
        selector.setFileFilter(filter);
        int name = selector.showOpenDialog(selector);
        File archivo = LeerArchivos.selector.getSelectedFile();
        File file = archivo;
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        DataInputStream dis = null;
        LeerArchivos lr = new LeerArchivos();
        String pp = lr.lector(file);
        JOptionPane.showMessageDialog(null, pp );
    }
     public String lector(File archivo) throws IOException{
           
            File file= archivo;
            fis = new FileInputStream(file);
            String p = "";
            bis = new BufferedInputStream(fis);
            dis = new DataInputStream(bis);
            while (dis.available() != 0) {
               
               p= p+"\n"+dis.readLine();
               
            }

            fis.close();
            bis.close();
            dis.close();
         return p;
    }
}
<code>

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Jose Manuel

Puedes usar un HashMap

Puedes usar un HashMap recuerdo que una vez el señor @bferro respondió una duda parecida. Revisa sus comentarios. O realiza una búsqueda en el sitio.
Utiliza las etiquetas code para resaltar la sintaxis. Saludos.

Gracias por tu respuetas pero...

Gracias por tu respuesta, pero no entiendo como usar HashMap, y no encuentro la respuesta del señor @bferro , no se si me podrias ayudar un poco mas, ya sea explicandome el uso del HashMap o de alguna otra forma.
De antemano gracias

Imagen de Jose Manuel

Mi chavo, buscale bien

Mi chavo, buscale bien :)
http://www.javamexico.org/foros/java_standard_edition/leer_archivo_de_texto
Si tienes dudas sobre algo del código deja tu pregunta y chance te puedo ayudar.

Adaptar el codigo

Si entiendo el codigo pero no se como adaptarlo a lo que ya tengo, ni al JFileChooser, no se si me puedas ayudar en lo que buiene siendo a como adaptar e el JFileChooser.
De antemano Gracias

Imagen de Jose Manuel

Entonces aun no lo entiendes

Entonces aun no lo entiendes completamente.... Inicie modificando parte de tu código y termine por cambiar todo... D: Lo que pasa es que estabas usando un método que esta desaconsejado, el de tu variable dis.
Te dejo el código con los cambios. El método de contarPalabras se lo he robado a @bferro :) osea, la solución realmente la tenias desde hace rato, lee la explicación que dio el señor @bferro.

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class LeerArchivos {
     
    private static final FileNameExtensionFilter FILTRO = new FileNameExtensionFilter("txt Texto", "txt");
    private static Map<String, Integer> mapa = new HashMap<>();
   
    public static void main(String args[]) {
        mapa = contarPalabras(obtenerFichero(), mapa);
       
        System.out.println("Palabras "+ mapa.keySet());
        System.out.println("Mapa "+ mapa);
    }
     public static Map<String, Integer> contarPalabras(File archivo, Map<String, Integer> mapa) {
         if(archivo != null) {
             Scanner lectura;
             Pattern patron = Pattern.compile("[.;\\s,?¿!]");              
             try {
                 lectura = new Scanner(archivo);
                 lectura.useDelimiter(patron);
                 String palabra;
                 while(lectura.hasNext()) {
                     palabra = lectura.next();
                     Integer frecuencia = mapa.get(palabra);
                     if(palabra.length() != 0) {
                         mapa.put(palabra.toLowerCase(), (frecuencia == null) ? 1 : frecuencia + 1);
                     }
                 }
                 lectura.close();
                 return mapa;
             } catch (FileNotFoundException ex) {
                 ex.printStackTrace();
             }              
         }
         return mapa;
    }
    private static File obtenerFichero() {
        JFileChooser selector = new JFileChooser();        
        selector.setFileFilter(FILTRO);
        int valorJFC = selector.showDialog(null, "Escoje el fichero");
       
        if(valorJFC == JFileChooser.APPROVE_OPTION) {
            return selector.getSelectedFile();
        }
        return null;
    }
}

Gracias

Muchas gracias, ya vi como tenia que ser, pero al final solo me imprime

Palabras []
Mapa {}
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
        at sun.java2d.Disposer.run(Disposer.java:145)
        at java.lang.Thread.run(Thread.java:722)
BUILD SUCCESSFUL (total time: 13 seconds)
<code>
Imagen de Jose Manuel

Estas usando el código que te

Estas usando el código que te di? Por que lo probé y esta funcionando bien. Si no es el mismo código, publicalo para verlo.

Es el mismo

Es el mismo, no modifique nada ni nada y solo imprime

Palabras []
Mapa {}
<code>
<code>

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class LeerArchivos {
     
    private static final FileNameExtensionFilter FILTRO = new FileNameExtensionFilter("txt Texto", "txt");
    private static Map<String, Integer> mapa = new HashMap<>();
   
    public static void main(String args[]) {
        mapa = contarPalabras(obtenerFichero(), mapa);
       
        System.out.println("Palabras "+ mapa.keySet());
        System.out.println("Mapa "+ mapa);
    }
     public static Map<String, Integer> contarPalabras(File archivo, Map<String, Integer> mapa) {
         if(archivo != null) {
             Scanner lectura;
             Pattern patron = Pattern.compile("[.;\\s,?¿!]");              
             try {
                 lectura = new Scanner(archivo);
                 lectura.useDelimiter(patron);
                 String palabra;
                 while(lectura.hasNext()) {
                     palabra = lectura.next();
                     Integer frecuencia = mapa.get(palabra);
                     if(palabra.length() != 0) {
                         mapa.put(palabra.toLowerCase(), (frecuencia == null) ? 1 : frecuencia + 1);
                     }
                 }
                 lectura.close();
                 return mapa;
             } catch (FileNotFoundException ex) {
                 ex.printStackTrace();
             }              
         }
         return mapa;
    }
    private static File obtenerFichero() {
        JFileChooser selector = new JFileChooser();        
        selector.setFileFilter(FILTRO);
        int valorJFC = selector.showDialog(null, "Escoje el fichero");
       
        if(valorJFC == JFileChooser.APPROVE_OPTION) {
            return selector.getSelectedFile();
        }
        return null;
    }
}

<code>

Imagen de Jose Manuel

Eh estado leyendo y parece

Eh estado leyendo y parece ser que es un bug relacionado con el JFileChooser y sun.awt.Disposer, si esto es cierto, puede que este mas allá de mis conocimientos actuales.
Pero por lo que he leído si se instancia el JFileChooser nada mas al iniciar la aplicación (en el main) puede evitarse la excepción. Prueba este código haber si funciona:

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class LeerArchivos {
    private static JFileChooser selector;
    private static final FileNameExtensionFilter FILTRO = new FileNameExtensionFilter("txt Texto", "txt");
    private static Map<String, Integer> mapa = new HashMap<>();
   
    public static void main(String args[]) {
        selector = new JFileChooser();  
        mapa = contarPalabras(obtenerFichero(), mapa);
       
        System.out.println("Palabras "+ mapa.keySet());
        System.out.println("Mapa "+ mapa);
    }
     public static Map<String, Integer> contarPalabras(File archivo, Map<String, Integer> mapa) {
         if(archivo != null) {
             Scanner lectura;
             Pattern patron = Pattern.compile("[.;\\s,?¿!]");              
             try {
                 lectura = new Scanner(archivo);
                 lectura.useDelimiter(patron);
                 String palabra;
                 while(lectura.hasNext()) {
                     palabra = lectura.next();
                     Integer frecuencia = mapa.get(palabra);
                     if(palabra.length() != 0) {
                         mapa.put(palabra.toLowerCase(), (frecuencia == null) ? 1 : frecuencia + 1);
                     }
                 }
                 lectura.close();
                 return mapa;
             } catch (FileNotFoundException ex) {
                 ex.printStackTrace();
             }              
         }
         return mapa;
    }
    private static File obtenerFichero() {      
        selector.setFileFilter(FILTRO);
        int valorJFC = selector.showDialog(null, "Escoje el fichero");
       
        if(valorJFC == JFileChooser.APPROVE_OPTION) {
            return selector.getSelectedFile();
        }
        return null;
    }
}

No funciono

No se pudo, lo mas posible es que si sea el bug, entonces intentare sacar la direccion de otro manera, gracias

Imagen de Jose Manuel

Pues que mala pata. Puedes

Pues que mala pata. Puedes decirme que IDE usas y la plataforma en la que estas, solo para tener en cuenta esto para el futuro. Ojala y uno de los expertos de la comunidad vean esto y puedan ayudarte, porque yo aquí me quedo corto.

Y por lo mientras con que le pases la dirección donde se encuentra el archivo debería bastar. Así:

...
public static void main(String args[]) {
    mapa = contarPalabras(new File("ruta_al_archivo"), mapa);
    ....
}

Gracias

Si la verdad uso NetBeans IDE 7.1.2 si solo le pasare la direccion con un del JOP que lo pida, ya ni me acuerdo de como se llama a descanzar un poco y a seguirle. De nuevo gracias por tu tiempo

Imagen de bferro

Scanner(File) vs Scanner(InputStream)

Tienes dos problemas en tu código.
El primer problema se refiere a construir un Scanner con un objeto de tipo File en lugar de construirlo con un objeto de tipo InputStream.
El segundo problema está relacionado con el uso de un FileChooser fuera de un contexto correcto de una aplicación Swing.

¿A qué se refiere el primer problema?
No es clara la descripción de los constructores Scanner (File in) y Scanner(InputStream in) que hace Oracle en la documentación del API de la clase Scanner. si te guías por esa documentación, ambos constructores sería válidos y válido también sería la utilización de los diversos métodos de tipo next......() que dispone un objeto Scanner para retornar los tokens siguiendo el patrón que indica la separación de los mismos.
El caso real es que no es así y por alguna razón que no está documentada, un scanner construido con Scanner(File) no se comporta igual que un scanner construido con Scanner(InputStream).
Para no repetir lo que está disponible en la red, te remito a este sitio de Stackoverflow para que leas algunas de las causas posibles.
Para arreglar tu código, puedes hacer dos cosas: una es crear tu scanner en el método contarPalabras que tomaste de algo que escribí hace algún tiempo con la expresión siguiente:

lectura =new Scanner(archivo, "latin1") //algo relacionado con el charset

La otra opción (que es la que te aconsejo) es que dejes el primer argumento de tipo InputStream como está en el post original y que entonces crees un FileInputStream a partir del objeto File que te entrega el FileChooser. Así:

File f =obtenerFichero();
FileInputStream in = new FileInputStream(f);
mapa =contarPalabras(f,mapa);

El segundo problema que provoca el disparo de excepciones tiene que ver con Swing probablemente. Revisa los ejemplos de FileChooser que están en el trail de Swing del Java Tutorial y arregla tu código acorde.

Imagen de Jose Manuel

Safe! :)

Orale yo presentía que algo de este tipo estaba pasando pero simplemente no daba con la solución, no me paso por la mente que se pudiera tratar de dos problemas y no solo uno. Yo estaba convencido de que era el FileChooser y que era porque estaba fuera del contexto de un Frame o por un bug del que hablaban en la red.

Tendré cuidado con el uso de los ficheros con la clase Scanner. Espero que ahora si nuestro compañero pueda resolver su problema.
Gracias señor @bferro.