我已经开发了一个小应用程序,我将他导出了,但是我无法写文件并且无法读取,但是我无法检查它,因为我只能在应用程序启动时读取文件是否存在。
项目文件夹是这里:
项目文件夹。
--------> 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的最终文件夹是:
我想问题可能是路径。我已经阅读了有关getClass()。getResourceAsStream方法的内容,但是我不知道如何使用它,因为我无法完全理解问题。
你能帮我吗?
答案 0 :(得分:2)
这里有两个问题:
您已经知道,如果您的配置目录恰好位于.jar文件中,则File file = new File("config\\data.obj");
将不起作用。
将您的配置放入.jar文件中。
但是您应该将.jar文件视为“只读”。您不应期望能够修改存储在您的.jar中的配置。
这给您两个选择:
a)您可以部署希望从.jar中单独更改 的任何配置。
b)您的应用程序可以检查配置文件是否存在,如果不存在,请在首次尝试访问.jar时从.jar读取(然后在以后的所有时间从磁盘读取)。
在任何一种情况下,您都需要准确确定要存储磁盘配置的位置。例如,您可能希望将其与.jar放在同一目录中。
您可以像下面这样确定您的.jar文件路径:
final File f =
new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getURI().getPath());
Reading/Writing to Properties Files inside the jar file
您不应该尝试写入内部存在的“文件” jar文件。实际上,从技术上讲,jar文件不保存文件,而是保存 它们拥有“资源”,并且出于实际目的,它们是只读的。 如果需要读取和写入属性文件,则应为 在罐子外面。
答案 1 :(得分:1)
最后,我的问题解决了。当我创建必须保存配置的文件夹时,请不要放置正确的权限。抱歉,如果您花时间陪伴我。