I tried the test, and it failed as you said with RI on my WinXP. And I also tried to pass in a read/write FileChannel got from RandomAccessFile, the test passes. I consider this is RI's bug, because no way to have such different behavior in this clear test. So I think we should follow spec.

I also suggest to report this to Sun JDK bug db as well, because I think it is not trivial. And I don't believe Sun will at last decide, instead to fix this, to modify the document as "the behavior is implementation dependent if the source channel has fewer than count bytes remaining..." ;-)

Jimmy, Jing Lv wrote:
Hi:

I find a conflict that RI does not behave as spec says in java.nio.channels.FileChannel.transforFrom(ReadableByteChannel src, long position,long count). The spec says:"...Fewer than the requested number of bytes will be transferred if the source channel has fewer than count bytes remaining..."[1]. As expected, invoking this method with a count larger than the number of bytes remaining in the ReadableByteChannel, RI should return a number of bytes exactly transfered. But in fact, RI throws an IOException. I run the test[2] on windowsXP SP2 with RI1.5.0_01 and RI1.5.0_06, and on Linux(redhat 9) with RI1.5.0_02 and RI1.5.0_06, and get the same result. Currently Harmony behave well on this. I guess this is a bug of RI, and Harmony implementation is good. If no objection, I suggest add this test to Harmony.
    Any opinions? Thanks!


[1] spec of FileChannel:
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileChannel.html
[2] the test:
    public void test_transferFromLReadableByteChannelJJ_overflow()
            throws Exception {
        String content = "test content";
        int length = content.length();
        File readFile = File.createTempFile("testfile1", "tmp");
        File writeFile = File.createTempFile("testfile2", "tmp");
        FileOutputStream fos = new FileOutputStream(readFile);
        try {
            fos.write(content.getBytes());
        } finally {
            fos.close();
        }
        FileChannel fc1 = new FileInputStream(readFile).getChannel();
        FileChannel fc2 = new FileOutputStream(writeFile).getChannel();
        try {
            long result = fc2.transferFrom(fc1, 0, length * 2);
            assertEquals(length, result);
        } finally {
            fc1.close();
            fc2.close();
        }
    }



--
Paulex Yang
China Software Development Lab
IBM



---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to