当我将项目导出到jar时,无法使用对象写入(可能读取)文件

时间:2018-08-14 20:04:06

标签: java file jar objectinputstream objectoutputstream

我已经开发了一个小应用程序,我将他导出了,但是我无法写文件并且无法读取,但是我无法检查它,因为我只能在应用程序启动时读取文件是否存在。

项目文件夹是这里:

项目文件夹。

--------> bin

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

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

...

我有一个与GUI进行通讯的类,其中我有一个File声明。

var arr = [1000,2000,5000,4000,300,0,1250];
var newArr = [];
arr.forEach(function(item, index){
    if(index+1<arr.length){
      newArr.push(item-arr[index+1]);
    }
});
console.log(newArr);

我有一个读写类。

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;
    }



}

当主类开始时,如果文件不存在,则创建它。

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());
        }
    }

}

在Eclipse中,我可以读写,但是我将项目导出到jar中,并使用Inno Setup创建了一个安装程序,当我启动和退出该应用程序时,IOException异常。 使用Inno Setup的最终文件夹是:

appfolder

我想问题可能是路径。我已经阅读了有关getClass()。getResourceAsStream方法的内容,但是我不知道如何使用它,因为我无法完全理解问题。

你能帮我吗?

2 个答案:

答案 0 :(得分:2)

这里有两个问题:

  1. 您已经知道,如果您的配置目录恰好位于.jar文件中,则File file = new File("config\\data.obj");将不起作用。

  2. 将您的配置放入.jar文件中。

    但是您应该将.jar文件视为“只读”。您不应期望能够修改存储在您的.jar中的配置。

  3. 这给您两个选择:

    a)您可以部署希望从.jar中单独更改 的任何配置。

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

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

    您可以像下面这样确定您的.jar文件路径:

final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getURI().getPath());

  1. 在这里查看更多信息:
      

    Reading/Writing to Properties Files inside the jar file

         

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

答案 1 :(得分:1)

最后,我的问题解决了。当我创建必须保存配置的文件夹时,请不要放置正确的权限。抱歉,如果您花时间陪伴我。