Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 启动可分发文件时,如何写入文件?_Java_Filewriter - Fatal编程技术网

Java 启动可分发文件时,如何写入文件?

Java 启动可分发文件时,如何写入文件?,java,filewriter,Java,Filewriter,我有一个从文件中读取的程序。现在我创建了另一个任务,目标是更新/将此文件写入相同的文件。我现在的问题是,当我生成项目的可分发文件时,在运行和尝试更新我的文件时,它不会写入/更新我的更改。如果我直接在IDE上运行它,它可以正常工作。这就是我到目前为止所做的: private void tbleAddressMouseClicked(java.awt.event.MouseEvent evt) { if(t

我有一个从文件中读取的程序。现在我创建了另一个任务,目标是更新/将此文件写入相同的文件。我现在的问题是,当我生成项目的可分发文件时,在运行和尝试更新我的文件时,它不会写入/更新我的更改。如果我直接在IDE上运行它,它可以正常工作。这就是我到目前为止所做的:

private void tbleAddressMouseClicked(java.awt.event.MouseEvent evt) {                                           
    if(tbleAddress.getSelectedColumn()==3){
        AddressUtil util = new AddressUtil();
        List<AddressUtil> lists = util.getAddresses();
        Address address = lists.get(tbleAddress.getSelectedRow());
        if(tbleAddress.getValueAt(tbleAddress.getSelectedRow(), 0)!=null){
            address.setRegion("\""+tbleAddress.getValueAt(tbleAddress.getSelectedRow(), 0).toString()+"\"");
        }
        lists.set(tbleAddress.getSelectedRow(), address);
    try {
        FileWriter fw;
        fw = new FileWriter("./src/address.csv"); // This is where I doubt, if my **jar** file reads this directory
        for(Address a:lists){
            fw.append(a.getRegion);
            fw.append(",");
            fw.append(a.getAddressName());
            fw.append("\n");
            fw.flush();
        }
        fw.close();
    } ...

非常感谢您提供的任何帮助

您在写入文件时遇到的问题很可能是由于您在定义FileWriter时使用的相对路径造成的。路径中的点表示当前工作目录,因此如果您的程序位于路径C:\myProgram,并且您运行的程序使用此路径作为工作目录,那么它将查找C:\myProgram\src\address.csv

因此,根据程序的要求,相对路径可能是合适的,在这种情况下,您需要确定正确的路径,并确保文件存在于该位置,或者您可以使用其他机制来查找文件


我还注意到,您正在使用getResourceAsStream向文件获取InputStream。您应该知道,只有当文件在您的程序上可用时,这才有效

./src/address.csv是一个相对路径,那么您的可分发文件所在的目录中是否有src目录?您在src目录中有address.csv吗?您应该记录异常,或者至少将它们打印到stdout,以便更轻松地跟踪问题。当您运行可分发文件时,请使用java命令行运行它,以便可以看到stdout。另外,看看如果我把./src/address.csv放在我的可分发文件目录中,我的getAddresses方法会读取我的./src/address.csv文件吗?这可能会有更好的机会,因为在读取/写入文件时会出现很多问题,所以我不能确定。您可以尝试一下,看看会发生什么。我尝试过,但无法读取我的文件。在不将其保存到数据库的情况下,最好的方法是什么?我的意思是,我读取的文件也是我将要修改的文件,但不是驻留在csv文件中。运行程序时,您会看到什么错误或异常?而且,更好的方法可能意味着什么。您可以使用许多不同的方法,例如使用配置文件指定要写入的文件的路径、允许用户在运行时选择文件的路径、在程序开始时使用程序参数传递文件路径等。感谢您的帮助,dist文件夹是否可以读取其外部的目录?例如,在目录C:\MyDocument\MyProject\address.csv上,我只是通过将地址列表放入数据库来解决这个问题,但我认为我并不满足,因为我的目标只是从文件中读取和操作。是的,当然。您的程序可以从文件系统的任何位置读取数据,只要它有适当的权限这样做,并且没有发生任何类型的错误。您给出的路径类型是绝对路径。如果您的程序硬编码为从该路径读取,则程序的所有用户都必须将文件存储在该位置。通过硬编码,我的意思是它被写入程序本身,而不是外部可配置。请注意,如果确实使用了Windows路径,则假定所有用户都在使用Windows,除非您允许用户配置该路径。
public List<Address> getAddresses() {
    List<Address> addresses = new ArrayList<>();
    BufferedReader br = null;
    InputStream in = this.getClass().getResourceAsStream("/address.csv"); 
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while((line = reader.readLine())!=null){
            String[] result = line.split(",");
            Address address = new Address();
            address.setRegion(result[0]);
            address.setAddressName(result[1]);
            addresses.add(address);
        }...
"Region I","Sample St., Sample Address"
"Region II","Sample St., Sample Address 2"
...