RFR [8020669] java.nio.file.Files.readAllBytes() does not read any data when Files.size() is 0
Chris Hegarty
chris.hegarty at oracle.com
Fri Jul 19 19:52:08 UTC 2013
On 19 Jul 2013, at 20:19, roger riggs <roger.riggs at oracle.com> wrote:
> Hi Ivan,
>
> You may need someone with more NIO experience to weigh in on this.
>
> Since the initial size can't be trusted (at least for zero), the code could
> replace the zero with a modest buffer size (8192) and continue as is.
>
> The code already checks if the bytes read is the same as allocated
> and returns a copy with the exact bytes as needed.
>
> To be fully robust, the loop should be updated to reallocate the buffer
> array if it is too small.
+1
-Chris.
> Roger
>
>
>
> On 7/19/2013 2:11 PM, Ivan Gerasimov wrote:
>>
>> On 19.07.2013 21:43, Remi Forax wrote:
>>> On 07/19/2013 07:15 PM, Ivan Gerasimov wrote:
>>>> Hello everybody!
>>>>
>>>> Would you please review a fix for the problem with j.n.f.Files.readAllBytes() function?
>>>> The current implementation relies on FileChannel.size() to preallocate a buffer for the whole file's content.
>>>> However, some special filesystems can report a wrong size.
>>>> An example is procfs under Linux, which reports many files under /proc to be zero sized.
>>>>
>>>> Thus it is proposed not to rely on the size() and instead continuously read until EOF.
>>>>
>>>> The downside is reallocation and copying file content between buffers.
>>>> But taking into account that the doc says: "It is not intended for reading in large files." it should not be a big problem.
>>>>
>>>> http://bugs.sun.com/view_bug.do?bug_id=8020669
>>>> http://cr.openjdk.java.net/~igerasim/8020669/0/webrev/
>>>>
>>>> The fix is for JDK8. If it is approved, it can be applied to JDK7 as well.
>>>>
>>>> Sincerely yours,
>>>> Ivan Gerasimov
>>>
>>> Is not better to just not trust the filesystem when a call to size() returns 0 ?
>> Then we couldn't use Files.readAllBytes() to read /proc/* files.
>>
>> Here's what the documentation says about Files.size(): "The size may differ from the actual size on the file system due to compression, support for sparse files, or other reasons."
>>
>> So it is already said, that the exact file size is not always known.
>> Then why should we rely on this information when trying to read all bytes of the file?
>>
>> Sincerely yours,
>> Ivan
>>
>>> Rémi
>
More information about the core-libs-dev
mailing list