在Java/Android中读取文件的一段

在Java/Android中读取文件的一段,java,android,http,file-upload,Java,Android,Http,File Upload,我相信这可能是一个简单的问题,但不幸的是,这是我第一次使用Java和Android SDK 我使用ApacheHTTP库在Android上上传文件,特别是使用MultipartEntity 我上传到一个服务,允许我向他们发送文件的块,一旦完成,他们将重新组装块。我想利用这个功能 下面是一个场景 FOO.BAR文件的大小为20MB。我把它分成任意大小的块,比如说1MB,也就是说20个块。块#3和#14失败(可能是手机/WiFi连接不好)。我现在可以重新上传这两块,一切都会很好 我想知道的是如何只读

我相信这可能是一个简单的问题,但不幸的是,这是我第一次使用Java和Android SDK

我使用ApacheHTTP库在Android上上传文件,特别是使用MultipartEntity

我上传到一个服务,允许我向他们发送文件的块,一旦完成,他们将重新组装块。我想利用这个功能

下面是一个场景

FOO.BAR文件的大小为20MB。我把它分成任意大小的块,比如说1MB,也就是说20个块。块#3和#14失败(可能是手机/WiFi连接不好)。我现在可以重新上传这两块,一切都会很好

我想知道的是如何只读取文件的一部分(比如3MB和4MB之间的数据)

文件段应该是InputStream或文件对象

谢谢, Makoto

使用FileInputStream的skip()方法来查找所需的片段。

您可以使用该方法跳过InputStream中的字节数,也可以在File对象上创建RandomAccessFile并调用其方法来设置指向该位置的指针,以便从该位置开始读取

下面的快速测试读取4mb+文件(3m和4mb之间),并将读取的数据写入
“.out”
文件

import java.io.*;
import java.util.*;

public class Test {

    public static void main(String[] args) throws Throwable {
       long threeMb = 1024 * 1024 * 3;
       File assembled =  new File(args[0]); // your downloaded and assembled file
       RandomAccessFile raf = new RandomAccessFile(assembled, "r"); // read
       raf.seek(threeMb); // set the file pointer to 3mb
       int bytesRead = 0;
       int totalRead = 0;
       int bytesToRead = 1024 * 1024; // 1MB (between 3M and 4M

       File f = new File(args[0] + ".out");
       FileOutputStream out = new FileOutputStream(f);

       byte[] buffer = new byte[1024 * 128]; // 128k buffer 
       while(totalRead < bytesToRead) { // go on reading while total bytes read is
                                        // less than 1mb
         bytesRead = raf.read(buffer);
         totalRead += bytesRead;
         out.write(buffer, 0, bytesRead);
         System.out.println((totalRead / 1024));
       }
    }
}
import java.io.*;
导入java.util.*;
公开课考试{
公共静态void main(字符串[]args)抛出可丢弃的{
长3MB=1024*1024*3;
File assembled=新文件(args[0]);//下载并组装的文件
RandomAccessFile raf=新的RandomAccessFile(组合的,“r”);//读取
seek(3mb);//将文件指针设置为3mb
int字节读取=0;
int totalRead=0;
int bytesToRead=1024*1024;//1MB(在3M和4M之间
文件f=新文件(args[0]+“.out”);
FileOutputStream out=新的FileOutputStream(f);
字节[]缓冲区=新字节[1024*128];//128k缓冲区
while(totalRead
我能够找到答案…只是必须发现有一个ByteArrayInputStream,它允许我将byte[]缓冲区转换为InputStream。从现在开始,我可以跟踪哪些块失败并处理它。感谢Konstantin提供我的实现:

    final int chunkSize = 512 * 1024; // 512 kB
    final long pieces = file.length() / chunkSize;
    int chunkId = 0;

    HttpPost request = new HttpPost(endpoint);

    BufferedInputStream stream = new BufferedInputStream(new FileInputStream(file));

    for (chunkId = 0; chunkId < pieces; chunkId++) {
        byte[] buffer = new byte[chunkSize];

        stream.skip(chunkId * chunkSize);
        stream.read(buffer);

        MultipartEntity entity = new MultipartEntity();
        entity.addPart("chunk_id", new StringBody(String.valueOf(chunkId)));
        request.setEntity(entity);
        ByteArrayInputStream arrayStream = new ByteArrayInputStream(buffer);

        entity.addPart("file_data", new InputStreamBody(arrayStream, filename));

        HttpClient client = app.getHttpClient();
        client.execute(request);
    }
final int chunkSize=512*1024;//512 kB
最终长片段=file.length()/chunkSize;
int chunkId=0;
HttpPost请求=新的HttpPost(端点);
BufferedInputStream=新BufferedInputStream(新文件输入流(文件));
对于(chunkId=0;chunkId
这将告诉它从何处开始…但我如何告诉它只读取1 MB的数据而不继续读取?这就是读取字节的用户。计算您读取的字节数并在1 MB后停止。感谢您提及RandomAccessFile。这将很有帮助。