首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileOutputStream,目录

FileOutputStream,目录
EN

Stack Overflow用户
提问于 2018-01-22 00:54:29
回答 2查看 3.1K关注 0票数 0

这是我的目录结构

在服务器内部,我有以下代码用于保存从客户端发送的文件

代码语言:javascript
复制
fileName = reader.readLine();
                    DataInputStream dis = null;
                    try {
                        dis = new DataInputStream(csocket.getInputStream());
                        FileOutputStream fos = new FileOutputStream(fileName);
                        buffer = new byte[4096];

                        int fileSize = 15123;
                        int read = 0;
                        int totalRead = 0;
                        int remaining = fileSize;
                        while((read = dis.read(buffer, 0, Math.min(buffer.length, remaining))) > 0) {
                            totalRead += read;
                            remaining -= read;
                            fos.write(buffer, 0, read);
                        }

                        fos.close();
                        dis.close();
                    } catch (IOException e) {
                    }
                    break;

我想知道如何将文件保存在xml文件夹中?我尝试过使用getClass()、.getResource等方法,但似乎都不起作用。

fileName只是一个包含文件名的简单字符串,而不是路径或任何东西。

我使用下面的代码获得了正确的路径:

代码语言:javascript
复制
File targetDir = new File(getClass().getResource("xml").getPath());
                        File targetFile = new File(targetDir, fileName);
                        targetFile.createNewFile();

                        System.out.println(targetFile.getAbsolutePath());

                        dis = new DataInputStream(csocket.getInputStream());
                        FileOutputStream fos = new FileOutputStream(targetFile.getAbsolutePath(), false);

但它仍然不能把它保存在那里...

EN

回答 2

Stack Overflow用户

发布于 2018-01-22 01:02:48

最好的方法是通过.properties文件或命令行参数显式接收用于存储文件的目标路径。这样,您就可以灵活地安装您的程序,并在不同的环境中进行调整。

但是,如果您希望您的程序自动采用目标目录,最好的选择是在创建FileOutputStream之前设置一个相对路径,只要您始终从相同的路径启动程序:

代码语言:javascript
复制
File targetDir=new File("xml");
File targetFile=new File(targetDir, fileName);
FileOutputStream fos = new FileOutputStream(targetFile);

假设程序是从server作为当前目录启动的,这将会起作用。

更新

关于你的程序的其他次要建议:

  1. 从不将循环的退出条件基于硬编码的文件大小,因为不可能知道它的a priori。相反,请显式检查read返回的值是否小于0 =>,这意味着文件结束reached.
  2. Consequently,不必费心计算通过对read的调用所需的确切数据量。只需输入缓冲区大小,因为您设置的是最大数据大小。
  3. 不会在没有适当处理的情况下捕获异常:如果您知道如何使程序恢复,请在catch块中输入正确的代码。否则,最好不要捕获它们:在throws子句中声明它们,并让它们通过try-with-resources指令传播到caller.
  4. Always create流资源,以确保它们在结束时被关闭:

尝试(新建fos =FileOutputStream FileOutputStream( ... )) { // ...使用fos...}

  • 保存不必要的指令:如果您不关心文件系统上是否已经存在该文件,请不要调用createNewFile。但如果您关心,请检查返回值并将consequently.

分成两部分

票数 0
EN

Stack Overflow用户

发布于 2018-01-22 01:39:33

我尝试创建文件,但它不是在ProjectName\src\com\company\xml中创建的,而是在ProjectName\out\production\ProjectName\com\company\xml中创建的,我的代码是:

代码语言:javascript
复制
 File targetDir = new File(this.getClass().getResource("xml").getPath());
 // get the parent of the file
 String parentPath = targetDir.getParent( );
 String fileName="xml/name.txt";
 //do something
 File targetFile = new File(parentPath, fileName);
 targetFile.createNewFile();

只需注意,在编译之后,您将尝试将其保存到jar文件中,这是一件复杂的事情。通常,您需要将文件保存到jar之外的文件中(在根目录中分开),如下所示:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48369299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档