我正在尝试将一个二进制文件(如视频/音频/图像)分成每个100kb的块,然后将这些块重新连接回原来的文件。我的代码似乎可以正常工作,从某种意义上说,它可以分割文件并合并块,我返回的文件大小与原始文件相同。但是,问题在于内容会被截断-
也就是说,如果它是视频文件,它将在2秒钟后停止,如果它是图像文件,则只有上部看起来正确。
这是我正在使用的代码(如果您愿意,我可以发布整个代码):
划分:
File ifile = new File(fname);
FileInputStream fis;
String newName;
FileOutputStream chunk;
int fileSize = (int) ifile.length();
int nChunks = 0, read = 0, readLength = Chunk_Size;
byte[] byteChunk;
try {
fis = new FileInputStream(ifile);
StupidTest.size = (int)ifile.length();
while (fileSize > 0) {
if (fileSize <= Chunk_Size) {
readLength = fileSize;
}
byteChunk = new byte[readLength];
read = fis.read(byteChunk, 0, readLength);
fileSize -= read;
assert(read==byteChunk.length);
nChunks++;
newName = fname + ".part" + Integer.toString(nChunks - 1);
chunk = new FileOutputStream(new File(newName));
chunk.write(byteChunk);
chunk.flush();
chunk.close();
byteChunk = null;
chunk = null;
}
fis.close();
fis = null;
对于连接文件,我将所有块的名称放入列表中,然后按名称对其进行排序,然后运行以下代码:
File ofile = new File(fname);
FileOutputStream fos;
FileInputStream fis;
byte[] fileBytes;
int bytesRead = 0;
try {
fos = new FileOutputStream(ofile,true);
for (File file : files) {
fis = new FileInputStream(file);
fileBytes = new byte[(int) file.length()];
bytesRead = fis.read(fileBytes, 0,(int) file.length());
assert(bytesRead == fileBytes.length);
assert(bytesRead == (int) file.length());
fos.write(fileBytes);
fos.flush();
fileBytes = null;
fis.close();
fis = null;
}
fos.close();
fos = null;
我只能在代码中发现2个潜在错误:
int fileSize = (int) ifile.length();
当文件超过2GB时,以上操作将失败,因为int
不能容纳更多文件。
newName = fname + ".part" + Integer.toString(nChunks - 1);
像这样构造的文件名应该以非常特定的方式进行排序。使用默认字符串排序时,name.part10
将位于之前name.part2
。您想提供一个习惯Comparator
,该习惯将零件号提取并解析为一个int,然后以此进行比较。
问题内容: 请告诉我最好/最快的方法: 1)将很小的二进制文件加载到内存中。例如图标; 2)加载/读取大小为512Mb +的非常大的二进制文件。也许我必须使用内存映射的IO? 3)当您不想考虑大小/速度而只能做的事情时,通常选择:将所有字节读入内存? 谢谢!!! 问题答案: 对于内存映射文件,java有一个nio包:Memory Mapped Files 检出小文件的字节流类:字节流 检出较大文件
我刚刚开始开发一个基于hadoop的开放式街道地图数据的ingester。有几种格式--但我的目标是基于protocolbuffer的格式(注意--它不是纯粹的pb)。 在我看来,与以自定义记录读取器/输入格式处理可变长度编码相反,将文件预拆分为序列文件将更有效,但希望进行健全性检查。 该格式在PBF格式描述中有更详细的描述,但基本上它是[BlobHeader,blob]块的集合。 有一个Blob
问题内容: 我在C#.net中有一个程序,它使用写入1个整数和3个字符串到文件中。 现在,我正在用Java编程(对于Android,这是Java的新手),我必须访问以前使用C#写入文件的数据。 我尝试使用和,但无法获得正确的结果。我通常会得到: java.io.UTFDataFormatException:字节21附近的输入格式错误 或者和我得到的是错误的… 这样做的正确方法是什么? 问题答案:
我正在处理Hadoop和Hive的输出文本文件,其中的文件有由Control-A分隔的字段。然后我使用Python逐行读取文件,但是字符串函数即使指定了分隔符也不能正确拆分。 然后,我编写了一个Python函数,该函数使用标准的Python习惯用法逐行读取文件: 但是,当我运行函数时,字符串没有正确拆分。每行中应该有四个令牌。 您可以在我的Python函数中看到,我尝试了三种不同的方法来拆分字符串
我有一个类似于此的excel工作表,但有很多列: 我想将团队列拆分为团队和一个名为Team ID的新列。我目前使用以下代码执行此操作: 这很好(请注意,团队名称可以包括数字、空格和paranthesis)。虽然这可能并不完美,但我完成了这项工作。 我的问题是新列“Team ID”放置在数据集的末尾。所以它将是“Team-成员-Team ID”。虽然3列不是问题,但有时有10列需要拆分7列。 所以问