Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 109

Автор Π‘Ρ€ΡŽΡ ЭккСль

//: io/Fi1eLocking.java import java.nio.channels.*; import java.util.concurrent.*; import java.io.*;

public class FileLocking {

public static void main(String[] args) throws Exception {

FileOutputStream fos= new FileOutputStreamCfile txt");

FileLock fl = fos.getChannel О .tryLockO.

if(fl != null) {

System.out.println("Π€Π°ΠΉΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½"); Ti meUnit.MILLISECONDS.sieep(100); fl .releaseO;

System ΠΎΠΈ^Ρ€Π³Π¨1ΠΏ("Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снята"),

}

fos.closeO;

}

} /* Output; Π€Π°ΠΉΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снята *///:-

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ FileLock, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ tryLock() ΠΈΠ»ΠΈ lock() класса FileChannel. (Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ Socket-Channel, DatagramChannel ΠΈ ServerSocketChannel Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ доступны Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса. Вряд Π»ΠΈ сокСт Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ двумя процСссами совмСстно.) ΠœΠ΅Ρ‚ΠΎΠ΄ tryLock() Π½Π΅ приостанавливаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Он пытаСтся ΠΎΠ²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π½ΠΎ Ссли Π΅ΠΌΡƒ это Π½Π΅ удаСтся (Ссли Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ» Π½Π΅ являСтся раздСляСмым), Ρ‚ΠΎ ΠΎΠ½ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. ΠœΠ΅Ρ‚ΠΎΠ΄ lockQ ΠΆΠ΄Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ удастся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ ΠΊΠ°Π½Π°Π», для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ lock(). Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снимаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ FileChannel. release().

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ

tryLockdong position, long size, boolean shared) ΠΈΠ»ΠΈ

lockdong position, long size, boolean shared)

БлокируСтся участок Ρ„Π°ΠΉΠ»Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ size ΠΎΡ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ position. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° совмСстной.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΡΠΏΠΎΡΠ°Π±Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊ измСнСнию Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Ρ„Π°ΠΉΠ»Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ участков Π½Π΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ„Π°ΠΉΠ»Π°. Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Ρ‹Π»Π° Π½Π°Π»ΠΎΠΆΠ΅Π½Π° Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΡ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ position Π΄ΠΎ position + size, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ„Π°ΠΉΠ» увСличился ΠΈ стал большС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° position + size, Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ position + size Π½Π΅ блокируСтся. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Ρ„Π°ΠΉΠ» Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ растСт.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ с ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ раздСляСмым доступом Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ встроСна Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму. Если опСрационная систСма Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ раздСляСмыС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Π±Ρ‹Π» сдСлан запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉ доступ. Π’ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (раздСляСмая ΠΈΠ»ΠΈ эксклюзивная) ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° FileLock.isShared().

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ части ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ упомянуто, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². Иногда ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‚Π°ΠΊΠΈΠΌ большим Ρ„Π°ΠΉΠ»ΠΎΠΌ трСбуСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Π³ΠΎ части, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ доступныС части Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами. Π’ частности, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π΅Π½ для Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π°Π·ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΡ… Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π°:

//: io/LockingMappedFiles.java

// Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ части ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

// {RunByHand}

import java.nio *,

import java nio channels *,

import java io *, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

public class LockingMappedFiles {

static final int LENGTH = Ox8FFFFFF; // 128 MB static FileChannel fc;

public static void main(String[] args) throws Exception { fc =

new RandomAccessFileC'test.dat", "rw").getChannel0; MappedByteBuffer out =

fc.map(Fi1eChannel.MapMode.READ_WRITE, 0. LENGTH); for(int i = 0; i < LENGTH; i++)

out.put((byte)'x'); new LockAndModify(out. 0, 0 + LENGTH/3); new LockAndModify(out, LENGTH/2, LENGTH/2 + LENGTH/4);

}

private static class LockAndModify extends Thread { private ByteBuffer buff; private int start, end;

LockAndModify(ByteBuffer mbb. int start, int end) { this.start = start; this.end = end; mbb.limit(end); mbb.position(start); buff = mbb.sliceO; startO;

}

public void runО { try {

// Монопольная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Π΅Π· пСрСкрытия;

FileLock fl = fc.lock(start, end, false);

System.out.println("Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ: "+ start +" to "+ end);

// ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ:

while(buff.position() < buff.limitO - 1) buff.put((byte)(buff.get О + 1)); fl.releasee);

System.out.println("ОсвобоТдСно: "+start+" to "+ end); } catch(IOException e) {

throw new RuntimeException(e);

}

}

}

} ///:-

Класс ΠΏΠΎΡ‚ΠΎΠΊΠ° LockAndModify устанавливаСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΅Π³ΠΎ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ slice(). Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ run() для Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° устанавливаСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (Π²Ρ‹ Π½Π΅ Π²ΠΏΡ€Π°Π²Π΅ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для Π±ΡƒΡ„Π΅Ρ€Π°, это ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ°Π½Π°Π»Π°). Π’Ρ‹Π·ΠΎΠ² lock() Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ синхронизации доступа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Ρƒ вас появляСтся нСкая «критичСская сСкция» с ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡŒΠ½Ρ‹ΠΌ доступом ΠΊ Π΄Π°Π½Π½ΠΎΠΉ части Ρ„Π°ΠΉΠ»Π°.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ автоматичСски ΡΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ JVM, Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠ°Π½Π°Π»Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ явно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ releaseQ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° FileLock, Ρ‡Ρ‚ΠΎ здСсь ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ.

Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Java содСрТит классы, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ Π² сТатом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (Ρ‚Π°Π±Π». 16.8). Они Π±Π°Π·ΠΈΡ€ΡƒΡŽΡΡ Π½Π° ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

Π­Ρ‚ΠΈ классы Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ символьно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Reader ΠΈ Writer, ΠΎΠ½ΠΈ надстроСны Π½Π°Π΄ Π±Π°ΠΉΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ классами InputStream ΠΈ OutputStream, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° сТатия Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ с символами, Π° с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. (ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ β€” достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы InputStreamReader ΠΈ OutputStreamWriter.)

Π’Π°Π±Π»ΠΈΡ†Π° 16.8. ΠšΠ»Π°ΡΡΡ‹ для сТатия Π΄Π°Π½Π½Ρ‹Ρ…

НазначСниС

CheckedlnputStream

CheckedOutputStream

DeflaterOutputStream ZipOutputStream

GZIPOutputStream

InflaterlnputStream ZipInputStream

GZIPInputStream

НазваниС класса

Π•Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ getCheckSum() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму для любого Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° InputStream (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΡ‚ΠΎΠΊΠ° распаковки) Π•Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ getCheckSum() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму для любого Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° OutputStream (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΡ‚ΠΎΠΊΠ° сТатия) Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для классов сТатия Π΄Π°Π½Π½Ρ‹Ρ…

Подкласс DeflaterOutputStream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ сТатиС Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ZIP

Подкласс DeflaterOutputStream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ сТатиС Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² GZIP

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для классов распаковки сТатых Π΄Π°Π½Π½Ρ‹Ρ…

Подкласс InflaterlnputStream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ распаковываСт сТатыС Π΄Π°Π½Π½Ρ‹Π΅,

хранящиСся Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ZIP

Подкласс InflaterlnputStream, Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сТатыС Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² GZIP

Π₯отя сущСствуСт Π²Π΅Π»ΠΈΠΊΠΎΠ΅ количСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ сТатия Π΄Π°Π½Π½Ρ‹Ρ…, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ZIP ΠΈ GZIP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, Ρ‡Π°Ρ‰Π΅ всСго. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ своими сТатыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ многочислСнных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для чтСния ΠΈ записи этих Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ².

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ сТатиС Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ GZIP

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ сТатия Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ GZIP являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым ΠΈ идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ситуаций, Π³Π΄Π΅ имССтся ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΏΠ»ΠΎΡ‚Π½ΠΈΡ‚ΡŒ (Π° Π½Π΅ Ρ€Π°Π·Ρ€ΠΎΠ·Π½Π΅Π½Π½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…). Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сТимаСтся Ρ„Π°ΠΉΠ»:

// io/GZIPcompress java // {ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹- GZIPcompress.java} import java util zip *, import java io *.

public class GZIPcompress {

public static void main(String[] args)

throws IOException { ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

if(args.length == 0) {

System out.printlnC

"ИспользованиС: \nGZIPcompress file\n" + "ΠΈΠ˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ GZIP для сТатия " + "Ρ„Π°ΠΉΠ»Π° Π² Π°Ρ€Ρ…ΠΈΠ² test.gz"); System.exit(l),

}

BufferedReader in = new BufferedReader( new FileReader(args[0])),

BufferedOutputStream out = new BufferedOutputStrearrK new GZIPOutputStreamC

new FileOutputStreamC'test gz"))),

System.out.println("3anncb Ρ„Π°ΠΉΠ»Π°");

int с;

while((c = in.readO) != -1) out.write(c);

in.closeO;

out.closeO;

System.out.printlnC"Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°");

BufferedReader in2 = new BufferedReader(

new InputStreamReader(new GZIPInputStreamC new FilelnputStreamC'test gz")))).

String s;

while((s = in2 readLineO) != null) System.out.printin(s);

}

} ///:-

Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с классами сТатия Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‡Π΅Π½ΡŒ просто: Π²Ρ‹ просто надстраиваСтС ΠΈΡ… для своСго ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… (GZIPOutputStream ΠΈΠ»ΠΈ ZipOutputStream для сТатия, GZIPInputStream ΠΈΠ»ΠΈ ZipInputStream для распаковки Π΄Π°Π½Π½Ρ‹Ρ…). Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ сводится ΠΊ элСмСнтарным опСрациям Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ продСмонстрированы ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Π΅ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ: ΠΏΠΎΡ‚ΠΎΠΊ in основан Π½Π° Reader, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ конструктор класса GZIPOutputStream ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π° основС OutputStream, Π½ΠΎ Π½Π΅ Writer. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊ GZIPInputStream прСобразуСтся Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Reader.

ΠœΠ½ΠΎΠ³ΠΎΡ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΠ²Ρ‹ ZIP

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сТатия Π΄Π°Π½Π½Ρ‹Ρ… ZIP, ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌΠΈ возмоТностями. Π‘ Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство Ρ„Π°ΠΉΠ»ΠΎΠ², Π° для чтСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ZIP Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ стандартный ZIP-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, поэтому сТатыС Сю Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ практичСски Π»ΡŽΠ±Ρ‹ΠΌ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° совпадаСт со структурой ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, Π½ΠΎ количСство Ρ„Π°ΠΉΠ»ΠΎΠ², ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ дСмонстрируСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ класса Checksum для получСния ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Π’Π°ΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм Π² Java Π΄Π²Π°: ΠΎΠ΄ΠΈΠ½ прСдставлСн классом АсИСг32'(этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ быстрСС), Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” классом CRC32 (ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Π½ΠΎ Ρ‚ΠΎΡ‡Π½Π΅Π΅).

//: io/ZipCompress.java

// ИспользованиС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ZIP для сТатия любого

// количСства Ρ„Π°ΠΉΠ»ΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

// {ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. ZipCompress java}

import java.util zip *;

import java io *;

import java.util *,

import static net mindview.util Print *,

public class ZipCompress {

public static void mainCString[] args) throws IOException {

FileOutputStream f = new FileOutputStreamC'test zip"). CheckedOutputStream csum =

new CheckedOutputStream(f. new Adler320). ZipOutputStream zos = new ZipOutputStream(csum). BufferedOutputStream out =

new BufferedOutputStream(zos). zos setComment("ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ZIP-сТатия Java"). // Однако ΠΏΠ°Ρ€Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для получСния коммСнтария // getCommentO Π½Π΅ сущСствуСт for(String arg . args) {

print("3anncb Ρ„Π°ΠΉΠ»Π° " + arg). BufferedReader in =