在Java/Android中读取文件的一段
我相信这可能是一个简单的问题,但不幸的是,这是我第一次使用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之间),并将读取的数据写入在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连接不好)。我现在可以重新上传这两块,一切都会很好 我想知道的是如何只读
“.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。这将很有帮助。