我想从ftp服务器检索文件,我也使用了Apache poi client.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();
}
}
请帮我解决这个关键问题。
答案 0 :(得分:2)
您必须使用API来处理它。您无法读取这些文件,例如阅读普通文本文件。
JExcel将有利于您的需求。
可以使用示例here
复制文件时请使用this。通过您使用的方法读取文件以进行复制将无法正常工作。
希望对你有所帮助。
答案 1 :(得分: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
做了这个。