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.
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” > < Основная страница >