Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我将项目导出到jar时,我不能用对象编写(也可能读取)文件_Java_File_Jar_Objectinputstream_Objectoutputstream - Fatal编程技术网

Java 当我将项目导出到jar时,我不能用对象编写(也可能读取)文件

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

我已经开发了一个小应用程序,我导出了他,但我不能写文件和可能的读取,但这我不能检查它,因为我只在应用程序启动时读取文件是否存在

项目文件夹如下所示:

项目文件夹

-------->垃圾箱

-------->src(包含tienda/gui和tienda/funcionalidad)

-------->配置(文件必须保存在此处)

我有一个与其他类通信GUI的类,其中我有一个文件声明

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中的配置

  • 这就给你留下了两个选择:

    a) 您可以部署希望与.jar分开更改的任何配置

    b) 您的应用程序可以检查配置文件是否存在,如果不存在,则在第一次尝试访问它时从.jar中读取(并在以后所有时间从磁盘中读取)

  • 在任何一种情况下,您都需要确定要将磁盘配置存储在何处。例如,您可能希望将其保存在与.jar相同的目录中

    您可以通过以下方式确定.jar文件路径的位置:

  • 最终文件f=
    新文件(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getURI().getPath())

  • 查看此处了解更多信息:

    您不应该试图写入存在于 jar文件。实际上,从技术上讲,jar文件并不保存文件,而是 它们拥有“资源”,出于实际目的,它们是只读的。 如果需要读取和写入属性文件,则应该 在罐子外面


  • 这里有几个问题:

  • 如您所知,
    File File=new File(“config\\data.obj”)将不起作用

  • 将配置放在.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);
        }
    }