Java Edition level format

Each level is its own folder. A level folder is often identified by having a level.dat file, along with other subfolders to store the maps and regions of the level.

Level folders will always contain the items in bold, and will sometimes contain the items in italics.

level.dat format
The level.dat file contains global information about the world such as the time of day, the singleplayer player, the level generator used, and the seed. It is an NBT file with this structure:
 * The root tag.
 * : This tag contains all the level data.
 * : This tag contains level data specific to certain dimensions.
 * : Data for The End
 * : Data for the ender dragon fight. Only appears after the end is entered.
 * : Location of the End's exit portal that the ender dragon flies to upon it's death
 * : The X coordinate of the portal.
 * : The Y coordinate of the portal.
 * : The Z coordinate of the portal.
 * : Contains a list of locations of the End gateway portals that haven't been spawned.
 * : The angle of a future gateway, from 0 to 19. 0 is east of the exit portal, and numbers increase clockwise.
 * : 1 or 0 (true/false) - If the dragon is currently alive.
 * : The least significant bits of the current Ender Dragon's Universally Unique IDentifier. This is joined with DragonUUIDMost to form the dragon's unique ID.
 * : The most significant bits of the current Ender Dragon's Universally Unique IDentifier. This is joined with DragonUUIDLeast to form the dragon's unique ID.
 * : 1 or 0 (true/false) - If the ender dragon has ever been defeated. Used to determine EXP given by dragon.
 * : The NBT version of the level, 19133.
 * : 1 or 0 (true/false) - Normally true after a world has been initialized properly after creation. If the initial simulation was canceled somehow, this can be false and the world will be re-initialized on next load.
 * : The name of the level.
 * : The name of the generator; "default", "flat", "largeBiomes", "amplified", "customized", or "debug_all_block_states". Not case sensitive, but always written in the case here.
 * : The version of the level generator. The effects of changing this are unknown, but values other than 0 have been observed.
 * : Controls options for the world generator. Used only if the world type is Superflat or Customized. The format for Superflat is a comma separated list of block IDs from the bottom of the map up, and each block ID may optionally be preceded by the number of layers and an "*" ("x" before 1.8). Damage values are not supported. The format for Customized is an extremely long String which has name:value pairs resembling JSON.
 * : The random level seed used to generate consistent terrain.
 * : 1 or 0 (true/false) - true if the map generator should place structures such as villages, strongholds, and mineshafts. Defaults to 1. Always 1 if the world type is Customized.
 * : The Unix time in milliseconds when the level was last loaded.
 * : The estimated size in bytes of the level. Currently not modified or used by Minecraft, but was previously.
 * : 1 or 0 (true/false) - true if cheats are enabled.
 * : 1 or 0 (true/false) - true if the player must delete their world on death in singleplayer. Affects all three game modes.
 * : The default game mode for the singleplayer player when they initially spawn. 0 is Survival Mode, 1 is Creative Mode, 2 is Adventure Mode, 3 is Spectator Mode. Note: Singleplayer worlds do not use this field to save which game mode the player is currently in.
 * : The current difficulty setting. 0 is Peaceful, 1 is Easy, 2 is Normal, and 3 is Hard. Defaults to 2.
 * : 1 or 0 (true/false) - True if the difficulty has been locked. Defaults to 0.
 * : The number of ticks since the start of the level.
 * : The time of day. 0 is sunrise, 6000 is mid day, 12000 is sunset, 18000 is mid night, 24000 is the next day's 0. This value keeps counting past 24000 and does not reset to 0.
 * : The X coordinate of the world spawn.
 * : The Y coordinate of the world spawn.
 * : The Z coordinate of the world spawn.
 * : Center of the world border on the X coordinate. Defaults to 0.
 * : Center of the world border on the Z coordinate. Defaults to 0.
 * : Width of the border. Defaults to 60000000.
 * : Defaults to 5.
 * : Defaults to 5.
 * : Defaults to 15.
 * : Defaults to 60000000.
 * : Defaults to 0.
 * : Defaults to 0.2.
 * : 1 or 0 (true/false) - true if the level is currently experiencing rain, snow, and cloud cover.
 * : The number of ticks before "raining" is toggled and this value gets set to another random value.
 * : 1 or 0 (true/false) - true if the rain/snow/cloud cover is a lightning storm and dark enough for mobs to spawn under the sky.
 * : The number of ticks before "thundering" is toggled and this value gets set to another random value.
 * : The number of ticks until "clear weather" has ended.
 * : The state of the Singleplayer player. This overrides the .dat file with the same name as the Singleplayer player. This is only saved by Servers if it already exists, otherwise it is not saved for server worlds. See Player.dat Format.
 * : The gamerules used in the world.
 * : The value for the given rule. This is always an NBT string, which is either   or   for the majority of rules (with it being a number for some other rules, and any arbitrary string for a user-defined rule).
 * : Information about the Minecraft version the world was saved in.
 * : An identifier for the version.
 * : The version name as a string, e.g. "15w32b"
 * : 1 or 0 (true/false) - Whether the version was a snapshot

session.lock format
This file contains the timestamp of when the level was last accessed. The file contains a single 64-bit integer in big endian format, which is the timestamp, stored as the number of milliseconds elapsed since 1970-01-01 00:00:00, in UTC.

Unlike typical lock files, this file ensures that the last program to access the level is that one that has read and write access. The process goes something like this:
 * 1) Program opens session.lock
 * 2) Program writes timestamp to session.lock
 * 3) Program monitors session.lock for changes
 * 4) If the contents of session.lock change, program aborts and gives up its lock on the level.

Minecraft can sometimes try to hold the lock on a level even after the player has started playing a different level, and this can cause strange behavior. It is recommended to ensure that Minecraft is closed before trying to acquire a lock on a level.