�@
Go to Previous Page Go to Contents Go to Java Page Go to Next Page
New Features of Java2 SDK, Standard Edition, v1.4
�@
�@

New I/O FileChannel

�@
�@

�t�@�C���Ɋւ��邱�ƂȂ��

�@
�@

Channel �C���^�t�F�[�X�Q���C���v�������g�����N���X�� 1 �‚� FileChannel �N���X������܂��B�N���X���� File �Ƃ‚����炢�ł�����A�t�@�C���ɓ������� Channel �Ƃ������Ƃ��ł��܂��B

����͂��� FileChannel �Ɋւ��Ď��グ�Ă݂܂��傤�B�ł����AFileChannel �N���X�̋@�\�̂����AChannel �C���^�t�F�[�X�Q�Œ�`����Ă�����̂� Channel �������Ŏ��グ�܂�������A���̑��� FileChannel �N���X���L�̋@�\�Ɋւ��Ē��ׂĂ����܂��傤�B

�@

�@
�@ �|�W�V���� �@
�@

Buffer �N���X�ɂ́A�ǂݏ������s�����ʒu������ position �Ƃ����v���p�e�B������܂������AFileChannel �N���X�ɂ����l�� position ������܂��B�Ƃ͂������̂́ABuffer �N���X�̑��̃v���p�e�B limit �� capacity �͂���܂���B

�t�@�C���̓ǂݏ������s���� position ���ǂ̂悤�ɕω����邩���ׂĂ݂܂��傤�B

�A�v���P�[�V�����̃\�[�X FileChannelTest1.java
ByteBufferUtility

ByteBufferUtility �� Buffer �̂Ƃ��ɂ��g�p���܂������ABuffer �̗v�f�\���Ɏg�p���Ă��܂��B����ȍ~�̃T���v���ł͂قƂ�ǂ��̃N���X�𗘗p���Ă��܂��B

���āAFileChannelTest1 �N���X�ł̓t�@�C�������[�h/���C�g�ŃI�[�v������ꍇ�ƁA�A�y���h���[�h�ŃI�[�v������ꍇ�̗������s���Ă��܂��B

�܂��̓��[�h/���C�g�ŃI�[�v������ꍇ�ł��BpositionCheck1 ���\�b�h������ɑΉ����܂��B���̃��\�b�h�ł� RandomAccessFile �N���X���g�p���ăt�@�C�����I�[�v�����Ă��܂��B

    public void positionCheck1(String filename){
        try{
            RandomAccessFile raFile = new RandomAccessFile(filename, "rw");
            FileChannel channel = raFile.getChannel();
 
            System.out.println("\n\nFile Opened as Read Write mode.");

FileChannel �I�u�W�F�N�g�͑O��g�p�����悤�� getChannel ���\�b�h���g�p���܂��B�������A���[�h�I�����⃉�C�g���[�h�ŃI�[�v�����邱�Ƃ��”\�ł��B���̏ꍇ�� FileInputStream �� FileOutputStream �Ńt�@�C�����I�[�v�������Ƃ��Ɠ���͓����ɂȂ�܂��B

���āAposition ���Z�b�g������Q�b�g����̂� position ���\�b�h���g�p���܂��B�����Ȃ����ƃQ�b�g�A����������΃Z�b�g�ɂȂ�܂��B����� Buffer �Ɠ����ł��ˁB

            System.out.println("\nSize: " + channel.size());
            System.out.println("Position: " + channel.position());

Buffer �� capacity �ɑ���������̂́A�t�@�C���̃T�C�Y�ɂȂ�܂��B����� size ���\�b�h�œ��邱�Ƃ��ł��܂��B

���āA�ǂݍ��ރt�@�C����p�ӂ��Ă����܂��傤�B�P�ɐ����� 01234... �ƕ���ł��邾���̃t�@�C���ɂ��Ă����܂��B�t�@�C���̃T�C�Y�� 200 byte �ł��B

�T���v���t�@�C�� sample.txt

�����܂ł̕����̏o�͌��ʂ�

C:\temp>java FileChannelTest1 sample.txt


File Opened as Read Only mode.

Size: 200
Position: 0

�t�@�C���̃T�C�Y�� 0�Aposition �̏����l�� 0 �Ƃ������Ƃ��o�͂���Ă��܂��B

���āA�ǂݍ��݂����āA����� position ���ړ����Ă݂܂��B

            ByteBuffer buffer = ByteBuffer.allocate(10);
            channel.read(buffer);
 
            System.out.println("Read 10 bytes");
            ByteBufferUtility.printByteBuffer(buffer);
 
            System.out.println("Position: " + channel.position());
 
            System.out.print("\nPosition changes from " + channel.position());
 
            channel.position(5);
 
            System.out.println(" to " + channel.position());
 
            System.out.println("\nRead 10 bytes");
            buffer.clear();
            channel.read(buffer);
 
            ByteBufferUtility.printByteBuffer(buffer);
            System.out.println("Position: " + channel.position());

�����ōs���Ă���̂�

  1. 10 byte �ǂݍ���
  2. position �� 5 �Ɉړ�
  3. �Ă� 10 byte �ǂݍ���

���s����Ǝ��̂悤�ɂȂ�܂����B

Read 10 bytes
                                        PLC
 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
Position: 10

Position changes from 10 to 5

Read 10 bytes
                                        PLC
 [35, 36, 37, 38, 39, 30, 31, 32, 33, 34]
Position: 15

������ 0 �� ASCII �ł� 0x30 �ɑ������܂��̂ŁA�������ǂݍ��߂Ă��܂��B10 byte �ǂݍ��߂΁Aposition �� 10 �����i�݂܂��B

position �͐i�߂邱�Ƃ��A�߂����Ƃ��”\�ł��B�����ł� 5 byte �߂��Ă��܂��Bposition ���ړ����Ă���̓ǂݍ��݂��s���ƑO��̓ǂݍ��݂̏o�͂Ɣ����_�u���Ă���̂�������̂ŁA�������ǂݍ��߂Ă��܂��B

�ŏI�I�ɂ� position �� 10 byte �ǂݍ��񂾂̂� 15 �ɂȂ�܂����B

���͏������݂����Ă݂܂��傤�B

            System.out.println("\nWrite 4 bytes");
            buffer = ByteBuffer.wrap(new byte[]{0x41, 0x42, 0x43, 0x44});
            channel.write(buffer);
 
            System.out.println("Position: " + channel.position());

0x41 �� 'A' �ɑ�������̂ŁA"ABCD" �Ə������݂��s���Ă��܂��B

Write 4 bytes
Position: 19

���s������� sample.txt ���G�f�B�^�ȂǂŊJ���Ă݂āA15 �����ڂ��� "ABCD" �ƃ��C�g����Ă���̂��m�F���Ă݂Ă��������B

���̓A�y���h���[�h�Ńt�@�C�����I�[�v������ position ���ǂ̂悤�Ɉړ����邩���Ă݂܂��傤�B�A�y���h���[�h�Ńt�@�C�����I�[�v������ɂ� FileOutputStream �̃R���X�g���N�^�Ŏw�肵�܂��B

    public void positionCheck2(String filename){
        try{
            FileOutputStream stream = new FileOutputStream(filename, true);
            FileChannel channel = stream.getChannel();
 
            System.out.println("\n\nFile Opened as Append mode.");
 
            System.out.println("\nSize: " + channel.size());
            System.out.println("Position: " + channel.position());

�����悤�ɏ�����Ԃ� position �̒l���o�͂��Ă݂܂��B���ʂ͎��̂悤�ɂȂ�܂����B

File Opened as Append mode.

Size: 200
Position: 0

�A�y���h���[�h�Ȃ̂� position �� 200 �ɂȂ邩�Ǝv�����̂ł����A0 �ɂȂ��Ă��܂����B

����ł́A�����ŏ������݂��s������ position �� 0 �̂Ƃ���ɏ������݂��s���̂ł��傤���B���������A����Ă݂܂��傤�B

            ByteBuffer buffer = ByteBuffer.wrap(
                             new byte[]{0x41, 0x42, 0x43, 0x44});
            channel.write(buffer);

            System.out.println("\nWrite 4bytes");

            System.out.println("\nSize: " + channel.size());
            System.out.println("Position: " + channel.position());

��قǂƓ����悤�ɁAABCD �̕�������������ł��܂��B���s���ʂ�

Write 4bytes

Size: 204
Position: 204

�ǂ����A�������ނƂ��ɂ܂� position ���t�@�C�����Ɉړ����Ă��珑�����ނ悤�ł��B���ʓI�ɏo�͂��ꂽ�t�@�C�������Ă݂Ă��Ō�ɉ������Ă��邱�Ƃ�������܂��B

�@

�@
�@ �������Ƀ}�b�v �@
�@

Buffer �N���X�̔h���N���X�� 1 �‚� MappedByteBuffer �Ƃ����̂�����܂��B���̃N���X������ Buffer �̉���ł͐������s���܂���ł����B�Ƃ����̂��AFileChannel �N���X�ƈꏏ�Ɏg��Ȃ���ΈӖ����Ȃ���������ł��B

����ƁA�����œo��Ƃ����킯�ł��B

MappedByteBuffer �N���X�́A���O�������Ă���悤�Ƀ}�b�s���O���ꂽ Buffer �������N���X�ł��B

���Ƀ}�b�v�����̂��Ƃ����ƁA�������肾�Ǝv���܂����A�������ł��B

Buffer �I�u�W�F�N�g���������ɒ��ڒu���Ƃ����΁AByteBuffer �� allocateDirect ���\�b�h�Ő�������� Buffer �I�u�W�F�N�g���v���o���܂� (Buffer �̉�����Q�Ƃ��Ă�������)�B��������ۂɂ� MappedByteBuffer �N���X�̔h���N���X�ł��� DirectByteBuffer �N���X�̃I�u�W�F�N�g�ł��B

���āAFileChannel �N���X�� MappedByteBuffer �N���X���ꏏ�Ɏg���΁A�t�@�C���� Buffer �I�u�W�F�N�g�Ƃ��ă������Ƀ}�b�v���邱�Ƃ��ł��܂��B

�t�@�C�����������Ƀ}�b�v����Ƃ����ƕ�����ɂ����̂ŁA�t�@�C���̃L���b�V�����������ɍ��Ƃ�������������₷���̂ł͂Ȃ��ł��傤���B�n�[�h�f�B�X�N�� CD-ROM �Ȃǂ̓������ɔ�ׂ�΃A�N�Z�X���x�͂��Ȃ�x���Ȃ�܂��B�����ŁA�L���b�V������邱�ƂŃn�[�h�f�B�X�N�Ȃǂɂ���t�@�C���ł������悭�A�N�Z�X�ł���悤�ɂȂ�܂��B

�t�@�C�����������Ƀ}�b�v����ɂ� FileChannel �N���X�� map ���\�b�h���g�p���܂��Bmap ���\�b�h�̖߂�l�� MappedByteBuffer �I�u�W�F�N�g�ɂȂ�܂��B�܂��Amap ���\�b�h�̈����̓}�b�s���O���J�n����ʒu�ƃT�C�Y�A�� 3 �����̓}�b�v�̕��@�������܂��B���̃}�b�v�̕��@�͎��� 3 ��ނ�����܂��B

�萔 ����
FileChannel.MapMode.READ_ONLY ���[�h�I�����̃}�b�s���O
FileChannel.MapMode.READ_WRITE ���[�h/���C�g���”\�ȃ}�b�s���O
FileChannel.MapMode.PRIVATE �t�@�C���̃R�s�[�̃}�b�s���O (Copy on Write)

READ_ONLY �� READ_WRITE �͂����ɕ�����Ǝv���܂����APRIVATE �͕�����ɂ����ł��ˁB�t�@�C���̃R�s�[���}�b�v����̂ŁA�}�b�v���ꂽ MappedByteBuffer �I�u�W�F�N�g�ɑ΂��ď������݂��s���Ă��A���Ƃ̃t�@�C���ɂ͔��f����Ȃ��Ƃ������ƂɂȂ�܂��B

(��) �x�[�^�̎��ɂ̓}�b�v�̎�ނ� FileChannel �N���X�̒萔 MAP_RO, MAP_RW, MAP_COW �ł������AFileChannel.MapMode �N���X�̕ϐ��ɕύX����Ă��܂��B���� MAP_COW �� PRIVATE �ɂȂ����̂ŁA���ӂ��K�v�ł��B (Apr, 2002)

�t�@�C���}�b�s���O�̃T���v�����t�@�C���̃R�s�[�ɂ��Ă݂܂����B

�A�v���P�[�V�����̃\�[�X FileChannelTest2.java

�t�@�C���̃R�s�[���s���ɂ͓��R�Ȃ�����͂̃t�@�C���Əo�͂̃t�@�C��������܂����A�ǂ�����}�b�v���邩�� 2 �ʂ�̕��@������܂��BFileChannelTest2 �ł� copyUsingMappedByteBuffer1 ���\�b�h�����͌��̃t�@�C�����}�b�v���AcopyUsingMappedByteBuffer2 ���\�b�h���o�͐�̃t�@�C�����}�b�v���Ă��܂��B

FileChannelTest2 �̎��s�ɂ͈����Ƃ��ăR�s�[���t�@�C�����ƃR�s�[��t�@�C�������K�v�ɂȂ�܂��B���s����ƁA�ǂ���̕��@�ōs���������Ă���̂ŁA1 �� 2 ����͂��܂� (���̗�ł͐��F�Ŏ��������������͂��s���������ł�)�B����ƁA���͂ɉ��������@�ŃR�s�[���s���܂��B

C:\temp>java FileChannelTest2 sample.txt sample1.txt
�ǂ���̕��@�ŃR�s�[���܂���
1: �R�s�[�����������Ƀ}�b�v 2: �R�s�[����������Ƀ}�b�v
> 1
�R�s�[���t�@�C�����������Ƀ}�b�v���ăR�s�[���s���܂�
C:\temp>

����ł́A�\�[�X�����Ă����܂��傤�B�܂��̓R�s�[���t�@�C�����������Ƀ}�b�v���� copyUsingMappedByteBuffer1 ���\�b�h����ł��B

    private void copyUsingMappedByteBuffer1(String srcFilename,
                                            String destFilename){
        System.out.println("�R�s�[���t�@�C�����������Ƀ}�b�v���ăR�s�[���s���܂�");
 
        try{
            FileInputStream in = new FileInputStream(srcFilename);
            FileChannel inputChannel = in.getChannel();
 
            FileOutputStream out = new FileOutputStream(destFilename);
            FileChannel outputChannel = out.getChannel();
 
            ByteBuffer buffer = inputChannel.map(FileChannel.MapMode.READ_ONLY,
                                                 0, (int)inputChannel.size());
            outputChannel.write(buffer);
 
            outputChannel.close();
            inputChannel.close();
 
        }catch(FileNotFoundException ex){
            ex.printStackTrace();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }

map ���\�b�h�̈����́A�� 1 �������}�b�v�̕��@�A�� 2, 3 �������}�b�s���O���J�n����ʒu�ƃT�C�Y�ɂȂ�܂��B

�R�s�[���̃t�@�C�����}�b�v����̂ŁA���[�h�I�����[�Ń}�b�v���s���܂��B���̗�ł̓t�@�C���̂��ׂĂ��}�b�v���Ă��܂����A�t�@�C�����傫���ꍇ�͉��񂩂ɋ�؂��čs���K�v������Ǝv���܂��B

��́A�}�b�v�������ʂ� ByteBuffer �I�u�W�F�N�g���R�s�[��� Channel �I�u�W�F�N�g�ɏ����o���܂��B

���͂̏������Ȃ��̂ŕςȊ����ł����A����ŃR�s�[���ł��Ă��܂��܂��B

�R�s�[��̃t�@�C�����}�b�v����ꍇ�������悤�ɍs���܂��B

    private void copyUsingMappedByteBuffer2(String srcFilename,
                                            String destFilename){
        System.out.println("�R�s�[��t�@�C�����������Ƀ}�b�v���ăR�s�[���s���܂�");
 
        try{
            FileInputStream in = new FileInputStream(srcFilename);
            FileChannel inputChannel = in.getChannel();
  
            RandomAccessFile out = new RandomAccessFile(destFilename, "rw");
            FileChannel outputChannel = out.getChannel();
 
            MappeddByteBuffer buffer = outputChannel.map(FileChannel.MapMode.READ_WRITE,
                                               0, (int)inputChannel.size());
            inputChannel.read(buffer);
            buffer.force();
 
            outputChannel.close();
            inputChannel.close();
 
        }catch(FileNotFoundException ex){
            ex.printStackTrace();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }

�t�@�C�����}�b�v���ē���ꂽ MappedByteBuffer �I�u�W�F�N�g���g�p���āA���͂��s���悤�ɂ��Ă��܂��B

�Ԃŏ����ꂽ�Ō�̍s�ɂ��� force ���\�b�h�̓}�b�v���ꂽ MappedByteBuffer �ɉ������ύX���t�@�C���ɔ��f������悤�ɍs�����̂ŁAOutputStream �N���X�� flush ���\�b�h�� MappedByteBuffer �N���X�łƂ������Ƃ���ł��傤���B

��قǂ̗�Ƃ͋t�ɏo�͂̏������Ȃ��̂ŕςȊ����ł����A����ŃR�s�[�͂ł��Ă��܂��܂��B

���̏͂ł́A�܂��Ⴄ���@�Ńt�@�C���̃R�s�[���s���T���v�����Љ�܂��傤�B

�@

�@
�@

���͂Əo�͂������‚���

�@
�@

UNIX ���g�p���Ă���ƃp�C�v���ƂĂ��֗��Ȃ��Ƃ�������܂��B�����Ƃ��A�ŋ߂� GNOME �� KDE �Ȃǂ��g�p���Ă���ƁA����ق�xterm �Ȃǂ��g�p���Ȃ��̂Ńp�C�v�̉��b�ɂ������邱�Ƃ����Ȃ��Ȃ��Ă��܂��Ă܂����B�܂��AWindows �ł������� DOS ����ʏ�̃I�y���[�V�����ł͎g�p���܂��񂩂�A�p�C�v���g�p���邱�Ƃ��قƂ�ǂȂ��A���֗̕������������Ă��������Ȃ��̂��c�O�ł��B

�ȒP�ɂ����΃p�C�v�͂���v���O�����̕W���o�͂𑼂̃v���O�����̕W�����͂ɂ����‚���Ƃ������Ƃ��s���܂��B�������邱�ƂŁA�����̃v���O���������т‚��邱�Ƃ����Ƃ��ȒP�ɂł��Ă��܂��܂��B

����Ɠ����悤�Ȃ��Ƃ� FileChannel �N���X�ł��s�����Ƃ��ł��܂��B�����Ƃ��AFileChannel �N���X�Ȃ̂œ��͂��o�͂̂ǂ��炩����̓t�@�C���ɂȂ��Ă��܂��܂��B

���Ƃ��΁A���̋@�\���g�p���邱�ƂŒʐM���e�����̂܂܃t�@�C���ɕۑ�����悤�Ȃ��Ƃ����Ƃ��ȒP�ɂł��Ă��܂��܂��B

���������A���̋@�\���g�p�����T���v��������Ă݂܂��傤�B��͂�A�t�@�C���̃R�s�[���ނɂ��܂��傤�B

�A�v���P�[�V�����̃\�[�X FileChannelTest3.java

FileChannel �I�u�W�F�N�g�����͂������� (�v����Ƀt�@�C���̓��e) �𑼂� Channel �I�u�W�F�N�g�̏o�� (���ۂɂ� WritableByteChannel �I�u�W�F�N�g) �ɂ����‚���ɂ́AtransferTo ���\�b�h���g�p���܂��B

�t�ɁAReadableByteChannel �I�u�W�F�N�g�̏o�͂� FileChannel �̓��͂ɂ���ꍇ�́AtransferFrom ���\�b�h���g�p���܂��B

���ꂼ��AFileChannelTest3 �N���X�� copyUsingTransferTo ���\�b�h�� copyUsingTransferFrom ���\�b�h���Ή����Ă��܂��BcopyUsingTransferTo ���\�b�h�����Ɏ����܂��B

    private void copyUsingTransferTo(String srcFilename, String destFilename){
        System.out.println("TransferTo ���g�p���ăR�s�[���s���܂�");
 
        try{
            FileInputStream in = new FileInputStream(srcFilename);
            FileChannel inputChannel = in.getChannel();
 
            FileOutputStream out = new FileOutputStream(destFilename);
            FileChannel outputChannel = out.getChannel();
 
            inputChannel.transferTo(0, (int)inputChannel.size(), outputChannel);
 
            outputChannel.close();
            inputChannel.close();
 
        }catch(FileNotFoundException ex){
            ex.printStackTrace();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }

�ԂŎ����������� inputChannel �I�u�W�F�N�g�� outputChannel �Ɍ��ѕt���Ă��镔���ł��B

transferTo ���\�b�h�̈����͑� 1 ������ WritableByteChannel �I�u�W�F�N�g�Ɍ��ѕt�����J�n����ʒu�A�� 2 �������T�C�Y�ɂȂ�܂��B�����ł́A�t�@�C���̃R�s�[�Ȃ̂Ńt�@�C���̂͂��߂���Ō�܂Ō��ѕt�����s���Ă��܂��B

transferTo ���\�b�h�̍Ō�̑� 3 ���������ѕt�����s�� WritableByteChannel �I�u�W�F�N�g�ł��BFileChannel �N���X�� WritableByteChannel �C���^�t�F�[�X���C���v�������g���Ă���̂ŁAFileChannel �I�u�W�F�N�g�ł��� outputChannel ���g�p���Ă��܂��B

��������ƁA���ۂ� read �� write �Ƃ��������o�͂̏������܂����������Ȃ��Ă��R�s�[���s���܂��B�Ȃ񂩁A�ςȊ����ł��ˁB

���� transferFrom ���g�p���� copyUsingTransferFrom ���\�b�h�ł��B���̃��\�b�h�� copyUsingTransferTo ���\�b�h�ƂقƂ�Ǔ����ɂȂ�܂��B

    private void copyUsingTransferFrom(String srcFilename, String destFilename){
        System.out.println("TransferTo ���g�p���ăR�s�[���s���܂�");

        try{
            FileInputStream in = new FileInputStream(srcFilename);
            FileChannel inputChannel = in.getChannel();

            FileOutputStream out = new FileOutputStream(destFilename);
            FileChannel outputChannel = out.getChannel();

            outputChannel.transferFrom(inputChannel, 0, (int)inputChannel.size());

            outputChannel.close();
            inputChannel.close();

        }catch(FileNotFoundException ex){
            ex.printStackTrace();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }

�Ԃ̕����������قȂ邾���ŁA�����ł� transferFrom ���\�b�h���g�p���Ă��܂��BtransferFrom ���\�b�h��p���邱�ƂŁA���� Channel �I�u�W�F�N�g�����͂������̂����̂܂� FileChannel �I�u�W�F�N�g�̏o�͂Ƃ��Ďg�p���邱�Ƃ��ł��܂��B

transferFrom ���\�b�h�̑� 1 ������ FileChannel �I�u�W�F�N�g�Ɍ��ѕt������ ReadableByteChannel �I�u�W�F�N�g�ł��B��͂�AFileChannel �N���X�� ReadableByteChannel �C���^�t�F�[�X���C���v�������g���Ă��܂�����AinputChannel �����̂܂܎g�p�ł��܂��B

�� 2, 3 ������ transferTo ���\�b�h�Ɠ��l�Ɍ��ѕt�����J�n����ʒu�ƃT�C�Y�ł��B

�ƂĂ��������Ȃ��R�s�[���ł��Ă��܂��܂����B

FileChannelTest3 �N���X�ł� transferTo/transferFrom �Ō��т‚����� 2 �‚� Channel �I�u�W�F�N�g�͗����Ƃ� FileChannel �I�u�W�F�N�g�ł������ASocketChannel �I�u�W�F�N�g�Ȃǂ̑��� Channel �I�u�W�F�N�g�ł��܂��������܂��܂���B���ꂱ���AUNIX �̃p�C�v�̂悤�ɉ��ł����ѕt���邱�Ƃ��”\�ɂȂ�̂ł� (�����Ƃ� Channel �I�u�W�F�N�g�Ɍ��肳��܂���...)�B

�����܂ŁA3 �‚̎�@��p���ăt�@�C���̃R�s�[���L�q���Ă��܂����B

  1. read/write ���\�b�h��p�����A�ł����ʂ̃R�s�[
  2. map ���\�b�h���g�p���āA�t�@�C�����������Ƀ}�b�v������@
  3. transferTo/transferFrom ���\�b�h���g�p���āA2 �‚� Channel �I�u�W�F�N�g�����т‚�����@

�P���ȃR�s�[�̏ꍇ�A�p�t�H�[�}���X�� transferTo/transferFrom ���\�b�h���g�p�������̂��ł������Aread/write ���\�b�h���ł��Ⴂ�悤�ł��B�]�T�̂�����́AChannel �̉���ōs�����悤�Ȕ�r�����Ă݂��炢�����ł��傤���B

�@

�@
�@

���b�N

�@
�@

���āAFileChannel �N���X�̍Ō�Ɏc���ꂽ�@�\�̓��b�N�ł��B���܂łȂ��������Ƃ��s�v�c�Ȃ��炢�ł����A����ƃt�@�C���̃��b�N�� Java �ōs�����Ƃ��ł���悤�ɂȂ�܂����B

�����������̃T���v�������s���Ă݂Ă��������B

�A�v���P�[�V�����̃\�[�X FileChannelTest4.java

FileChannelTest4 �����s���ɂ͈����ɃI�[�v������t�@�C�������w�肵�܂��B�v���O�����̒��Ńt�@�C���̃��b�N���s���܂��B���b�N�������[�X���邩�����Ă���_�C�A���O���o�܂��̂ŁA���̂܂܂ɂ��đ��̃v���O������ FIleChannelTest4 �ŃI�[�v�������t�@�C�����I�[�v�����Ă݂܂��傤�B���Ƃ��΁AFileChannelTest1 �Ȃǂ�������������܂���B

�Ȃ��Ȃ����n�������킷�͓̂���̂ł����A����Ȋ����ɂȂ�܂��B

1. FileChannelTest4 �̎��s

C:\temp>java FileChannelTest4 sample.txt
Acquire Lock.
Lock: sun.nio.ch.FileLockImpl[0:9223372036854775807 exclusive valid]
Read 10 bytes
                                        PLC
 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]

2. �t�@�C���̃��b�N��������邩��₢���킹��_�C�A���O���\�������

bN[X_CAO

3. �_�C�A���O�͂��̂܂܂ɂ��Ă���

4. ���� DOS �v�����v�g�� FileChannelTest1 �̎��s

C:\temp>java FileChannelTest1 sample.txt
 
File Opened as Read Write mode.
 
Size: 200
Position: 0
java.io.IOException: �v���Z�X�̓t�@�C���ɃA�N�Z�X�ł��܂���B�ʂ̃v���Z�X���t�@
�C���̈ꕔ�����b�N���Ă��܂��B
        at sun.nio.ch.FileDispatcher.read0(Native Method)
        at sun.nio.ch.FileDispatcher.read(FileDispatcher.java:32)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:212)
        at sun.nio.ch.IOUtil.read(IOUtil.java:195)
        at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:112)
        at FileChannelTest1.positionCheck1(FileChannelTest1.java:23)
        at FileChannelTest1.<init>(FileChannelTest1.java:8)
        at FileChannelTest1.main(FileChannelTest1.java:86)
  
  
File Opened as Append mode.
 
Size: 200
Position: 0
java.io.IOException: �v���Z�X�̓t�@�C���ɃA�N�Z�X�ł��܂���B�ʂ̃v���Z�X���t�@
�C���̈ꕔ�����b�N���Ă��܂��B
        at sun.nio.ch.FileDispatcher.write0(Native Method)
        at sun.nio.ch.FileDispatcher.write(FileDispatcher.java:48)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:108)
        at sun.nio.ch.IOUtil.write(IOUtil.java:90)
        at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:151)
        at FileChannelTest1.positionCheck2(FileChannelTest1.java:69)
        at FileChannelTest1.<init>(FileChannelTest1.java:9)
        at FileChannelTest1.main(FileChannelTest1.java:86)

C:\temp>

5. �_�C�A���O���u�����v����ƁA�t�@�C�����N���[�Y���邩��₢���킹��_�C�A���O���\�������

t@CN[Y_CAO

6. �_�C�A���O�͂��̂܂܂ɂ��Ă����āA�Ă� FileChannelTest1 �����s

C:\temp>java FileChannelTest1 sample.txt
 


File Opened as Read Write mode.

Size: 200
Position: 0
Read 10 bytes
                                        PLC
 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
Position: 10

              �ȉ��A��
7. �t�@�C���̃N���[�Y�̃_�C�A���O���u�����v���ďI��������B

�@

�t�@�C���Ƀ��b�N���������Ă����Ԃ��ƁA���̃A�v���P�[�V�����ł��̃t�@�C���ɃA�N�Z�X���s���ƃG���[���������邱�Ƃ���������ł��傤���B

�t�@�C�������b�N�����Ƃ��ɁAFileChannelTest1 �����s�������̂� 4. �ɂȂ�A�I�[�v�������������b�N���������Ă��Ȃ� (���b�N���������) �̂� 6. �ɂȂ�܂��B4. �̏ꍇ�͗�O���������A6. �ł͕��ʂɓǂݏ������s���܂����B

�܂��A���b�N���������Ă����� (3. �̏��) �ŁA�Ⴆ�΃����� (notepad) �� sample.txt ���J���Ă݂܂��傤�B�������ł͊J�����Ƃ͂ł���̂ł����A�㏑���ۑ������悤�Ƃ���Ǝ��̂悤�ȃ_�C�A���O���\������āA���̂܂܂ł͕ۑ����ł��Ȃ��悤�ɂȂ��Ă��܂��܂����B

bŇxs_CAO

����ł́A�v���O�����Ń��b�N���s���ɂ͂ǂ�����̂ł��傤�BFileChannel �N���X�ɂ̓t�@�C���̃��b�N�������邽�߂� 4 �‚̃��\�b�h���p�ӂ���Ă��܂��Block ���\�b�h�� tryLock ���\�b�h�ŁA���ꂼ������Ȃ��ƈ�������̃��\�b�h������܂��B

lock ���\�b�h�� tryLock ���\�b�h�̈Ⴂ�́Alock ���\�b�h���t�@�C���̃��b�N��������܂Ńv���O�����̎��s���u���b�N�����̂ł����AtryLock �̓��b�N���Ƃ�Ă��Ƃ�Ȃ��Ă������Ƀ��\�b�h����߂��Ă���Ƃ����Ⴂ������܂��B

�t�@�C���̃��b�N�̏�Ԃ� FIleLock �N���X�ł���킳��܂��Block ���\�b�h�� tryLock ���\�b�h�̖߂�l�� FileLock �I�u�W�F�N�g�ɂȂ�܂��BtryLock ���\�b�h���g�p�����Ƃ��́A���b�N���Ƃ��� FileLock �I�u�W�F�N�g���߂�܂����A�Ƃ�Ȃ���� null ���A��܂��B

FileChannelTest4 �Ń��b�N���擾���镔���͎��̂悤�ɂȂ�܂��B�ϐ� channel �� FileChannel �I�u�W�F�N�g�ł��B

            // Acquire Lock
            System.out.println("Acquire Lock.");
            FileLock lock = channel.lock();
            System.out.println("Lock: " + lock);

2 �s�ڂ� 4 �s�ڂ͒P�ɕ\�����s���Ă��邾���ŁA���ۂɃ��b�N�������Ă���̂� 3 �s�ڂ� lock ���\�b�h���g�p���Ă��镔���ł��B

�O�q�����悤�� lock ���\�b�h�̓��b�N��������܂ŏ������u���b�N���܂��B4 �s�ڂ̏o�͌��ʂ͎��̂悤�ɂȂ�܂����B

C:\temp>java FileChannelTest4 sample.txt
Acquire Lock.
Lock: sun.nio.ch.FileLockImpl[0:9223372036854775807 exclusive valid]

FileLock �N���X�ɂ͂����‚��v���p�e�B������܂��B�����̒l�� [ �� ] �Ɉ͂܂�Ă��镔���ł��B�͂��߂̃R�����ŋ�؂��Ă��鐔���̓��b�N���Ă��镔���������Ă��܂��B�͂��߂̐��������b�N�̊J�n�ʒu�ŁA���̐������T�C�Y�ł��B

���� "exclusive" �Ƃ����̂̓��b�N�̎�ނ�\���Ă���A"shared" �� "exclusive" �̂ǂ��炩�ɂȂ�܂��B

�Ōオ���b�N���L�����ǂ�����\���Ă��܂��B���b�N���������Ă���� "invalid" �ɂȂ�܂��B

�����ŏo�͂����l�� FileLock �N���X�� position ���\�b�h�Asize ���\�b�h�AisShared ���\�b�h�AisValid ���\�b�h�œ��邱�Ƃ��ł��܂��B

���̂悤�� FileLock �N���X�ɂ̓v���p�e�B������̂ł����A�����Ȃ��� lock ���\�b�h�ł͂������w�肷�邱�Ƃ��ł��܂���B�w�肷��ɂ͈�������� lock ���\�b�h���g�p���܂��B

�A�v���P�[�V�����̃\�[�X FileChannelTest5.java

FileChannelTest5 �����s���鎞�ɂ͈����Ƃ��āA�t�@�C�����A���b�N�J�n�ʒu�A���b�N���s���T�C�Y�A�V�F�A�[�h���b�N���ǂ������w�肵�܂��B

���b�N���s���Ă��镔���͎��̂悤�ɂȂ��Ă��܂��B

    private void access(String filename, int position, int size, boolean shareFlag){
 
        try{
            RandomAccessFile raFile = new RandomAccessFile(filename, "rw");
            FileChannel channel = in.getChannel();
 
            // Acquire Exclusive Lock
            System.out.println("Acquire Lock.");
            FileLock lock = channel.lock(position, size, shareFlag);
            System.out.println("Lock: " + lock);

�Ōォ�� 2 �s�ڂŁA���b�N���s���Ă��܂����AFileChannelTest4 �Ƃ� lock ���\�b�h�̈��������邩�����̈Ⴂ�ɂȂ�܂��B

�t�@�C���� 1 �����������b�N�������邱�Ƃ��ł���̂ŁA���̂悤�Ȃ��Ƃ��”\�ł��B

1. FileChannelTest5 �̎��s

C:\temp>java FileChannelTest5 sample.txt 0 10 exclusive
Acquire Lock.
Lock: sun.nio.ch.FileLockImpl[0:10 exclusive valid]
Read 10 bytes from position: 0

2. �t�@�C���̃��b�N��������邩��₢���킹��_�C�A���O���\�������

bN[X_CAO

3. �_�C�A���O�͂��̂܂܂ɂ��Ă���

4. ���� DOS �v�����v�g�� FileChannelTest5 ��������ω������Ď��s������

C:\temp>java FileChannelTest5 sample.txt 20 40 exclusive
Acquire Lock.
Lock: sun.nio.ch.FileLockImpl[20:40 exclusive valid]
Read 40 bytes from position: 20

5. �ォ����s���� FileChannelTest5 �̃_�C�A���O���\�������

bN[X_CAO

6. �����Ƃ��I��������B

�@

���̂悤�Ƀ��b�N����ʒu��ω�������΁A�����̃A�v���P�[�V�����Ńt�@�C���ɃA�N�Z�X���邱�Ƃ��ł��܂����B

�܂��A�������������b�N���Ă��V�F�A�[�h���b�N�ɂ���΁A�ǂݍ��݂����͍s�����Ƃ��ł��܂��B�_�C�A���O�̕����Ȃǂ͓����Ȃ̂ŏȗ����܂��B

1. FileChannelTest5 �̎��s

C:\temp>java FileChannelTest5 sample.txt 0 200 shared
Acquire Lock.
Lock: sun.nio.ch.FileLockImpl[0:200 shared valid]
Read 200 bytes from position: 0

2. ���� DOS �v�����v�g�� FileChannelTest1 �����s

C:\temp>java FileChannelTest1 sample.txt


File Opened as Read Write mode.

Size: 216
Position: 0
Read 10 bytes
                                        PLC
 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
Position: 10

Position changes from 10 to 5

Read 10 bytes
                                        PLC
 [35, 36, 37, 38, 39, 30, 31, 32, 33, 34]
Position: 15

Write 4 bytes
java.io.IOException: �v���Z�X�̓t�@�C���ɃA�N�Z�X�ł��܂���B�ʂ̃v���Z�X���t�@
�C���̈ꕔ�����b�N���Ă��܂��B
        at sun.nio.ch.FileDispatcher.write0(Native Method)
        at sun.nio.ch.FileDispatcher.write(FileDispatcher.java:48)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:108)
        at sun.nio.ch.IOUtil.write(IOUtil.java:90)
        at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:151)
        at FileChannelTest1.positionCheck1(FileChannelTest1.java:45)
        at FileChannelTest1.<init>(FileChannelTest1.java:8)
        at FileChannelTest1.main(FileChannelTest1.java:86)


File Opened as Append mode.

Size: 216
Position: 0

Write 4bytes

Size: 220
Position: 220

C:\temp>

�@

FileChannelTest5 �� sample.txt �̂��ׂĂ̕��������b�N���Ă��AFileChannelTest1 �ł͓ǂݍ��݂����͍s�����Ƃ��ł��܂����B�������A�������݂͗�O���������Ă��܂��B

�@

�@
�@

�Ō��

�@
�@

FileChannel �N���X�ɂ͂����ŏЉ���悤�ɁA���܂łɂ͂Ȃ������֗��ȋ@�\������܂��B���ɕM�҂ɂƂ��Ă��ꂵ���̂̓��b�N������ƃT�|�[�g���ꂽ���Ƃł��B

���܂ł́A���b�N���s�����߂ɂ��낢��ȃg���b�N���g���Ă��܂����A�Ⴆ�΁AA �Ƃ����t�@�C�����I�[�v������Ƃ��ɂ́A�ʂɗp�ӂ��� B �Ƃ����t�@�C���ɃI�[�v�����������Ƃ��������݂܂��B�����āA���̃N���X�� A ���I�[�v�����悤�Ƃ���Ƃ��ɂ� B ��ǂݍ���ŁA���̃N���X�� A ��ǂݍ���ł��Ȃ����ǂ������m���߂Ă���I�[�v������悤�ɂ���A�Ȃ�Ă��Ƃ�����Ă��܂����B���̏ꍇ�A�����ō�����A�v���P�[�V�����ł���΁A�t�@�C�� B ���m���߂邱�Ƃ��ł���̂ł����A��ʂ̃A�v���P�[�V�����ł͂���Ȃ��Ƃ͒m��Ȃ��̂ŁA���ǃ��b�N���������Ȃ��Ƃ�����肪����܂����B

�������A����Ȗ������͉ߋ��̂��̂ƂȂ�܂����B

�������ABeta 2 �ł��܂��o�O�͌��\����悤�ł��B�Ⴆ�΁AWindows 98 �ň����Ȃ��� lock ���\�b�h���g���܂���ł����B��������� lock ���\�b�h�͎g�p�ł���̂ł�����... ���̑��ɂ��ABugParade �Ō�������Ƃ܂��܂��o�O�����肻���ł��B�͂₭�A���肵���o�[�W������ FileChannel ���g����悤�ɂȂ�Ƃ����ł��ˁB

����g�p�����T���v���͂�������_�E�����[�h�ł��܂��B

�Q�l URL

(Oct. 2001)

�@

�@
�@
Go to Previous Page Go to Contents Go to Java Page Go to Next Page
�@