0

我想从 ftp 服务器检索文件,我也使用了 Apache poiclient.retrieveFile()方法,但我无法打开它,它显示:

excel无法打开文件检查文件扩展名和文件格式。检查文件没有损坏

然后我使用文件读取器和写入器。下面是我的代码片段。

public void testFileWriter()
    {
        try{

        FTPFile[] files = client.listFiles("/Ftp1");
        for (FTPFile file : files) {
            File serverFile = new File("D:/Pondi.xlsx");
            if(!serverFile.isFile())
            {
                serverFile.createNewFile();
            }
            BufferedWriter writer = new BufferedWriter(new FileWriter(serverFile));
            client.enterLocalPassiveMode();
            InputStream inputStream = client.retrieveFileStream("/Ftp1/"+ file.getName());
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            System.out.println("Created Reader");
            while(reader.read()!=-1)
            {
                String temp = reader.readLine();
                System.out.println(temp);


                writer.write(temp);
            }
            writer.flush();
            writer.close();
            reader.close();
        }

        }
        catch(IOException ioe){
            ioe.printStackTrace();
        }
    }

请帮助我解决这个关键问题。

4

2 回答 2

2

您必须使用 API 来处理它。您无法像阅读普通文本文件那样阅读这些文件。

JExcel将满足您的需求。

示例可在此处获得

要复制文件,请使用. 使用您使用的方法读取文件进行复制将无法正常工作。

希望对您有所帮助。

于 2013-05-07T05:17:42.300 回答
1

如果要读取和复制二进制数据,则不能使用reader.readLine(),因为二进制文件中没有行。因此,这种尝试很可能会失败。

像这样复制它:

int fileNo = 0;
for (FTPFile file : files) {
    File serverFile = new File("D:/Pondi_" + fileNo + ".xlsx");
    ...
    InputStream in = client.retrieveFileStream("/Ftp1/"+ file.getName());
    OutputStream out = new FileOutputStream(serverFile);

    // read and copy binary data
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0){
        out.write(buf, 0, len);
    }

    in.close();
    out.close();
    fileNo++;
}

除此之外,考虑给你的文件一个不同的名字D:/Pondi.xlsx,因为否则文件会在循环中一次又一次地被覆盖。我用fileNo.

于 2013-05-07T05:43:46.017 回答