Java 当我将项目导出到jar时,我不能用对象编写(也可能读取)文件
我已经开发了一个小应用程序,我导出了他,但我不能写文件和可能的读取,但这我不能检查它,因为我只在应用程序启动时读取文件是否存在 项目文件夹如下所示: 项目文件夹 -------->垃圾箱 -------->src(包含tienda/gui和tienda/funcionalidad) -------->配置(文件必须保存在此处) 我有一个与其他类通信GUI的类,其中我有一个文件声明Java 当我将项目导出到jar时,我不能用对象编写(也可能读取)文件,java,file,jar,objectinputstream,objectoutputstream,Java,File,Jar,Objectinputstream,Objectoutputstream,我已经开发了一个小应用程序,我导出了他,但我不能写文件和可能的读取,但这我不能检查它,因为我只在应用程序启动时读取文件是否存在 项目文件夹如下所示: 项目文件夹 -------->垃圾箱 -------->src(包含tienda/gui和tienda/funcionalidad) -------->配置(文件必须保存在此处) 我有一个与其他类通信GUI的类,其中我有一个文件声明 package tienda.funcionalidad; import java.io.File; impor
package tienda.funcionalidad;
import java.io.File;
import java.util.ArrayList;
import tienda.funcionalidad.excepciones.NombreNoValidoException;
import tienda.funcionalidad.excepciones.PrecioNoValidoException;
import tienda.funcionalidad.excepciones.ProductoYaExisteException;
public class GestionTienda {
private static ArrayList<Product> products = new ArrayList<Product>();
public static File file = new File("config\\data.obj");
private static int idProducts = 1;
public static void increaseIdProducts(){
idProducts++;
}
public static void setIdProducts(int idProductos) {
GestionTienda.idProducts = idProductos;
}
public static int getIdProducts() {
return idProducts;
}
public static void setProducts(ArrayList<Product> products){
GestionTienda.products=products;
}
public static void addProduct(String name, double priceSerodys, double priceRamirez, double priceEntrada, double priceMercasur) throws ProductoYaExisteException, NombreNoValidoException, PrecioNoValidoException{
if(products.contains(new Product(0, name)))
throw new ProductoYaExisteException();
products.add(new Product(idProducts,name, priceSerodys, priceRamirez, priceEntrada,priceMercasur));
increaseIdProducts();
}
public static ArrayList<Product> getProducts() {
return products;
}
}
在Eclipse中,我可以读和写,但我将项目导出到jar,并使用Inno setup创建了一个安装程序,当我启动和退出应用程序时,IOException已经抛出。
Inno设置的最后一个文件夹是:
我想problen可能就是那条路。我读过一些关于getClass().getResourceAsStream方法的文章,但是我不知道如何使用它,因为我不能完全理解这个问题
你能帮我吗?这里有几个问题:
File File=new File(“config\\data.obj”)如果您的配置目录恰好位于.jar文件中,则代码>将不起作用
但是你应该考虑一个.jar“只读”。您不应该期望能够修改存储在.jar中的配置
最终文件f=
新文件(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getURI().getPath())代码>
查看此处了解更多信息:
您不应该试图写入存在于
jar文件。实际上,从技术上讲,jar文件并不保存文件,而是
它们拥有“资源”,出于实际目的,它们是只读的。
如果需要读取和写入属性文件,则应该
在罐子外面
这里有几个问题:
如您所知,File File=new File(“config\\data.obj”)如果您的配置目录恰好位于.jar文件中,则代码>将不起作用
将配置放在.jar文件中是可以接受的
但是你应该考虑一个.jar“只读”。您不应该期望能够修改存储在.jar中的配置
这就给你留下了两个选择:
a) 您可以部署希望与.jar分开更改的任何配置
b) 您的应用程序可以检查配置文件是否存在,如果不存在,则在第一次尝试访问它时从.jar中读取(并在以后所有时间从磁盘中读取)
在任何一种情况下,您都需要确定要将磁盘配置存储在何处。例如,您可能希望将其保存在与.jar相同的目录中
您可以通过以下方式确定.jar文件路径的位置:
最终文件f=
新文件(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getURI().getPath())代码>
查看此处了解更多信息:
您不应该试图写入存在于
jar文件。实际上,从技术上讲,jar文件并不保存文件,而是
它们拥有“资源”,出于实际目的,它们是只读的。
如果需要读取和写入属性文件,则应该
在罐子外面
我的问题终于解决了。当我创建必须保存配置的文件夹时,请不要设置正确的权限。对不起,如果你把时间花在我身上。我的问题终于解决了。当我创建必须保存配置的文件夹时,请不要设置正确的权限。抱歉,如果你和我在一起的话。“你可以这样确定.jar的文件路径:“不,你不能。首先。其次,getPath()不返回有效的文件名,它返回URI的路径部分,其中可能包含转义百分比。配置应该写入到一个已知的位置,比如用户主目录下的某个目录(在Windows中通常为%APPDATA%,在OS X中为~/Library/Application Support,在Linux中为~/.config)。我希望在jar之外进行读写。我需要使用您编写的代码并修改类文件以连接文件名吗?我尝试了这个方法,但不起作用:ObjectOutputStream salida=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file+“\\config\\data.obj”))感谢您的帮助和时间。“您可以像这样确定.jar文件路径的位置:“不,您不能。”。首先。其次,getPath()不返回有效的文件名,它返回URI的路径部分,其中可能包含转义百分比。配置应该写入到一个已知的位置,比如用户主目录下的某个目录(在Windows中通常为%APPDATA%,在OS X中为~/Library/Application Support,在Linux中为~/.config)。我希望在jar之外进行读写。我需要使用您编写的代码并修改类文件以连接文件名吗?我尝试了这个方法,但不起作用:ObjectOutputStream salida=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream)(file+“\\config\\data.obj”))感谢您的帮助和时间。所以您决定在.jar外部手动创建一个配置文件夹(如VGR和我建议的那样)?感谢您的更新:)是的,使用Inno安装程序可以轻松创建所需的文件夹并确认他的个人信息
package tienda.funcionalidad;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class Files {
public static void write(ArrayList<Product> product ,
File file) throws IOException {
try(ObjectOutputStream salida = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)))) {
salida.writeObject(product);
salida.writeInt(GestionTienda.getIdProducts());
}
}
public static void read(File file) throws ClassNotFoundException, IOException {
try(ObjectInputStream entrada= new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)))) {
GestionTienda.setProducts((ArrayList<Product>) entrada.readObject());
GestionTienda.setIdProducts(entrada.readInt());
}
}
}
private void loadFile() {
try {
if (GestionTienda.file.exists())
Files.read(GestionTienda.file);
else
Files.write(GestionTienda.getProducts(), GestionTienda.file);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(frame, "Error Load",
"Error class", JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(frame, "Error Load",
"Error IO", JOptionPane.ERROR_MESSAGE);
}
}
private void saveExit() {
try {
Files.write(GestionTienda.getProducts(), GestionTienda.file);
} catch (IOException e) {
JOptionPane.showMessageDialog(frame, "Error Load",
"Error IO exit", JOptionPane.ERROR_MESSAGE);
} finally {
System.exit(0);
}
}