2009-01-12 12 views
51

Así que mi resolución de 2009 años nuevos es aprender Java. Recientemente adquirí "Java for Dummies" y he estado siguiendo junto con el código de demostración en el libro volviéndolo a escribir usando Eclipse. De todos modos, todos los ejemplos del libro que usa una ruta relativa no parecen leer el archivo .txt del que se supone que debe leer.¿Cómo funcionan las rutas relativas de archivos en Eclipse?

Aquí es el código de ejemplo:

import java.util.Scanner; 
import java.io.File; 
import java.io.IOException; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import java.awt.GridLayout; 

class TeamFrame extends JFrame { 

    public TeamFrame() throws IOException { 
     PlayerPlus player; 
     Scanner myScanner = new Scanner(new File("Hankees.txt")); 

     for (int num = 1; num <= 9; num++) { 
      player = new PlayerPlus(myScanner.nextLine(), myScanner.nextDouble()); 
      myScanner.nextLine(); 
      addPlayerInfo(player); 
     }  

     add(new JLabel()); 
     add(new JLabel(" ------")); 
     add(new JLabel("Team Batting Aberage:")); 
     add(new JLabel(PlayerPlus.findTeamAverageString())); 
     setTitle("The Hankees"); 
     setLayout(new GridLayout(11,2)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    void addPlayerInfo(PlayerPlus player) { 
     add(new JLabel(player.getName())); 
     add(new JLabel(player.getAverageString())); 
    } 
} 

y se puede ver en la siguiente captura de pantalla He incluido este archivo.

imagen ya no está disponible

Además, he comprobado que cuando construyo la aplicación que una copia de Hankees.txt se coloca en la carpeta bin con los archivos .class compilados.

Por último, si cambio la línea 12 a la siguiente y coloco Hankees.txt en la raíz de mi C: \ unidad el programa compila y funciona bien.

Scanner myScanner = new Scanner(new File("C:\\Hankees.txt")); 

Entonces, básicamente, mi pregunta es ¿qué estoy haciendo mal? ¿O es Eclipse responsable de esto de alguna manera?

¡Gracias por toda la ayuda!

+1

comentario tangencial: Estoy receloso de cualquier libro que tenga "tontos" en el título. Pruebe "Thinking in Java" de Bruce Eckel o "Learning Java" de Niemeyer & Knudsen, ambos son muy buenos. –

+0

La última vez que revisé Java for Dummies, estaba basado en Java 1.2. ¿Lo han actualizado recientemente? –

Respuesta

69

Es necesario "src/Hankees.txt"

Su archivo está en la carpeta de origen que no se cuenta como el directorio de trabajo. \

o puede mover el archivo hasta el directorio raíz de su proyecto y sólo tiene que utilizar "Hankees.txt"

+0

¡Sí, eso funcionó! ¿Puedes explicar por qué sucede esto? Después de todo, el archivo está en la carpeta src donde están almacenados los archivos .class, ¿por qué tengo que definir la carpeta src nuevamente? – PHLAK

+4

Um, creo que los eclips por diseño hacen que el directorio de su proyecto sea el directorio de trabajo del programa. No sé por qué lo hacen de esa manera. Y muchas personas tienen carpetas/bin y/src, por lo que/src no está donde están los archivos .class. – jjnguy

+0

¿Qué sucede si tienes el archivo en una carpeta debajo del directorio raíz, como Baseball/players/Hankees.txt? –

5

Sí, eclipse ve el directorio superior como el directorio de trabajo/raíz, a los efectos de las rutas.

... pensé en agregar algo de información extra. ¡Soy nuevo aqui! Me gustaría ayudar.

2

Parafraseando a partir http://java.sun.com/javase/6/docs/api/java/io/File.html:

Las clases bajo java.io resolver rutas relativas, contra el directorio de usuario actual, que suele ser el directorio en el que se inició la máquina virtual.

Eclipse establece el directorio de trabajo en la carpeta del proyecto de nivel superior.

7

La ruta de compilación de un proyecto define qué recursos de las carpetas de origen se copian en las carpetas de salida. Por lo general, esto está configurado para Incluir todos los archivos.

Nuevas configuraciones de ejecución predeterminadas para usar el directorio del proyecto para el directorio de trabajo, aunque esto también se puede cambiar.

Este código muestra la diferencia entre el directorio de trabajo, y la ubicación de donde la clase se carga desde:

public class TellMeMyWorkingDirectory { 
    public static void main(String[] args) { 
     System.out.println(new java.io.File("").getAbsolutePath()); 
     System.out.println(TellMeMyWorkingDirectory.class.getClassLoader().getResource("").getPath()); 
    } 
} 

La salida es probable que sea algo como:

C:\your\project\directory 
/C:/your/project/directory/bin/ 
7

Esto es muy similar a otra pregunta. How should I load files into my Java application?

¿Cómo debo cargar mis archivos en mi aplicación Java?

Usted no lo hace desea cargar sus archivos en por:

C:\your\project\file.txt 

esto es mal!

Debe usar getResourceAsStream.

InputStream inputStream = YourClass.class.getResourceAsStream(“file.txt”); 

Y también se debe utilizar File.separator; que es el carácter separador de nombre dependiente del sistema, representado como una cadena por conveniencia.

+0

Buena información para saber, gracias! – PHLAK

+1

Debe decir por qué "esto es malo" – jason

+1

El "por qué esto es malo" se describe mejor en el enlace que publiqué.Este es el tldr; respuesta :) –

1

tengo el mismo problema. Si YourClass y Hankees.txt tienen un directorio en su proyecto, entonces encuentro siguiente, no tan malo.

import java.net.URL; 
//<...> 
URL url = YourClass.class.getClassLoader().getResource("Hankees.txt"); 
String filesPathAndName = url.getPath();   
Scanner myScanner = new Scanner(new File(filesPathAndName)) 
//<...> 
+0

Eso no funciona, devuelve un nulo con FileNotFound (Java 1.7) en mi programa similar. – Pille

1

Siempre se puede obtener la ruta de tiempo de ejecución mediante:

String path = new File(".").getCanonicalPath(); 

Esto proporciona información valiosa acerca de dónde colocar los archivos y recursos.

Cuestiones relacionadas