Spiral group

_________________________________________________________________________________

 

< Раздел “Язык Java > < Раздел “Технологии Java > < Основная страница >

 

Cтроки в Java. Взаимная конвертация String, StringBuffer, StringBuilder, char[], byte[]. JDK 1.6.

 

 

Статья опубликована: 15.02.2007

Последнее обновление: 18.03.2007

 

Конвертация строк типа String, StringBuffer, StringBuilder
 
String
 

String -> StringBuffer

String s = new String("The String convertation to StringBuffer");

StringBuffer s_buffer = new StringBuffer(s.subSequence(0, s.length()));

 

String -> StringBuilder

String s = new String("The String convertation to StringBuilder");

StringBuilder s_buffer = new StringBuilder(s.subSequence(0, s.length()));

 

String -> char[]

String s = new String("The String convertation to char array");

char[] ch = s.toCharArray();

 

String -> byte[]

String s = new String("The String convertation to byte array");

byte[] b =  s.getBytes();

или

byte[] b = s.getBytes("Cp1251");

или

byte[] b = s.getBytes(Charset.forName("Cp1251"));

(дополнительно требуется импорт пакета java.nio.charset.Charset )

 

StringBuffer
 

StringBuffer -> String

StringBuffer sb = new StringBuffer("A StringBuffer convertation to String type");

sb.toString();

 

StringBuffer -> StringBuilder

StringBuffer s_buffer = new StringBuilder("A StringBuffer convertation to StringBuilder type");

StringBuilder s_builder = new StringBuilder(s_buffer.subSequence(0, s_buffer.length()));

 

StringBuffer -> char[]

StringBuilder s_buffer = new StringBuilder("A StringBuffer convertation to character array");

char[] ch = s_builder.toString().toCharArray();

 

StringBuffer -> byte[]

StringBuffer s_buffer = new StringBuffer ("A convertation to the byte array");

byte[] b = s_buffer.toString().getBytes();

или

byte[] b = s_buffer.toString().getBytes("Cp1251");

или

byte[] b = s_buffer.toString().getBytes(Charset.forName("Cp1251"));

(дополнительно требуется импорт пакета java.nio.charset.Charset; )

 

StringBuilder

 

StringBuilder -> String

StringBuilder sb = new StringBuilder("The convertation to String type");

sb.toString();

 

StringBuilder -> StringBuffer

StringBuilder s_builder = new StringBuilder("The convertation to StringBuffer type");

StringBuffer s_buffer = new StringBuffer(s_builder.subSequence(0, s_builder.length()));

 

StringBuilder -> char[]

StringBuilder s_builder = new StringBuilder("The convertation to character array");

char[] ch = s_builder.toString().toCharArray();

 

StringBuilder -> byte[]

StringBuilder s_builder = new StringBuilder("The convertation to character array");

byte[] b = s_builder.toString().getBytes();

или

byte[] b = s_builder.toString().getBytes("Cp1251");

или

byte[] b = s_builder.toString().getBytes(Charset.forName("Cp1251"));

(дополнительно требуется импорт пакета java.nio.charset.Charset )

 

 

Следующая программа демонстрирует конвертацию строк различных типов (String, StringBuffer, StringBuilder) друг в друга.

 

Файл StringsConvertation.java

/**

 * @author <a href="mailto:zagrebin_v@mail.ru"> Victor Zagrebin </a>

 */

class StringsConvertation

{

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

 {

  String s = new String("First");

  StringBuffer s_buffer = new StringBuffer("Second");

  StringBuilder s_builder = new StringBuilder("Third");

  StringsConvertation sc = new StringsConvertation();

 

  System.out.println("----------- Converts String to StringBuffer ------------");

  System.out.println("source string: "+s);

  System.out.println("source type: "+s.getClass().getName());

  System.out.println("converted string: "+sc.convertToStringBuffer(s));

  System.out.println("result type: "+sc.convertToStringBuffer(s).getClass().getName());

  System.out.println();

 

  System.out.println("----------- Converts StringBuilder to StringBuffer ------------");

  System.out.println("source string: "+s_builder);

  System.out.println("source type: "+s_builder.getClass().getName());

  System.out.println("converted string: "+sc.convertToStringBuffer(s_builder));

  System.out.println("result type: "+sc.convertToStringBuffer(s_builder).getClass().getName());

  System.out.println();

 

  System.out.println("----------- Converts String to StringBuilder ------------");

  System.out.println("source string: "+s);

  System.out.println("source type: "+s.getClass().getName());

  System.out.println("converted string: "+sc.convertToStringBuilder(s));

  System.out.println("result type: "+sc.convertToStringBuilder(s).getClass().getName());

  System.out.println();

 

  System.out.println("----------- Converts StringBuffer to StringBuilder ------------");

  System.out.println("source string: "+s_buffer);

  System.out.println("source type: "+s_buffer.getClass().getName());

  System.out.println("converted string: "+sc.convertToStringBuilder(s_buffer));

  System.out.println("result type: "+sc.convertToStringBuilder(s_buffer).getClass().getName());

  System.out.println();

 

  System.out.println("----------- Converts StringBuffer to String ------------");

  System.out.println("source string: "+s_buffer);

  System.out.println("source type: "+s_buffer.getClass().getName());

  System.out.println("converted string: "+sc.convertToString(s_buffer));

  System.out.println("result type: "+sc.convertToString(s_buffer).getClass().getName());

  System.out.println();

 

  System.out.println("----------- Converts StringBuilder to String ------------");

  System.out.println("source string: "+s_builder);

  System.out.println("source type: "+s_builder.getClass().getName());

  System.out.println("converted string: "+sc.convertToString(s_builder));

  System.out.println("result type: "+sc.convertToString(s_builder).getClass().getName());

  System.out.println();

 }

 

 

 /**

  * Конвертирует строку типов String, StringBuilder, StringBuffer

  * в строку типа StringBuffer.

  */

 public StringBuffer convertToStringBuffer(CharSequence s)

 {

  return new StringBuffer(s.subSequence(0,s.length()));

 }

 

 /**

  * Конвертирует строку типов String, StringBuilder, StringBuffer

  * в строку типа StringBuilder.

  */

 public StringBuilder convertToStringBuilder(CharSequence s)

 {

  return new StringBuilder(s.subSequence(0,s.length()));

 }

 

 /**

  * Конвертирует строку типов String, StringBuilder, StringBuffer

  * в строку типа String.

  */

 public String convertToString(CharSequence s)

 {

  return s.subSequence(0,s.length()).toString();

 }

}

 

Результат вывода программы:

 

----------- Converts String to StringBuffer ------------
source string: First
source type: java.lang.String
converted string: First
result type: java.lang.StringBuffer
 
----------- Converts StringBuilder to StringBuffer ------------
source string: Third
source type: java.lang.StringBuilder
converted string: Third
result type: java.lang.StringBuffer
 
----------- Converts String to StringBuilder ------------
source string: First
source type: java.lang.String
converted string: First
result type: java.lang.StringBuilder
 
----------- Converts StringBuffer to StringBuilder ------------
source string: Second
source type: java.lang.StringBuffer
converted string: Second
result type: java.lang.StringBuilder
 
----------- Converts StringBuffer to String ------------
source string: Second
source type: java.lang.StringBuffer
converted string: Second
result type: java.lang.String
 
----------- Converts StringBuilder to String ------------
source string: Third
source type: java.lang.StringBuilder
converted string: Third
result type: java.lang.String

 

Следует учесть, что класс StringBuilder введен в JDK 1.5, а интерфейс CharSequence введен в JDK 1.4. Все три типа строк String, StringBuffer, StringBuilder реализуют интерфейс CharSequence, что дает возможность использовать свойства полиморфизма. Исходный код сокращен за счет сведения до минимума количества конвертационных методов.

 

 

Конвертация массива символов char[]
 
char[] -> String
char[] ch = {‘A’, ‘B’, ‘C’, ‘D’};

String s = new String(ch);

 

char[] -> StringBuffer
char[] ch = {‘A’, ‘B’, ‘C’, ‘D’};
StringBuffer str = new StringBuffer().append(ch));   
 
char[] -> StringBuilder
char[] ch = {‘A’, ‘B’, ‘C’, ‘D’};
StringBuilder str = new StringBuilder().append(ch));
   
char[] -> byte[]
char[] ch_array = {'і','о', 'н','в', 'е','р', 'т', 'а', 'ц','и', 'я'};
CharBuffer charbuf = CharBuffer.wrap(ch_array);
ByteBuffer bytebuf = Charset.forName("Cp866").encode(charbuf);
byte[] byte_array = bytebuf.array();
 
Особо следует рассмотреть метод конвертации char[] -> byte[]. Наиболее корректный и удобный метод конвертации, при котором не нужно вручную делать битовые сдвиги и маски, предоставляет пакет java.nio. С помощью метода encode() класса Charset, а также вспомогательнvх классов ByteBuffer и CharBuffer можно проводить ковертации байтовых и символьных массивов в обе стороны. Следует учесть, что перечисленные классы являются абстрактными и, соответственно, получить экземпляры с помощью конструктора вы не сможете. Для этих целей нужно пользоваться специальными методами этих классов.

Например, конкретный экземпляр Charset можно получить с помощью статического метода forName(), внутри которого необходимо указать аргумент – наименование кодировки. Класс Charset удобен тем, что его методы являются потокозащищенными и один экземпляр может разделяться по доступу множеством потоков.

 
Файл CharArrayToByteArray
import java.util.Formatter;
import java.nio.charset.Charset;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class CharArrayToByteArray {
    public static void main(String[] args) throws Exception {
        char[] ch_array = {'К','о', 'н','в', 'е','р', 'т', 'а', 'ц','и', 'я'};
        CharBuffer charbuf = CharBuffer.wrap(ch_array);
        ByteBuffer bytebuf = Charset.forName("Cp866").encode(charbuf);
        byte[] byte_array = bytebuf.array();
 
        for (int i=0; i < byte_array.length; i++)
        {
         Formatter fmt = new Formatter();
         fmt.format("%X",byte_array[i]);
         System.out.print(fmt+" ");
        }
        System.out.println();
    }
}
 

Команда компиляции:

javac CharArrayToByteArray.java

 

Команда запуска:

java CharArrayToByteArray
 

Результаты выполнения:

8A AE AD A2 A5 E0 E2 A0 E6 A8 EF
 
Существует и более быстрый способ конвертации char[] -> byte[], который основан на побитовом сдвиге и использовании битовых масок. При этом не используется создание экземпляров каких-либо классов, а работа производится только на примитивных типах. Поэтому этот подход имеет минимальное время выполнения. Единственным и огромным его недостатком является отсутствие универсальности, так как для специфической кодировки потребуется корректировка алгоритма и кода. В первых версиях JDK Sun использовала подобный подход. В классе String еще можно найти deprecated метод public void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin), с помощью которого нельзя корректно перевести символы в массив байтов.
Ниже приводится программа, которая конвертирует массив символов в массив байтов, представляющий Unicode последовательность. Ситуация с конвертацией массива char  в эквивалент массива byte достаточно интересна, поскольку тип char является шестнадцатиразрядным и может вмещать в себя любой символ шестнадцатиразрядной кодировки Unicode, а тип byte восьмиразрядной, то вполне очевидно, что на один символ получится два байта, которые можно располагать в разном порядке следования. 
 
char[] -> byte[] порядок байтов Unicode Big Endian
char[] ch = {'A','B','C','\u0410', '\u0411', '\u0412'};
int length = ch.length;
byte[] big_endian = new byte[2*length];
for(int i = 0; i < length; i++)
{
 big_endian[2*i+1]  =  (byte) (ch[i] & 0xff);
 big_endian[2*i] = (byte) (ch[i] >>> 8 & 0xff);
}
 
char[] -> byte[] порядок байтов Unicode Little Endian
char[] ch = {'A','B','C','\u0410', '\u0411', '\u0412'};
int length = ch.length;
byte[] little_endian = new byte[2*length];
for(int i = 0; i < length; i++)
{
 little_endian[2*i]  =  (byte) (ch[i] & 0xff);
 little_endian[2*i+1] = (byte) (ch[i] >>> 8 & 0xff);
}
 
Следующая программа демонстрирует конвертацию массива char[] в массив byte[] с различным порядком следования байтов. Для получения старшего и младшего байтов используется маскирование и правый сдвиг на восемь битов.
 

Файл CharArrayToByteArray2.java

/**
 * @author <a href="mailto:zagrebin_v@mail.ru"> Victor Zagrebin </a>
 */
import java.util.*;
 
class CharArrayToByteArray2
{
    char[] ch_array = {'A','B','C','\u0410', '\u0411', '\u0412'};
 
    public static void main(String[] args)
    {
     Formatter fmt = new Formatter();
     CharArrayToByteArray2 cts = new CharArrayToByteArray2();
     int length = cts.ch_array.length;
     byte[] big_endian = new byte[2*length] ;
     byte[] little_endian = new byte[2*length] ;
 
     outCharacterArray(cts.ch_array);
 
     //Little Endiand order
     for(int i = 0; i < length; i++)
     {
      little_endian[2*i]  =  (byte) (cts.ch_array[i] & 0xff);
      little_endian[2*i+1] = (byte) (cts.ch_array[i] >>> 8 & 0xff);
     }
 
     //Big endian order
     for(int i = 0; i < length; i++)
     {
      big_endian[2*i+1]  =  (byte) (cts.ch_array[i] & 0xff);
      big_endian[2*i] = (byte) (cts.ch_array[i] >>> 8 & 0xff);
     }
 
     System.out.println("------ BIG ENDIAN ORDER -------");
     outConvertedArray(big_endian);
     System.out.println("------ LITTLE ENDIAN ORDER -------");
     outConvertedArray(little_endian);
   }
 
   static void outConvertedArray(byte[] b)
   {
     for(int i=0; i<b.length; i=i+2)
     {
      Formatter fmt = new Formatter();
      fmt.format("%x",b[i]);
      System.out.print(fmt);
      fmt = new Formatter();
      fmt.format("%x",b[i+1]);
      System.out.println(fmt);
     }
   }
 
   static void outCharacterArray(char[] ch)
   {
     for(int i=0; i<ch.length; i++)
     {
      System.out.print(ch[i]+"\t");
      int code = (int)ch[i];
      Formatter fmt = new Formatter();
      fmt.format("%x",code);
      System.out.println(fmt);
     }
   }
}
 

Команда компиляции:

javac CharArrayToByteArray2.java -encoding Cp1251

 

Команда запуска:

java -Dfile.encoding=Cp866 CharArrayToByteArray2

 

Результаты выполнения:

A       41

B       42

C       43

А       410

Б       411

В       412

------ BIG ENDIAN ORDER -------

041

042

043

410

411

412

------ LITTLE ENDIAN ORDER -------

410

420

430

104

114

124

 
В результате выполнения программы массив big_endian будет содержать эквивалент символьного массива, в котором байты расположены в порядке Unicode big endian, а в массиве little_endian байты будут расположены в порядке Unicode little endian.
 
 
Конвертация массива байтов byte[]
 
byte[] -> String
byte[] b = {(byte) 0x8a, (byte) 0xae, (byte) 0xad, (byte) 0xa2, (byte) 0xa5,
        (byte) 0xe0, (byte) 0xe2, (byte) 0xa0, (byte) 0xe6, (byte) 0xa8,
        (byte) 0xef };
String s = new String(b,"Cp1251");
 
byte[] -> StringBuffer
byte[] b = {(byte) 0x8a, (byte) 0xae, (byte) 0xad, (byte) 0xa2, (byte) 0xa5,
        (byte) 0xe0, (byte) 0xe2, (byte) 0xa0, (byte) 0xe6, (byte) 0xa8,
        (byte) 0xef };
StringBuffer sb = new StringBuffer(new String(b,"Cp1251"));
 
byte[] -> StringBuilder
byte[] b = {(byte) 0x8a, (byte) 0xae, (byte) 0xad, (byte) 0xa2, (byte) 0xa5,
        (byte) 0xe0, (byte) 0xe2, (byte) 0xa0, (byte) 0xe6, (byte) 0xa8,
        (byte) 0xef };
StringBuilder sb = new StringBuilder(new String(b,"Cp1251"));
 
byte[] -> char[] (Дополнительно требуется импорт библиотек java.nio.charset.Charset, java.nio.ByteBuffer,
java.nio.CharBuffer)
byte[] b = new byte[] {(byte)0x8A, (byte)0xAE, (byte)0xAD, (byte)0xA2,
                   (byte)0xA5, (byte)0xE0, (byte)0xE2, (byte)0xA0,
                   (byte)0xE6, (byte)0xA8, (byte)0xEF };
ByteBuffer buf= ByteBuffer.wrap(b);
CharBuffer charbuf = Charset.forName("Cp866").decode(buf);
char[] ch_array = charbuf.array();

 

Следующая программа демонстрирует конвертацию массива байтов в строку с заданной кодировкой.

 

Файл ByteArrayToString.java

/**

 * @author <a href="mailto:zagrebin_v@mail.ru"> Victor Zagrebin </a>

 */

class ByteArrayToString

{

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

 {

  byte[] b = {(byte) 0x8a, (byte) 0xae, (byte) 0xad, (byte) 0xa2, (byte) 0xa5,

              (byte) 0xe0, (byte) 0xe2, (byte) 0xa0, (byte) 0xe6, (byte) 0xa8,

              (byte) 0xef };

  String s = new String("First");

 

 

  System.out.println("----------- Converts byte array to String ------------");

  //System.out.println("source byte array: "+s_builder);

  s = new String(b,"Cp1251");

  System.out.println("converted string: "+s);

  System.out.println("converted string type: "+s.getClass().getName());

  System.out.println();

 }

}

 

Результаты вывода программы:
 
----------- Converts byte array to String ------------
converted string: Конвертация
converted string type: java.lang.String
 
 
 
Следующая программа демонстрирует конвертацию массива byte[] в массив char[] с помощью классов пакета java.nio.

 

Файл ByteArrayToCharArray.java

import java.nio.charset.Charset;

import java.nio.ByteBuffer;

import java.nio.CharBuffer;

public class ByteArrayToCharArray {

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

        byte[] b = new byte[] {(byte)0x8A, (byte)0xAE, (byte)0xAD, (byte)0xA2,

                               (byte)0xA5, (byte)0xE0, (byte)0xE2, (byte)0xA0,

                               (byte)0xE6, (byte)0xA8, (byte)0xEF };

        ByteBuffer buf= ByteBuffer.wrap(b);

        CharBuffer charbuf = Charset.forName("Cp866").decode(buf);

        char[] ch_array = charbuf.array();

        for (char ch:ch_array) System.out.print(ch);

        System.out.println();

    }

}

 

Команда компиляции:

javac ByteArrayToCharArray.java -encoding Cp1251

 

Команда запуска:

java -Dfile.encoding=Cp866 ByteArrayToCharArray
 

Результат выполнения:

Конвертация

 

 

 

Ссылки:

 

1. Ron Hitchens. JavaTM NIO. First Edition. O’Reilly, 2002.—312p.

2. Packages: java.langString, java.lang.StringBuffer, java.lang.StringBuilder, java.nio.Charset, java.nio.CharBuffer, java.nio.ByteBuffer.

JavaTM 2 Platform Standard Edition 6.0 API Specification.

http://java.sun.com

3. Casting or Conversion char to byte[]. Sun developer networks. Developer forums.

http://forum.java.sun.com/thread.jspa?threadID=642787&messageID=3788467

 

 

 

 

 

 

 

Автор:

 

 

Загребин Виктор александрович

 

 

< Раздел “Язык Java > < Раздел “Технологии Java > < Основная страница >

 

 

 

 

Hosted by uCoz