Философия Java3
Шрифт:
1
г
и
S
i
п
g
в
U
f
f
е
г
S
к
к
k
к
lim
pos |
Для
| mar
1
г
1
г
и
S
i
п
g
в
U
f
f
е
г
S
к
к
)
к
з
cap |
>
г
1
г
и
S
i
п
g
в
U
f
f
е
г
S
i
к
k
к
Rim
На следующей итерации значение метки приравнивается позиции:
mar
cap |
>
г
>
г
и
S
i
п
g
в
U
f
f
е
г
s
k
к
k
к
lim
pos I
Процесс продолжается до тех пор, пока не будет просмотрен весь буфер. В конце цикла while
г
и
S
i
п
g
в
U
f
f
е
г
S
i
к
k
к
posl
lim
При следующем вызове symmetricScramble процесс повторяется, и буфер CharBuffer возвращается к своему изначальному состоянию.
Отображаемые в память файлы
Механизм отображения файлов в память позволяет создавать и изменять файлы, размер которых слишком велик для прямого размещения в памяти. В таком случае вы считаете, что файл целиком находится в памяти, и работаете с ним как с очень большим массивом. Такой подход значительно упрощает код изменения файла. Небольшой пример:
//. io/LargeMappedFiles.java
// Создание очень большого файла, отображаемого в память
// {RunByHand}
import java.nio.*;
import java nio.channels.*;
import java.io.*;
import static net.mindview.util.Print.*.
public class LargeMappedFiles {
static int length = 0x8FFFFFF, // 128 MB public static void main(String[] args) throws Exception { MappedByteBuffer out =
new RandomAccessFileC'test.dat". "rw").getChannel .map(Fi1eChannel.MapMode.READ_WRITE. 0. length); for(int i = 0; i < length; i++)
out.put((byte)'x'); print("Запись завершена"); for(int i = length/2; i < length/2 +6; i++) printnb((char)out.get(i));
}
} ///:-
Чтобы одновременно выполнять чтение и запись, мы начинаем с создания объекта RandomAccessFile, получаем для этого файла канал, а затем вызываем метод тар, чтобы получить буфер MappedByteBuffer, который представляет собой разновидность буфера прямого доступа. Заметьте, что необходимо указать начальную точку и длину участка, который будет проецироваться, то есть у вас есть возможность отображать маленькие участки больших файлов.