Java Language
Преобразование в строки и из них
Поиск…
Преобразование других типов данных в String
Вы можете получить значение других примитивных типов данных как String, используя метод
valueOf
класса String.Например:
int i = 42; String string = String.valueOf(i); //string now equals "42”.
Этот метод также перегружен для других типов данных, таких как
float
,double
,boolean
и evenObject
.Вы также можете получить любой другой объект (любой экземпляр любого класса) в виде строки, вызвав на него
.toString
. Для этого, чтобы дать полезный вывод, класс должен переопределитьtoString()
. Большинство стандартных классов библиотеки Java, напримерDate
и другие.Например:
Foo foo = new Foo(); //Any class. String stringifiedFoo = foo.toString().
Здесь
stringifiedFoo
содержит представлениеfoo
как String.
Вы также можете преобразовать любой тип номера в String с короткими обозначениями, как показано ниже.
int i = 10;
String str = i + "";
Или просто простой способ
String str = 10 + "";
Преобразование в / из байтов
Чтобы закодировать строку в массив байтов, вы можете просто использовать метод String#getBytes()
, причем один из стандартных наборов символов доступен в любой среде исполнения Java:
byte[] bytes = "test".getBytes(StandardCharsets.UTF_8);
и для декодирования:
String testString = new String(bytes, StandardCharsets.UTF_8);
вы можете еще больше упростить вызов, используя статический импорт:
import static java.nio.charset.StandardCharsets.UTF_8;
...
byte[] bytes = "test".getBytes(UTF_8);
Для менее распространенных наборов символов вы можете указать набор символов со строкой:
byte[] bytes = "test".getBytes("UTF-8");
и наоборот:
String testString = new String (bytes, "UTF-8");
это означает, однако, что вы должны обрабатывать проверенное UnsupportedCharsetException
.
Следующий вызов будет использовать набор символов по умолчанию. Набор символов по умолчанию является специфичным для платформы и обычно отличается между платформами Windows, Mac и Linux.
byte[] bytes = "test".getBytes();
и наоборот:
String testString = new String(bytes);
Обратите внимание, что недопустимые символы и байты могут быть заменены или пропущены этими методами. Для большего контроля - например, для проверки ввода - вам рекомендуется использовать CharsetEncoder
и CharsetDecoder
.
Кодирование / декодирование Base64
Иногда вы обнаружите необходимость кодирования двоичных данных в виде строки с кодом base64 .
Для этого мы можем использовать класс DatatypeConverter
из пакета javax.xml.bind
:
import javax.xml.bind.DatatypeConverter;
import java.util.Arrays;
// arbitrary binary data specified as a byte array
byte[] binaryData = "some arbitrary data".getBytes("UTF-8");
// convert the binary data to the base64-encoded string
String encodedData = DatatypeConverter.printBase64Binary(binaryData);
// encodedData is now "c29tZSBhcmJpdHJhcnkgZGF0YQ=="
// convert the base64-encoded string back to a byte array
byte[] decodedData = DatatypeConverter.parseBase64Binary(encodedData);
// assert that the original data and the decoded data are equal
assert Arrays.equals(binaryData, decodedData);
Apache commons-codec
В качестве альтернативы, мы можем использовать Base64
из общедоступного кодека Apache .
import org.apache.commons.codec.binary.Base64;
// your blob of binary as a byte array
byte[] blob = "someBinaryData".getBytes();
// use the Base64 class to encode
String binaryAsAString = Base64.encodeBase64String(blob);
// use the Base64 class to decode
byte[] blob2 = Base64.decodeBase64(binaryAsAString);
// assert that the two blobs are equal
System.out.println("Equal : " + Boolean.toString(Arrays.equals(blob, blob2)));
Если вы проверите эту программу, то увидите, что someBinaryData
кодирует c29tZUJpbmFyeURhdGE=
, очень c29tZUJpbmFyeURhdGE=
объект String -UTF-8 .
Детали для этого же можно найти на Base64
// encode with padding
String encoded = Base64.getEncoder().encodeToString(someByteArray);
// encode without padding
String encoded = Base64.getEncoder().withoutPadding().encodeToString(someByteArray);
// decode a String
byte [] barr = Base64.getDecoder().decode(encoded);
Разбор строк на числовое значение
Строка к примитивному числовому типу или числовому типу обертки:
Каждый числовой класс-оболочка предоставляет метод parseXxx
который преобразует String
в соответствующий примитивный тип. Следующий код преобразует String
в int
с Integer.parseInt
метода Integer.parseInt
:
String string = "59";
int primitive = Integer.parseInteger(string);
Чтобы преобразовать в String
экземпляр класса числовой оболочки, вы можете либо использовать перегрузку классов- valueOf
:
String string = "59";
Integer wrapper = Integer.valueOf(string);
или полагаться на автоматический бокс (Java 5 и более поздние версии):
String string = "59";
Integer wrapper = Integer.parseInteger(string); // 'int' result is autoboxed
Данная схема работает на byte
, short
, int
, long
, float
и double
и соответствующие классы - оболочек ( Byte
, Short
, Integer
, Long
, Float
и Double
).
String to Integer с использованием radix:
String integerAsString = "0101"; // binary representation
int parseInt = Integer.parseInt(integerAsString,2);
Integer valueOfInteger = Integer.valueOf(integerAsString,2);
System.out.println(valueOfInteger); // prints 5
System.out.println(parseInt); // prints 5
Исключения
Исключенное исключение NumberFormatException будет выведено , если parseXxx(...)
метод parseXxx(...)
valueOf(String)
или parseXxx(...)
для строки, которая не является допустимым числовым представлением или представляет значение, выходящее за пределы допустимого диапазона.
Получение `String` из` InputStream`
String
может быть прочитана из InputStream
с использованием конструктора байтового массива.
import java.io.*;
public String readString(InputStream input) throws IOException {
byte[] bytes = new byte[50]; // supply the length of the string in bytes here
input.read(bytes);
return new String(bytes);
}
Это использует кодировку по умолчанию системы, хотя может быть задана альтернативная кодировка:
return new String(bytes, Charset.forName("UTF-8"));
Преобразование String в другие типы данных.
Вы можете преобразовать числовую строку в различные числовые типы Java следующим образом:
Строка для int:
String number = "12";
int num = Integer.parseInt(number);
Строка для плавания:
String number = "12.0";
float num = Float.parseFloat(number);
Строка в два раза:
String double = "1.47";
double num = Double.parseDouble(double);
Строка: boolean:
String falseString = "False";
boolean falseBool = Boolean.parseBoolean(falseString); // falseBool = false
String trueString = "True";
boolean trueBool = Boolean.parseBoolean(trueString); // trueBool = true
Строка длинная:
String number = "47";
long num = Long.parseLong(number);
Строка для BigInteger:
String bigNumber = "21";
BigInteger reallyBig = new BigInteger(bigNumber);
Строка в BigDecimal:
String bigFraction = "17.21455";
BigDecimal reallyBig = new BigDecimal(bigFraction);
Исключения:
Числовые преобразования выше будут NumberFormatException
(непроверенное) NumberFormatException
если вы попытаетесь проанализировать строку, которая не является соответствующим образом отформатированным номером, или вне диапазона для целевого типа. В разделе « Исключения» обсуждается, как бороться с такими исключениями.
Если вы хотите проверить, что вы можете разбирать строку, вы можете реализовать метод tryParse...
следующим образом:
boolean tryParseInt (String value) {
try {
String somechar = Integer.parseInt(value);
return true;
} catch (NumberFormatException e) {
return false;
}
}
Однако вызов этого метода tryParse...
непосредственно перед разбором (возможно) является плохим. Было бы лучше просто вызвать метод parse...
и обработать исключение.