JavaRush/Java блог/Random/Кофе-брейк #206. Как преобразовать InputStream в строку н...

Кофе-брейк #206. Как преобразовать InputStream в строку на Java. 5 способов интерполяции строк в Java

Статья из группы Random
участников

Как преобразовать InputStream в строку на Java

Источник: DZone Представленное здесь руководство поможет вам узнать о трех различных способах преобразования InputStream в строку на языке Java. Кофе-брейк #206. Как преобразовать InputStream в строку на Java. 5 способов интерполяции строк в Java - 1Java предоставляет широкий спектр классов ввода-вывода, которые помогают в работе с различными источниками данных и назначениями. Одним из наиболее распространенных вариантов использования таких классов является преобразование InputStream в строку. Это может очень пригодиться при работе с потоками данных из сетевого подключения или при чтении из файла.

Что такое InputStream

Прежде чем мы углубимся в преобразование InputStream в строку, давайте на минутку разберемся, что такое InputStream. В языке Java InputStream — это абстрактный класс, представляющий поток байтов. Это также суперкласс для всех классов, представляющих входной поток байтов. InputStream можно использовать для чтения данных из различных источников, таких как файл, сетевое соединение или массив байтов. Некоторые распространенные методы, доступные в InputStream:
  • read() — считывает следующий байт данных из входного потока (input stream).
  • read(byte[] b) — считывает до b.length байты данных из входного потока в массив байтов.
  • skip(long n) — пропускает и отбрасывает n байты данных из входного потока.

Преобразование InputStream в строку

Теперь, когда у нас есть общее представление о InputStream, давайте рассмотрим различные способы преобразования InputStream в строку.

1. Использование BufferedReader

Один из самых простых способов преобразовать InputStream в строку — использовать BufferedReader. Вот пример кода:
public static String convertInputStreamToString(InputStream inputStream) throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        stringBuilder.append(line).append("\n");
    }
    bufferedReader.close();
    return stringBuilder.toString();
}
В этом фрагменте кода мы создаем объект BufferedReader, передавая объект InputStreamReader, который обернут InputStream. Затем мы читаем содержимое BufferedReader построчно, используя метод readLine() и добавляем каждую строку в объект StringBuilder. Наконец, мы закрываем BufferedReader и возвращаем содержимое StringBuilder в виде строки.

2. Использование Scanner

Второй способ преобразовать InputStream в строку — использование объекта Scanner. Вот пример кода:
public static String convertInputStreamToString(InputStream inputStream) {
    Scanner scanner = new Scanner(inputStream).useDelimiter("\\A");
    return scanner.hasNext() ? scanner.next() : "";
}
В этом примере мы создаем объект Scanner, передавая InputStream его конструктору. Затем мы используем метод useDelimiter(), чтобы установить разделитель на \\A — регулярное выражение, соответствующее началу ввода. Он требует от сканера прочитать весь входной поток как один токен. И наконец, мы возвращаем токен в виде строки.

3. Использование ByteArrayOutputStream

Еще один способ преобразовать InputStream в String — использовать ByteArrayOutputStream. Перед вами пример кода:
public static String convertInputStreamToString(InputStream inputStream) throws IOException {
    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        result.write(buffer, 0, length);
    }
    return result.toString("UTF-8");
}
Здесь мы создаем объект ByteArrayOutputStream, в который мы записываем содержимое InputStream. Далее мы читаем InputStream внутри буфера размером 1024 байта, пока не достигнем конца потока. Наконец, мы возвращаем содержимое ByteArrayOutputStream в виде строки, указав кодировку символов UTF-8.

Заключение

Преобразование InputStream в строку является в Java обычной операцией при работе с различными источниками данных и местами назначения. В этой статье мы рассмотрели три разных способа добиться этого: используя BufferedReader, Scanner и ByteArrayOutputStream. Выбор метода зависит от конкретного варианта использования. Разработчики должны выбрать подходящий для себя метод, который лучше всего подходит согласно их требованиям.

Интерполяция строк в Java

Источник: Codippa В этой статье показано 5 различных способов интерполяции строк в Java с примерами кода. Интерполяция строк — это процесс размещения значений в шаблоне строки во время выполнения. Интерполяцию полезно использовать, если вам нужно вставить значения в строку, которая отображается пользователю, или когда вам нужно создать строку из значений, хранящихся в переменных. В Java существует 5 различных способов интерполяции строк:

1. String.format()

String.format() используется в Java для замены предопределенных строк формата значениями. Это помогает, если нужно создать динамическую строку без использования конкатенации строк. Также этот способ обеспечивает гибкость форматирования строк, целых чисел, значений с плавающей запятой с обязательными десятичными разрядами, шестнадцатеричных, восьмеричных значений, валют, позволяет дополнять значения пробелами или некоторыми другими значениями и так далее. Пример кода:
// Подставить одно значение в шаблон строки
String name = "John";
String msg = String.format("Hello, %s!", name);
System.out.println(msg);

// Подставляем несколько значений в шаблон строки
int quantity = 10;
double price = 5.99;
msg = String.format("You have ordered %d items at " +
                      $%.2f each.", quantity, price);
System.out.println(msg);
Вывод:
Hello John You have ordered 10 items at $5.99 each.

2. MessageFormat

Класс MessageFormat — еще один способ интерполяции строк в Java. Его метод format() позволяет заменять плейсхолдеры, заключенные в фигурные скобки, на значения из переменных. Вот пример:
int quantity = 10; double price = 5.99;
String msg = MessageFormat.format("You have ordered {0} items at " +
                    ${1} each.", quantity, price);
System.out.println(msg);
Вывод:
You have ordered 10 items at $5.99 each.
Этот способ позволяет представить массив вместо отдельных значений. Элементы массива заменяются на соответствующие заполнители. Это очень удобно, когда большое количество значений. Давайте взглянем на пример:
int quantity = 10; double price = 5.99;
Object[] arr = {quantity, price};
String msg = MessageFormat.format("You have ordered {0} items at " +
                  "${1} each.", arr);
MessageFormat поддерживает расширенные параметры форматирования, где вы можете указать стиль форматирования вместе с заполнителями. Так вы можете указать MessageFormat форматировать аргумент как дату, валюту, время и так далее. Эти параметры предоставляются в фигурных скобках после индекса. Пример кода:
String message = "At {0,time, long} on {0,date}," +
                 " {1} paid {2,number, currency} for {3}.";
Object[] arguments = {
  new java.util.Date(),
  "A B",
  4.259,
  "a piece of gum"
};
String result = MessageFormat.format(message, arguments);
System.out.println(result);
message = "At {0,time, full} on {0,date, medium}," +
          " {1} paid {2,number, currency} for {3}.";
result = MessageFormat.format(message, arguments);
System.out.println(result);
message = "At {0,time, medium} on {0,date}," +
          " {1} paid {2,number} for {3}.";
result = MessageFormat.format(message, arguments);
System.out.println(result);
Вывод:
At 5:08:32 pm IST on 18-Dec-2022, A B paid ₹4.26 for a piece of gum. At 5:08:32 pm India Standard Time on 18-Dec-2022, A B paid ₹4.26 for a piece of gum. At 5:08:32 pm on 18-Dec-2022, A B paid 4.259 for a piece of gum.

3. StringBuilder

Класс StringBuilder позволяет создавать изменяемые строки. Изменяемость означает, что вы можете выполнять операции со строковыми значениями без создания различных строковых объектов, поскольку сами строковые объекты неизменяемы. StringBuilder представляет метод append(), который принимает значения разных типов и добавляет предоставленное значение к строке. Таким образом, это позволяет создать интерполированную строку, как показано ниже.
// определяем переменные
int a = 10, b = 20;
int sum = a + b;
// создаем новый объект StringBuilder
StringBuilder sb = new StringBuilder();
// добавляем несколько строк в StringBuilder
sb.append("Sum ");
sb.append("of ");
sb.append(a);
sb.append(" and ");
sb.append(b);
sb.append(" is ");
sb.append(sum);
// преобразовываем содержимое StringBuilder в строку
String str = sb.toString();
System.out.println(str);
Вывод:
Sum of 10 and 20 is 30
Обратите внимание, что append() возвращает тот же объект StringBuilder, для которого он был вызван. Это означает, что вы можете связать несколько вызовов с append(). Показанный выше код можно изменить примерно вот так:
StringBuilder sb = new StringBuilder();
sb.append("Sum ").
append("of ").
append(a).
append(" and ").
append(b).
append(" is ").
append(sum);

4. Apache Commons Text

В текстовой библиотеке Apache Commons есть класс StringSubstitutor, который может заменять переменные в строке их значениями. Например, мы создаем Java Map с именами переменных в качестве ключей и их значениями в качестве значений Map. Map поставляется в StringSubstitutor вместе с конструктором. Затем мы вызываем метод replace(), предоставляя ему строку, содержащую имена этих переменных. Помните, что переменные должны быть заключены внутри ${}, как указано в документации StringSubstitutor. Проще говоря, класс StringSubstitutor берет фрагмент текста и заменяет все переменные внутри него. Определение переменной по умолчанию — ${имя_переменной}. Пример кода:
Map<String, Object> vars = new HashMap<>();
vars.put("a", 10);
vars.put("b", 20);
vars.put("sum", a+b);
StringSubstitutor sb = new StringSubstitutor(vars);
String str = sb.replace("Sum of ${a} and ${b} is ${sum}");
System.out.println(str);
Вывод:
Sum of 10 and 20 is 30
Вы также можете использовать метод replace() без создания объекта, так как есть статический метод, который принимает Map и строку в качестве аргументов. Пример этого показан ниже:
Map<String, Object> vars = new HashMap<>();
vars.put("a", 10);
vars.put("b", 20);
vars.put("sum", a+b);
String str = StringSubstitutor.replace(
               "Sum of ${a} and ${b} is ${sum}", vars);

5. Конкатенация

Строки можно интерполировать с помощью оператора плюс (+). Также вы можете добавлять переменные в строки, в этом случае их значения добавляются к результирующей строке. Пример кода:
int a = 10, b = 20;
int sum = a + b;
String s = "Sum of " + a +
           " and "+ b + " is " + sum;
Обратите внимание, что добавление нескольких строк с помощью + не считается хорошей практикой, поскольку при этом будет создано несколько строковых объектов. Это связано с тем, что строковые объекты являются неизменяемыми, что означает, что вы не можете изменить их значение после создания.
Комментарии
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
У этой страницы еще нет ни одного комментария