如何将带有writeObject()的txt导出到字符串中的路径?

时间:2016-01-15 19:49:56

标签: java export outputstream fileoutputstream

我一直在尝试使用writeObject方法导出但是如果我在调用ObjectOutputStream()方法时直接在输出中直接写出我想要的文件的名称(或路径),我只实现了导出txt。 我想要的是调用我创建的方法,询问用户他想要的文件的名称,然后我将它连接到它应该找到的路径的其余部分,但它不起作用。

这就是我想要使用的:

ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream(nombreArchivo()));

这是使其成功的唯一方法:

ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream("NameOfTheFileOrCompletePath.txt"));

但是我总是在执行时收到catch块的消息:

当我执行程序并尝试导出数据时,我得到了catch块的消息:

/*nombreArchivo is the String with the String returned by nombreArchivo.

与编写FileOutputStream(nombreArchivo()))相同; * /     尝试{                 ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream(nombreArchivo)); // SERIA EL ARG NOMBREARCHIVO

            fpsalida.writeObject(listaprod); //Hay que pasarle el return de la lista de prod.CREAR LA FUNC RETORNAPROD
            System.out.println("\nExportado!\n");

        }catch (IOException e){
            System.out.println("No se ha podido exportar!\n");
        }

    return;
}

这是我们感兴趣的nombreArchivo方法的一部分:

System.out.println("\nWrite the name of the file you want: ");
    archivoSalida += sc.nextLine() + ".txt";
    System.out.println("==============================================\n");

    //archivoSalida is defined as a String
    return archivoSalida;

}

谢谢。

3 个答案:

答案 0 :(得分:1)

问题的原因是该文件夹之前没有创建。我认为该方法如果该目录不存在,则会创建它。

答案 1 :(得分:0)

由于您在对文件名进行硬编码时没有收到IOException,因此问题是nombreArchivo()返回的字符串的实际内容。

要调试问题的特定性质,请将返回的字符串分配给变量,然后记录它,或者在System.err上将其打印出来,这样您就可以看到它的真实含义:

String fileName = nombreArchivo();
System.err.println("str = \"" + str + \"");
ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream(fileName));

当您查看错误流时,问题可能会很明显。您还应该考虑在catch块中记录或打印出异常的堆栈跟踪:

}catch (IOException e){
    e.printStackTrace();
    System.out.println("No se ha podido exportar!\n");
}

我怀疑fileName是null,空字符串(""),或者违反操作系统的文件名限制(例如)包含非法字符,例如换行符。

更新:根据您的评论,问题可能在于FileOutputStream如何计算文件路径。请尝试这样做,确保从nombreArchivo()返回的字符串只是文件的名称,没有目录路径:

String fileName = nombreArchivo();
String filePath = "file://" + System.getProperty("user.home"); //* You may need to verify that file:// isn't already included in the user's home directory
URL url = new URL(filePath);
File directory = new File(url.toURI());
ObjectOutputStream fpsalida = new ObjectOutputStream(new 
FileOutputStream(new File(directory, fileName)));

说明:我从艰难的学校学到了这个技巧。文件路径的计算方式存在细微之处,这是我通过平台无关的方式实现的一种方式。

答案 2 :(得分:0)

函数ObjectOutputStream似乎确实返回了不正确的路径,因为您正在硬编码路径。我认为您的硬编码路径也是错误的,但需要查看确切的错误消息才能告诉。

我测试了import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; public class SandBox { // get absolute path from relative public static String getPath(String relativePath){ return "/home/mack" + relativePath; } public static void main(String [] args){ System.out.println("Write the name of the file you want: "); //extract filename from user String filename = new Scanner(System.in).nextLine() + ".txt"; try { ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(SandBox.getPath("/" + filename))); //write integer to stream stream.writeInt(12345); stream.close(); } catch (IOException ex) { Logger.getLogger(SandBox.class.getName()).log(Level.SEVERE, null, ex); } } } 的这个示例,似乎工作正常。

var query = Order.find({
    date : {
        $lt : End,
        $gt : Start
    }}, {cust_ID:1, wholeseller_ID:1}
);