8000 Efficiently read part of a file by seek offsets · Issue #107 · babashka/fs · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Efficiently read part of a file by seek offsets #107
Open
@kimo-k

Description

@kimo-k

It would be nice to read a slice of a file, based on the start & end char indices.

chatgpt attempt, seems to work:

Yes, there is a more efficient way to handle large files by reading only the necessary parts of the file instead of slurping the entire content. You can accomplish this using Java's java.nio.file API. Here is a way to do this using interop:

(defn lazy-substring-of-file [filename start end]
  (let [path (java.nio.file.Paths/get filename (into-array String []))
        options (into-array java.nio.file.OpenOption [java.nio.file.StandardOpenOption/READ])
        fc (.newByteChannel java.nio.file.Files path options)
        bb (java.nio.ByteBuffer/allocate (- end start))]
    (.position fc start)
    (.read fc bb)
    (.close fc)
    (String. (.array bb) "UTF-8")))

In this function:

  • java.nio.file.Paths/get is used to get a java.nio.file.Path object from the filename.
  • java.nio.file.Files/newByteChannel is used to create a new java.nio.channels.SeekableByteChannel to the file.
  • java.nio.ByteBuffer/allocate is used to create a ByteBuffer of the right size.
  • .position is used to set the read position of the byte channel.
  • .read is used to read the right amount of bytes from the file into the ByteBuffer.
  • String. (.array bb) "UTF-8" is used to create a new string from the ByteBuffer.

This function avoids reading the whole file into memory by only reading the necessary bytes. It works best when start and end are relatively small compared to the size of the file.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0