¿Cómo funcionan las rutas relativas de archivos en Eclipse?

Entonces mi resolución de año nuevo de 2009 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.

Aquí está 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 puede ver en la captura de pantalla siguiente que he incluido este archivo.

la imagen ya no está disponible

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

Por último, si cambio la línea 12 a la siguiente y coloco Hankees.txt en la raíz de mi unidad C: \ el progtwig comstack 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 cualquier y toda la ayuda!

Necesitas "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 al directorio raíz de su proyecto y simplemente usar "Hankees.txt"

La ruta de comstackció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.

Las nuevas configuraciones de ejecución predeterminan 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 se cargó la clase:

 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 así como:

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

Esto es realmente similar a otra pregunta. ¿Cómo debo cargar archivos en mi aplicación Java?

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

No desea cargar sus archivos por:

 C:\your\project\file.txt 

esto es malo!

Deberías usar getResourceAsStream.

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

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

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

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

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

Las clases en java.io resuelven nombres de ruta relativos contra el directorio de usuario actual, que generalmente es 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.

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)) //<...> 

Siempre puedes obtener tu ruta de tiempo de ejecución usando:

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

Esto proporciona información valiosa sobre dónde colocar archivos y recursos.