Progress-servis55.ru

Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Bytebuffer wrap java

Методы ByteBuffer wrap () в Java с примерами

wrap (массив byte [])

Метод wrap () класса java.nio.ByteBuffer используется для переноса байтового массива в буфер. Новый буфер будет поддерживаться данным байтовым массивом, т. Е. Изменения в буфере приведут к изменению массива и наоборот. Емкость и предел нового буфера будут равны array.length, его позиция будет нулевой, его метка будет неопределенной, а порядок байтов будет BIG_ENDIAN . Его резервный массив будет заданным массивом, а его смещение массива будет равно нулю.

Синтаксис:

Параметры: Этот метод принимает массив, который является массивом, который будет поддерживать этот буфер в качестве параметра.

Возвращаемое значение: этот метод возвращает новый байтовый буфер.

Ниже приведены примеры, иллюстрирующие метод wrap () :

Примеры 1:

// Java-программа для демонстрации
// метод wrap ()

public class GFG <

public static void main(String[] args)

// Объявляем и инициализируем байтовый массив

// выводим длину байтового массива

System.out.println( «Array length: «

// печатаем элемент байтового массива

System.out.println( «nArray element: «

// оборачиваем байтовый массив в floatBuffer

// используя метод wrap ()

ByteBuffer byteBuffer = ByteBuffer.wrap(bb);

// Перемотка байтового буфера

// выводим байтовый буфер

// печатаем емкость byteBuffer

System.out.println( «nbytebuffer capacity: «

// печатаем позицию byteBuffer

System.out.println( «nbytebuffer position: «

wrap (массив byte [], int offset, int length)

Новый буфер будет поддержан данным байтовым массивом; то есть изменения в буфере приведут к изменению массива и наоборот. Емкость нового буфера будет равна array.length, его позиция будет смещена, его предел будет смещен + длина, его метка будет неопределенной, а порядок байтов будет BIG_ENDIAN. Его резервный массив будет заданным массивом, а его смещение массива будет равно нулю.

Синтаксис:

Параметры: Этот метод принимает следующие параметры:

  • массив: массив, который будет поддерживать новый буфер.
  • смещение: смещение подмассива, который будет использоваться; должен быть неотрицательным и не больше, чем array.length. Положение нового буфера будет установлено на это значение.
  • длина: длина используемого подмассива; должен быть неотрицательным и не больше, чем array.length — offset. Предел нового буфера будет установлен на смещение + длина.

Возвращаемое значение: этот метод возвращает новый байтовый буфер.

Исключения: этот метод генерирует исключение IndexOutOfBoundsException (если не выполнены предварительные условия для параметров смещения и длины).

Ниже приведены примеры, иллюстрирующие метод wrap ():

Примеры 1:

// Java-программа для демонстрации
// метод wrap ()

public class GFG <

public static void main(String[] args)

// Объявляем и инициализируем байтовый массив

// выводим длину байтового массива

System.out.println( «Array length: «

// печатаем элемент байтового массива

System.out.println( «nArray element: «

// оборачиваем байтовый массив в floatBuffer

// используя метод wrap ()

// Перемотка байтового буфера

// выводим байтовый буфер

// печатаем емкость byteBuffer

System.out.println( «nbytebuffer capacity: «

// печатаем позицию byteBuffer

System.out.println( «nbytebuffer position: «

catch (IndexOutOfBoundsException e) <

System.out.println( «npreconditions on the»

+ » offset and length parameters»

System.out.println( «Exception throws: » + e);

Примеры 2: для демонстрации IndexOutOfBoundsException

// Java-программа для демонстрации
// метод wrap ()

public class GFG <

public static void main(String[] args)

// Объявляем и инициализируем байтовый массив

// выводим длину байтового массива

System.out.println( «Array length: «

// печатаем элемент байтового массива

System.out.println( «nArray element: «

// оборачиваем байтовый массив в floatBuffer

hoijui / ByteBufferOutputStream.java

/*
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to
*/
import java.io.OutputStream ;
import java.nio.BufferOverflowException ;
import java.nio.ByteBuffer ;
/**
* Wraps a < @link ByteBuffer>so it can be used like an < @link OutputStream>. This is similar to a
* < @link java.io.ByteArrayOutputStream>, just that this uses a < @code ByteBuffer >instead of a
* < @code byte[] >as internal storage.
*/
public class ByteBufferOutputStream extends OutputStream <
private ByteBuffer wrappedBuffer;
private final boolean autoEnlarge;
public ByteBufferOutputStream ( final ByteBuffer wrappedBuffer , final boolean autoEnlarge ) <
this . wrappedBuffer = wrappedBuffer;
this . autoEnlarge = autoEnlarge;
>
public ByteBuffer toByteBuffer () <
final ByteBuffer byteBuffer = wrappedBuffer . duplicate();
byteBuffer . flip();
return byteBuffer . asReadOnlyBuffer();
>
/**
* Resets the code >count field of this byte array output stream to zero, so that all
* currently accumulated output in the output stream is discarded. The output stream can be used
* again, reusing the already allocated buffer space.
*
* @see java.io.ByteArrayInputStream#count
*/
public void reset () <
wrappedBuffer . rewind();
>
/**
* Increases the capacity to ensure that it can hold at least the number of elements specified
* by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void growTo ( final int minCapacity ) <
// overflow-conscious code
final int oldCapacity = wrappedBuffer . capacity();
int newCapacity = oldCapacity 1 ;
if (newCapacity — minCapacity 0 ) <
newCapacity = minCapacity;
>
if (newCapacity 0 ) <
if (minCapacity 0 ) < // overflow
throw new OutOfMemoryError ();
>
newCapacity = Integer . MAX_VALUE ;
>
final ByteBuffer oldWrappedBuffer = wrappedBuffer;
// create the new buffer
if (wrappedBuffer . isDirect()) <
wrappedBuffer = ByteBuffer . allocateDirect(newCapacity);
> else <
wrappedBuffer = ByteBuffer . allocate(newCapacity);
>
// copy over the old content into the new buffer
oldWrappedBuffer . flip();
wrappedBuffer . put(oldWrappedBuffer);
>
@Override
public void write ( final int bty ) <
try <
wrappedBuffer . put(( byte ) bty);
> catch ( final BufferOverflowException ex) <
if (autoEnlarge) <
final int newBufferSize = wrappedBuffer . capacity() * 2 ;
growTo(newBufferSize);
write(bty);
> else <
throw ex;
>
>
>
@Override
public void write ( final byte [] bytes ) <
int oldPosition = 0 ;
try <
oldPosition = wrappedBuffer . position();
wrappedBuffer . put(bytes);
> catch ( final BufferOverflowException ex) <
if (autoEnlarge) <
final int newBufferSize
= Math . max(wrappedBuffer . capacity() * 2 , oldPosition + bytes . length);
growTo(newBufferSize);
write(bytes);
> else <
throw ex;
>
>
>
@Override
public void write ( final byte [] bytes , final int off , final int len ) <
int oldPosition = 0 ;
try <
oldPosition = wrappedBuffer . position();
wrappedBuffer . put(bytes, off, len);
> catch ( final BufferOverflowException ex) <
if (autoEnlarge) <
final int newBufferSize
= Math . max(wrappedBuffer . capacity() * 2 , oldPosition + len);
growTo(newBufferSize);
write(bytes, off, len);
> else <
throw ex;
>
>
>
>
  • © 2020 GitHub, Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help
Читать еще:  Как из удаленных писем восстановить во входящие

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Java: преобразование строки в ByteBuffer и из него и связанные с этим проблемы

Я использую Java NIO для моих сокетных соединений, и мой протокол основан на тексте, поэтому мне нужно иметь возможность конвертировать строки в ByteBuffers перед записью их в SocketChannel и конвертировать входящие ByteBuffers обратно в строки. В настоящее время я использую этот код:

это работает большую часть времени, но я сомневаюсь, если это рекомендуемый (и самый простой) способ сделать каждое направление этого преобразования, или если есть другой способ попробовать. Иногда, и, казалось бы, на случайные, звонки на encode() и decode() бросит a java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END исключение или подобное, даже если я использую новый объект ByteBuffer каждый раз, когда выполняется преобразование. Нужно ли синхронизировать эти методы? Какой-нибудь лучший способ для преобразования между строками и объектов ByteBuffer? Спасибо!

4 ответа:

Проверьте CharsetEncoder и CharsetDecoder описания API — вы должны следовать определенная последовательность вызовов метода чтобы избежать этой проблемы. Например, для CharsetEncoder :

  1. переустановите шифратор через reset метод, если он не был использован ранее;
  2. вызов encode метод ноль или более раз, пока дополнительный вход может быть доступен, передавая false для аргумента endOfInput и заполнение входного буфера и промывка выходного буфера между вызовами;
  3. вызов encode метод в последний раз, проходя true для аргумента endOfInput; а затем
  4. вызов flush метод так, что шифратор сможет потопить любое внутреннее положение к буферу выхода.
Читать еще:  Как восстановить раскладку клавиатуры на виндовс 7

кстати, это тот же подход, который я использую для NIO, хотя некоторые из моих коллег преобразуют каждый символ непосредственно в байт в знаниях, которые они только используя ASCII, который я могу себе представить, вероятно, быстрее.

Если все не изменилось, вам лучше с

обычно буфер.hasArray() будет либо всегда true, либо всегда false, в зависимости от вашего варианта использования. На практике, если вы действительно не хотите, чтобы он работал при любых обстоятельствах, безопасно оптимизировать ветку, которая вам не нужна.

ответ Адамского является хорошим и описывает шаги в операции кодирования при использовании общего метода кодирования (который принимает байтовый буфер в качестве одного из входов)

однако рассматриваемый метод (в данном обсуждении) является вариантом кодирования — encode (CharBuffer in). Это же удобный метод, который реализует всю операцию кодирования. (См. Ссылка на Java Docs в С. П.)

согласно документации, этот метод поэтому не следует вызывать, если операция кодирования уже выполняется (что и происходит в коде ZenBlender-использование статического кодера/декодера в многопоточной среде).

лично мне нравится использовать удобство методы (более общие методы кодирования / декодирования), поскольку они снимают нагрузку, выполняя все шаги под обложками.

ZenBlender и Adamski уже предложили несколько вариантов способов смело делайте это в своих комментариях. Перечисляя их все здесь:

  • создать новый объект кодера / декодера, когда это необходимо для каждой операции (не эффективно, поскольку это может привести к большому количеству объектов). Или,
  • использовать ThreadLocal, чтобы избежать создания нового кодера/декодера для каждой операции. Или,
  • синхронизировать всю операцию кодирования / декодирования (это может быть не предпочтительнее, если пожертвование некоторым параллелизмом не подходит для вашей программы)

Java NIO – Using ByteBuffer

1. Introduction

Java provides a class ByteBuffer which is an abstraction of a buffer storing bytes. While just a little bit more involved than using plain byte[] arrays, it is touted as more performant. in this article, let us examine some uses of ByteBuffer and friends.

A ByteBuffer operates on a FileChannel which is a byte channel which has a current position. The FileChannel provides methods for reading from and writing to ByteBuffers.

2. Creating a ByteBuffer

To begin with, we need a ByteBuffer to read and write data into. Create a ByteBuffer as follows:

Читать еще:  Конвертер c в java

You could also initialize a ByteBuffer from an array of bytes. The ByteBuffer will be backed by the array and provide facilities such as current position, etc.

3. Reading and Writing into a ByteBuffer

Once the ByteBuffer is allocated, you can read bytes from a file as follows.

To write out the data from the ByteBuffer into a file, do the following:

4. Copying Files Using a ByteBuffer

With the plumbing out of the way, here is the loop to copy data from one file to another.

Reading from the InputStream channel returns -1 on hitting EOF (end-of-file). At that point flip the buffer. This sets the position of the pointer within the buffer to 0 and the limit to the last byte read. Following which, bytes can be transferred from the pointer position to the OutputStream channel till the limit. At which point, the buffer can be cleared to reset the position and the limit.

5. Other Ways of Writing to ByteByffer

Of course, reading bytes from a file channel is not the only way to write into a ByteBuffer. We have the following methods for writing data of various types into the ByteBuffer. These methods write the binary representation of the data into the ByteBuffer.

A special note: these methods write the byte values of the appropriate types into the ByteBuffer. For instance, putChar() puts the two bytes of a char into the ByteBuffer without encoding it with a character set. These methods can be used when a strict binary representation of the data needs to be stored and/or transported (for example across a socket).

6. Convert Integer to Byte Array

ByteBuffer is useful for binary conversion of data to and from Java primitive data. For instance suppose you want to convert an integer to an array of bytes. The following shows an integer and the hex value of the bytes.

To convert the integer to a byte array, you can use the ByteBuffer as folows. Allocate a ByteBuffer, write the integer value into it using putInt() and get the byte array. As simple as that.

In a similar way, you can convert the other primitive types to a byte array and back.

Similarly, storing and restoring a BigInteger is a bit involved because the ByteBuffer does not provide methods to directly read or write a BigInteger from a ByteBuffer. In the next section, we show how to do that.

7. BigInteger to Byte Array

The BigInteger is an arbitrary precision integer provided in Java. Most math operations including addition, subtraction, etc are provided by the BigInteger class. One way of storing and transmitting a BigInteger is to convert it to a byte array and use a ByteBuffer. Let’s see how to do that.

Convert a BigInteger to a byte array, show the byte representation and store it in a file.

Now let us read the file, load the bytes into a ByteBuffer and convert to a BigInteger:

Summary

A ByteBuffer is a buffer which provides for transferring bytes from a source to a destination. In addition to storage like a buffer array, it also provides abstractions such as current position, limit, capacity, etc. A FileChannel is used for transferring data to and from a file to a ByteBuffer. ByteBuffer also provides methods to directly store and restore the bytes of primitive types such as integer, short, long, etc.

Ссылка на основную публикацию
Adblock
detector