這是不檢查可能發生的任何錯誤的情況非常樂觀的實現。這只是一個使用字節數組而不是文件的例子。但它應該像使用文件輸入和輸出流替換字節數組流時一樣工作。通過檢查格式不正確的文件格式使其更加強大。
這個想法是在每行的前面加上它的長度,然後是行的字節。您的地圖具有統一的列大小,因此您可以將每列的長度保存一次。只需按照自己的喜好調整即可。好玩:
public static void main(String[] args) throws Exception {
byte[][] dungeon = new byte[][] {
{0,0,0,0,0},
{1,1,1,0,0}
};
ByteArrayOutputStream os = new ByteArrayOutputStream();
saveMap(os, dungeon);
ByteArrayInputStream in = new ByteArrayInputStream(os.toByteArray());
byte[][] maze = loadMap(in);
}
private static void saveMap(OutputStream saveStream, byte[][] dungeon) throws Exception {
try (BufferedOutputStream os = new BufferedOutputStream(saveStream)) {
for (int row=0; row<dungeon.length; row++) {
os.write(toBytes(dungeon[row].length));
os.write(dungeon[row]);
}
}
}
private static byte[][] loadMap(InputStream saveStream) throws Exception {
List<byte[]> rows = new ArrayList<>();
try (BufferedInputStream in = new BufferedInputStream(saveStream)) {
while (in.available() != 0) {
byte[] column = new byte[toInt(in.read(), in.read())];
for (int idx = 0; idx < column.length; idx++) {
column[idx] = (byte) in.read();
}
rows.add(column);
}
}
return rows.toArray(new byte[rows.size()][]);
}
private static byte[] toBytes(int value) {
return new byte[] { (byte) (value >>> 8), (byte) value };
}
private static int toInt(int high, int low) {
return (high << 8) | (0x00FF & low);
}
謝謝!你的想法是最簡單的,只需很少的調整! – user3140916