0

我开发了一个代码,它从 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 -使文件不可读我相信与我的有关,但我无法理解。

任何指针?

4

2 回答 2

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);
}

摆脱所有其他绒毛。这只是在浪费时间和空间,显然会损坏您传输中的数据。

于 2013-01-02T06:53:05.607 回答
2

我看到你的代码有很多问题。读取整个文件是一种奇怪的方式。例如:

in.read(buf);
in.skip(1024);
bytesRead+=1024;

错误,in.read(buf)返回读取的字节数并将流位置设置为当前位置 old-position + n 读取字节。所以你不需要skip- 那是一个错误,因为 read 已经定位了流。

验证文件的校验和以确保它们是相同的。(使用 md5 或其他东西)我很确定校验和和文件大小都不相同。

您应该使用apache commons-io进行文件处理。否则请查看有关文件处理的 oracle 文档

于 2013-01-02T06:34:47.067 回答