significa - tipos de paquetes en java
¿Dónde poner un archivo para leer desde una clase en un paquete en Java? (6)
Class.getResource buscará en el directorio de su paquete un archivo del nombre especificado.
O getResourceAsStream a veces es más conveniente ya que probablemente quiera leer el contenido del recurso.
Tengo un archivo de propiedades que contiene el nombre de archivo solo diga file=fileName.dat
. Puse el archivo de propiedades debajo de la ruta de la clase y pude leer el nombre del archivo (archivo.dat) correctamente desde la mainClass
. Después de leer el nombre del archivo, pasé el nombre del archivo (solo nombre, no la ruta) a otra clase en un paquete que dice pack.myClass
para leer ese archivo. Pero el problema es pack.myClass
no pudo obtener la ruta del archivo correctamente. Puse el archivo fileName.dat
tanto dentro como fuera del paquete pero no pude hacerlo funcionar.
¿Alguien puede sugerirme dónde poner el archivo fileName.dat
para que pueda leerlo correctamente y toda la aplicación también sería portátil?
¡Gracias!
El código que estoy usando para leer el archivo de configuración y obtener el nombre del archivo:
Properties prop = new Properties();
InputStream in = mainClass.class.getResourceAsStream("config.properties");
prop.load(in);
in.close();
myClass mc = new myClass();
mc.readTheFile(prop.getProperty("file"));
/*until this code is working good*/
Luego en myClass
que está bajo el paquete denominado pack
, estoy haciendo:
public void readTheFile(String filename) throws IOException {
FileReader fileReader = new FileReader(filename); /*this couldn''t get the file whether i''m putting the file inside or outside the package folder */
/*after reading the file I''ve to do the BufferReader for further operation*/
BufferedReader bufferedReader = new BufferedReader(fileReader);
Cuando utiliza un nombre de archivo relativo como fileName.dat
, está solicitando un archivo con este nombre en el directorio actual . El directorio actual no tiene nada que ver con los paquetes. Es el directorio desde el que se inicia la JVM.
Entonces, si está en el directorio c:/foo/bar
cuando java -cp ... pack.MyClass
su aplicación (usando java -cp ... pack.MyClass
), buscará el archivo c:/foo/bar/fileName.dat
.
La mayoría de las veces, sería mejor buscar el "fileName.dat"
en algún lugar de la carpeta "user.home"
, que es una propiedad del sistema . Primero crea una ruta de File
desde "user.home"
y luego intenta encontrar el archivo allí. Esto es una pequeña suposición ya que no proporciona el usuario exacto de la aplicación, pero este sería el lugar más común.
Actualmente estás leyendo de la carpeta actual que está determinada por
String currentDir = new File(".").getAbsolutePath();
o
System.getProperty("user.dir")
Para leer un archivo, incluso desde dentro de un archivo jar:
readTheFile(String package, String filename) throws MalformedURLException, IOException
{
String filepath = package+"/"+filename;
// like "pack/fileName.dat" or "fileName.dat"
String s = (new SourceBase()).getSourceBase() + filepath;
URL url = new URL(s);
InputStream ins = url.openStream();
BufferedReader rdr = new BufferedReader(new InputStreamReader(ins, "utf8"));
do {
s = rdr.readLine();
if(s!= null) System.out.println(s);
}
while(s!=null);
rdr.close();
}
con
class SourceBase
{
public String getSourceBase()
{
String cn = this.getClass().getName().replace(''.'', ''/'') + ".class";
// like "packagex/SourceBase.class"
String s = this.getClass().getResource(''/'' + cn).toExternalForm();
// like "file:/javadir/Projects/projectX/build/classes/packagex/SourceBase.class"
// or "jar:file:/opt/java/PROJECTS/testProject/dist/
// testProject.jar!/px/SourceBase.class"
return s.substring(0, s.lastIndexOf(cn));
// like "file:/javadir/Projects/projectX/build/classes/"
// or "jar:file:/opt/java/PROJECTS/testProject/dist/testProject.jar!/"
}
}
Supongo que está tratando de leer el archivo de propiedades usando el método de clase getResource. Si coloca el archivo de propiedades en la raíz de la ruta de clase, debe agregar el nombre del archivo al prefijo ''/'' para indicar la raíz de classpath, por ejemplo getResource ("/ file.dat"). Si el archivo de propiedades está en la misma carpeta que la clase en la que invoca el método getResource, entonces no debe usar el prefijo ''/''.
Tratar..
myClass mc = new myClass();
InputStream in = mc.getClass().getResourceAsStream("/pack/config.properties");
..o simplemente
InputStream in = mc.getClass().getResourceAsStream("config.properties");
..para la última línea si la main
está en myClass
El cargador de clases disponible en main()
a menudo será el cargador de clases bootstrap, a diferencia del cargador de clases destinado a los recursos de la aplicación.