本文介紹了在Java中編輯二進(jìn)制文件的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我需要做這個(gè)項(xiàng)目,從其中讀取一個(gè)二進(jìn)制文件,然后創(chuàng)建一個(gè)新的二進(jìn)制文件,該文件根據(jù)偏移量添加00。例如,如果二進(jìn)制數(shù)的偏移量為02,則該二進(jìn)制數(shù)將移位2。因此,二進(jìn)制數(shù)的偏移量為04。中間有00。
我正在考慮使用隨機(jī)訪問(wèn)文件來(lái)訪問(wèn)和編輯(只讀)。但我被您要查找的字節(jié)數(shù)搞糊涂了。另外,如何編輯修改內(nèi)容并將其放入全新的文件中。
致以最誠(chéng)摯的問(wèn)候
推薦答案
在上圖中。藍(lán)色(0x54)
的第一個(gè)字節(jié)位于0x40 + 0x0E
。將左側(cè)的行值與列值相加。因此,您必須讀取除該字節(jié)以外的所有內(nèi)容。因此,這將被補(bǔ)償0x40 + 0x0D
。那將是64 + 13 = 77
。由于偏移量從0
開(kāi)始,因此請(qǐng)讀入前78
字節(jié),然后寫(xiě)出您想要的內(nèi)容。然后寫(xiě)出文件的其余部分。這意味著所有的藍(lán)色都將寫(xiě)在您的特殊插入之后。
這一切都是假定的,這就是你想要做的。但是您不能真正使用seek
,因?yàn)檫@意味著您正在修改源文件,這是不明智的(因?yàn)槟赡軙?huì)犯錯(cuò)誤,需要重新開(kāi)始)。此外,搜索正在修改的文件可能會(huì)非常有問(wèn)題,因?yàn)樗拇笮】赡軙?huì)不斷變化。無(wú)論如何,請(qǐng)確保保留該文件的備份副本。
若要進(jìn)行進(jìn)一步修改,請(qǐng)按說(shuō)明繼續(xù)讀取和寫(xiě)入。
這里有一個(gè)暴力的例子。可以適當(dāng)?shù)厥褂肨ry-with-Resources和循環(huán)來(lái)改進(jìn)它。例外情況被推定為受到監(jiān)控。此示例僅在指定位置插入兩個(gè)三元組整數(shù),并打印新文件。
// create a file to start
FileOutputStream fo = new FileOutputStream("myfile.txt");
String alpha = "abcdefghijklmnopqrstuvwxyz";
fo.write(alpha.getBytes());
fo.close();
// create the new output file and open up the old one as an input
// file
fo = new FileOutputStream("myfile2.txt");
FileInputStream fi = new FileInputStream("myfile.txt");
// insert 123 after k
byte[] buf = new byte[100];
int count = fi.read(buf, 0, 11); // read up to and including k
fo.write(buf, 0, count);
fo.write("123".getBytes());
// insert 456 after t
count = fi.read(buf, 0, 9);
fo.write(buf, 0, count);
fo.write("456".getBytes());
//copy rest of input file to output file
while ((count = fi.read(buf, 0, 10)) > 0) {
fo.write(buf, 0, count);
}
fo.close();
fi.close();
fi = new FileInputStream("myfile2.txt");
byte[] buffer = fi.readAllBytes();
for (byte b : buffer) {
System.out.print((char) b);
}
System.out.println();
fi.close();
}
這篇關(guān)于在Java中編輯二進(jìn)制文件的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,