我开发了一个代码,可以从FTP读取非常大的文件,并使用Java将其写入本地计算机。执行此操作的代码如下。这是next(Text key, Text value)
RecordReader
内CustomInputFormat
的一部分
if(!processed)
{
System.out.println("in processed");
in = fs.open(file);
processed=true;
}
while(bytesRead <= fileSize) {
byte buf[] = new byte[1024];
try {
in.read(buf);
in.skip(1024);
bytesRead+=1024;
long diff = fileSize-bytesRead;
if(diff<1024)
{
break;
}
value.set(buf, 0, 1024); // This is where the value of the record is set and it goes to the mapper .
}
catch(Exception e)
{
e.printStackTrace();
}
}
if(diff<1024)
{
int difference= (int) (fileSize-bytesRead);
byte buf[] = new byte[difference];
in.read(buf);
bytesRead+=difference;
}
System.out.println("closing stream");
in.close();
写入结束后,我看到传输已完成,目标文件的大小与源文件的大小相同。但我无法打开文件,编辑器将错误视为
gedit has not been able to detect the character coding.
Please check that you are not trying to open a binary file.
Select a character coding from the menu and try again.
这个问题:Java upload jpg using JakartaFtpWrapper - makes the file unreadable与我的相关,我相信,但我无法理解它。
任何指针?
答案 0 :(得分:3)
您的复制代码已完成且完全100%A级废话。在Java中复制流的规范方法如下:
int count;
byte[] buffer = new byte[8192]; // or more if you like
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
摆脱所有其他绒毛。这只是浪费时间和空间,并且明显损坏了传输中的数据。
答案 1 :(得分:2)
我发现您的代码存在许多问题。读取整个文件是一种奇怪的方式。 例如:
in.read(buf);
in.skip(1024);
bytesRead+=1024;
错误,in.read(buf)
返回读取的字节数,并将流位置设置为当前位置old-position + n读取字节。所以你不需要skip
- 那是一个错误,因为已经定位了流。
验证文件的校验和是否确定,它们是相同的。 (使用md5或其他东西) 我很确定校验和和文件大小都不一样。
您应该使用apache commons-io进行文件处理。否则请查看oracle docs on file processing。