下面列出了java.nio.MappedByteBuffer#remaining ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
byte[] read4k(){
try {
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] readImg(){
try {
//BufferedImage origImage = ImageIO.read(imgPath);
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
//ImageIO.write(origImage, "jpg", baos);
//return baos.toByteArray();
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] read4k(){
try {
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] read4k(){
try {
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] read4k(){
try {
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] read4k(){
try {
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] readImg(){
try {
//BufferedImage origImage = ImageIO.read(imgPath);
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
//ImageIO.write(origImage, "jpg", baos);
//return baos.toByteArray();
//File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
byte[] pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
byte[] readImg(){
try {
//BufferedImage origImage = ImageIO.read(imgPath);
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
//ImageIO.write(origImage, "jpg", baos);
//return baos.toByteArray();
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/AUAVtmp/fullPic.JPG");
//File file = new File("../tmp/pictmp.jpg");
FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
byte[] pic = new byte[buffer.capacity()];
while(buffer.hasRemaining()){
int remaining = pic.length;
if(buffer.remaining() < remaining){
remaining = buffer.remaining();
}
buffer.get(pic, 0, remaining);
}
return pic;
} catch(Exception e){
e.printStackTrace();
}
return new byte[0];
}
public final void put(ByteBuffer byteBuffer) throws IOException {
try {
int index = getIndex();
long length = byteBuffer.limit() - byteBuffer.position();
this.position += length;
MappedByteBuffer mappedBuffer = bufferList.get(index);
if (mappedBuffer.remaining() < length) {
byte[] temp = new byte[mappedBuffer.remaining()];
byteBuffer.get(temp);
bufferList.get(index).put(temp);
bufferList.get(index + 1).put(byteBuffer);
} else {
bufferList.get(index).put(byteBuffer);
}
} catch (Exception e) {
throw new IOException(
"LargeMappedByteBuffer put rawPosition-" + rawPosition + "\tposition-" + position
+ "\tsize-" + size, e);
}
}
@Test
public void givenFile_whenReadAFileSectionIntoMemoryWithFileChannel_thenCorrect() throws IOException {
try (RandomAccessFile reader = new RandomAccessFile("src/test/resources/test_read.in", "r");
FileChannel channel = reader.getChannel();
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
MappedByteBuffer buff = channel.map(FileChannel.MapMode.READ_ONLY, 6, 5);
if (buff.hasRemaining()) {
byte[] data = new byte[buff.remaining()];
buff.get(data);
assertEquals("world", new String(data, StandardCharsets.UTF_8));
}
}
}
@Override
public long readLittleEndianLong() throws IOException {
MappedByteBuffer curChunk = getCurChunk();
if (curChunk.remaining() >= 8) {
return curChunk.getLong();
}
// Value is on the chunk boundary - edge case so it is ok if it's a bit slower.
return Util.readLittleEndianLongSlowly(this);
}
public void skipBytes(long amount) throws IOException {
MappedByteBuffer curChunk = getCurChunk();
int remaining = curChunk.remaining();
if (remaining >= amount) {
curChunk.position((int) (curChunk.position() + amount));
} else {
next();
skipBytes(amount - remaining);
}
}
@Override
public int readLittleEndianInt() throws IOException {
MappedByteBuffer curChunk = getCurChunk();
if (curChunk.remaining() >= 4) {
return curChunk.getInt();
}
// Value is on the chunk boundary - edge case so it is ok if it's a bit slower.
return Util.readLittleEndianIntSlowly(this);
}
@Override
public int readLittleEndianInt() throws IOException {
MappedByteBuffer curChunk = getCurChunk();
if (curChunk.remaining() >= 4) {
return curChunk.getInt();
}
// Value is on the chunk boundary - edge case so it is ok if it's a bit slower.
return Util.readLittleEndianIntSlowly(this);
}
public void readFully(byte[] buffer, int offset, int length) throws IOException {
MappedByteBuffer curChunk = getCurChunk();
long remaining = curChunk.remaining();
if (remaining >= length) {
curChunk.get(buffer, offset, length);
} else {
int remaining1 = (int) remaining;
curChunk.get(buffer, offset, remaining1);
length -= remaining1;
offset += remaining1;
next();
readFully(buffer, offset, length);
}
}
public static void main(String[] args) throws Exception {
File file = new File(
"c:\\Program Files (x86)\\Bethesda.net Launcher\\games\\Fallout76\\Data\\SeventySix.esm");
/*
* char[4] = 'EDID'
* uint16 = length
* uint8[length] = characters
*/
int i = 1;
try (PrintWriter out = new PrintWriter(new FileWriter("editorids.txt"))) {
try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
MappedByteBuffer mbb = raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length());
while (mbb.remaining() > 0) {
if (mbb.get() == 'E') {
if (mbb.get() == 'D') {
if (mbb.get() == 'I') {
if (mbb.get() == 'D') {
int len = Short.reverseBytes(mbb.getShort()) & 0xFFFF;
byte[] data = new byte[len];
mbb.get(data);
out.println(new String(data, StandardCharsets.ISO_8859_1));
if (i % 100 == 0) {
System.out.println("Records so far: " + i);
}
i++;
}
}
}
}
}
}
}
}
@Override
public int readUnsignedByte() throws IOException {
MappedByteBuffer curChunk = getCurChunk();
if (curChunk.remaining() == 0) {
next();
curChunk = getCurChunk();
}
return ((int) curChunk.get()) & 0xFF;
}
@Override
public long readLittleEndianLong() throws IOException {
MappedByteBuffer curChunk = getCurChunk();
if (curChunk.remaining() >= 8) {
return curChunk.getLong();
}
// Value is on the chunk boundary - edge case so it is ok if it's a bit slower.
return Util.readLittleEndianLongSlowly(this);
}
public static void main(String[] args) throws IOException {
File stackLog = new File("target/stack-logs.78490.2000.unidbg.zcmkle.index");
FileInputStream inputStream = new FileInputStream(stackLog);
FileChannel channel = inputStream.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, stackLog.length());
buffer.order(ByteOrder.LITTLE_ENDIAN);
int i = 0;
while (buffer.remaining() >= 16) {
long size = buffer.getInt() & 0xffffffffL;
long addr = (buffer.getInt() & 0xffffffffL) ^ 0x00005555;
long offset_and_flags_l = buffer.getInt() & 0xffffffffL;
long offset_and_flags_h = buffer.getInt() & 0xffffffffL;
int flag = (int) ((offset_and_flags_h & 0xff000000) >> 24);
long stackId = ((offset_and_flags_h & 0x00ffffff) << 32) | offset_and_flags_l;
String action = "OTHER";
boolean isFree = false;
switch (flag) {
case MALLOC_LOG_TYPE_ALLOCATE:
action = "ALLOC";
isFree = false;
break;
case MALLOC_LOG_TYPE_DEALLOCATE:
action = "FREE ";
isFree = true;
break;
case stack_logging_type_vm_allocate:
action = "MMAP ";
isFree = false;
break;
case stack_logging_type_vm_deallocate:
action = "UNMAP";
isFree = true;
break;
default:
if ((flag & stack_logging_type_mapped_file_or_shared_mem) != 0 && (flag & stack_logging_type_vm_allocate) != 0) {
action = "MMAPF";
isFree = false;
break;
}
System.err.println(flag);
break;
}
String msg = String.format("[%08d]: %s, stackId=0x%014x, address=0x%08x, size=0x%x", i++, action, stackId, addr, size);
if (isFree) {
System.err.println(msg);
} else {
System.out.println(msg);
}
}
channel.close();
inputStream.close();
}
/**
* Loads geodata from a file. When file does not exist, is corrupted or not consistent, loads none geodata.
*
*
* @param filePath : The Geodata File Path
* @param regionX : Geodata file region X coordinate.
* @param regionY : Geodata file region Y coordinate.
* @return boolean : True, when geodata file was loaded without problem.
*/
private boolean loadGeoBlocks(Path filePath, int regionX, int regionY) {
// standard load
try (RandomAccessFile raf = new RandomAccessFile(filePath.toAbsolutePath().toString(), "r");
FileChannel fc = raf.getChannel()) {
// initialize file buffer
MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).load();
buffer.order(ByteOrder.LITTLE_ENDIAN);
// get block indexes
final int blockX = (regionX - World.TILE_X_MIN) * GeoStructure.REGION_BLOCKS_X;
final int blockY = (regionY - World.TILE_Y_MIN) * GeoStructure.REGION_BLOCKS_Y;
// loop over region blocks
for (int ix = 0; ix < GeoStructure.REGION_BLOCKS_X; ix++) {
for (int iy = 0; iy < GeoStructure.REGION_BLOCKS_Y; iy++) {
// get block type
final byte type = buffer.get();
// load block according to block type
blocks[blockX + ix][blockY + iy] = switch (type) {
case GeoStructure.TYPE_FLAT_L2D -> new BlockFlat(buffer, GeoFormat.L2D);
case GeoStructure.TYPE_COMPLEX_L2D -> new BlockComplex(buffer, GeoFormat.L2D);
case GeoStructure.TYPE_MULTILAYER_L2D -> new BlockMultilayer(buffer, GeoFormat.L2D);
default -> throw new IllegalArgumentException("Unknown block type: " + type);
};
}
}
// check data consistency
if (buffer.remaining() > 0) {
LOGGER.warn("GeoEngine: Region file {} can be corrupted, remaining {} bytes to read.", filePath, buffer.remaining());
}
// loading was successful
return true;
} catch (Exception e) {
LOGGER.error("Error while loading {} region file.", filePath);
LOGGER.error(e.getMessage());
// replace whole region file with null blocks
loadNullBlocks(regionX, regionY);
// loading was not successful
return false;
}
}