【问题标题】:Reading file chunk by chunk逐块读取文件
【发布时间】:2012-06-22 00:49:48
【问题描述】:

我想逐个读取文件。该文件被分成几个部分,存储在不同类型的媒体上。我目前所做的是调用文件的每个单独部分,然后将其合并回原始文件。

问题是我需要等到所有块都到达之后才能播放/打开文件。 是否可以在块到达时读取它们而不是等待它们全部到达。

我正在处理媒体文件(电影文件)。

【问题讨论】:

  • 您从哪里读取这些数据?为什么需要等待?

标签: java io fileinputstream http-chunked


【解决方案1】:

请参阅InputSteram.read(byte[]) 了解一次读取字节。

示例代码:

try {
    File file = new File("myFile");
    FileInputStream is = new FileInputStream(file);
    byte[] chunk = new byte[1024];
    int chunkLen = 0;
    while ((chunkLen = is.read(chunk)) != -1) {
        // your code..
    }
} catch (FileNotFoundException fnfE) {
    // file not found, handle case
} catch (IOException ioE) {
    // problem reading, handle case
}

【讨论】:

  • 是的,但在这种情况下,我仍然需要等到我得到所有的块。我的问题是我有几个块 1 到 n ......当我等待第二个块到达时,我希望能够打开文件。 @cklab
【解决方案2】:

你想要的是source data line。当您的数据太大而无法一次将其保存在内存中时,这非常适合,因此您可以在收到整个文件之前开始播放它。或者如果文件永远不会结束。

查看source data line here的教程

http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read

我会使用这个 FileInputSteam

【讨论】:

  • dave 你在处理什么样的文件? XML 文本、mp3 等...我认为更多信息会对您的问题有所帮助。
  • 嘿,大卫,看看我修改后的答案。我让我知道这是否能解决您的问题
【解决方案3】:

您可以尝试使用 nio 在内存中逐块读取文件而不是完整的文件,而不是旧的 io。 您可以使用 Channel 从多个来源获取数据

RandomAccessFile aFile = new RandomAccessFile(
                        "test.txt","r");
        FileChannel inChannel = aFile.getChannel();
        long fileSize = inChannel.size();
        ByteBuffer buffer = ByteBuffer.allocate((int) fileSize);
        inChannel.read(buffer);
        //buffer.rewind();
        buffer.flip();
        for (int i = 0; i < fileSize; i++)
        {
            System.out.print((char) buffer.get());
        }
        inChannel.close();
        aFile.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2021-08-20
    • 2022-01-25
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多