Sdscompany.ru

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

Java io ioexception скачать

java.io.IOException – How to solve Java IOException

Posted by: Bhagvan Kommadi in IOException May 30th, 2014 0 Views

This article talks about java.io.ioexception . This exception is related to Input and Output operations in the Java code. This exception happens when there is a failure during reading, writing and searching file or directory operations. IOException is a checked exception. A checked exception is handled in the java code by the developer. This exception object has a string message which is the root cause for the failure.

IOException has sub classes such as FileNotFoundException , EOFException , UnsupportedEncodingException , SocketException , and SSLException . If the file is not found, FileNotFoundException is thrown. While reading a file, EOFException occurs when end of the file is reached. If the file has an unsupported encoding, UnsupportedEncodingException occurs. When the socket connection is closed, SocketException can happen. SSLException happens when the ssl connection is not established.

IOException Subclasses

1. Prerequisites

Java 7 or 8 is required on the linux, windows or mac operating system.

2. Download

You can download Java 7 from Oracle site. On the other hand, You can use Java 8. Java 8 can be downloaded from the Oracle web site .

3. Setup

You can set the environment variables for JAVA_HOME and PATH. They can be set as shown below:

4. What is Java IOException

java.io.IOException is an exception which programmers use in the code to throw a failure in Input & Output operations. It is a checked exception. The programmer needs to subclass the IOException and should throw the IOException subclass based on the context.

5. UML diagram

The sequence diagram of throwing of the IOException in classes Manager, Service, Facade and Persistence Manager is shown below:

IO Exception Sequence Diagram

6. When is IOException thrown

Java application needs to handle failures related to reading, writing and searching a file or a directory. java.io.IOException is the base exception class used for handling the failures. In a method of a class, try, catch, and finally block handles the exception. The application api class methods throw an IOException or its subclasses.

Try catch finally block of code is shown below in different scenarios. The code below shows printing of the exception stack trace.

Printing Stack trace

In the code below, a runtime exception is thrown after catching the IOException in a java application.

throwing a runtime exception

In the code below, a wrapped exception is thrown after catching IOException in Facade class.

throwing a wrapped exception

In the code below, throwing a business exception after catching the IOException is shown.

Throwing a business exception

Throwing an application exception after catching an IOException is presented in the code below:

Throwing an application exception

6. A simple case of java.io.ioexception

Let’s see a very simple case of a Java IOException . In the following example, we are going to try to read some lines of text from a file that does not exist:

The code above is executed as shown below:

Now, when you run this program, because the file input.txt does not exist, the exception is thrown as shown in the screen below. As you can see the message is showing the cause of the problem. The root cause of the problem is that the file does not exist.

IOException

EOFException is a subclass of the IOException.The code below shows how an EndOfFileException happens while reading an input file. While reading a file, EOFException is thrown when the end of the file is reached.

The code above is executed as shown below:

You can run the above code as per the command above. The output is as shown in the screen below.

EOFException

FileNotFoundException is a subclass of IOException. FileNotFoundException scenario is presented in the code below. This happens if the input file is not found.

The code above is executed as shown below:

The output of the code when executed is shown below.

FileNotFoundException

7. How to solve Java IOException

IOException is a Java exception which occurs when an IO operations fails.Develop can explicitly handle the exception in a try-catch-finally block and print out the root cause of the failure. The developer can take the correct actions to solve this situation by having additional code in the catch and finally blocks.

8. Download the Source Code

That was an example on how to solve the java.io.ioexception .

Last updated on Sept. 30, 2019

Java io ioexception скачать

Начиная разговор о потоках ввода-вывода, в первую очередь я бы хотел, чтобы вы увидели главную задачу — программа должна иметь возможность передать данные кому-то еще. Еще раз — современная программа не существует в вакууме, в сегодняшних условиях подавляющее большинство программ требует интеграции с другими. Интеграция всегда подразумевает передачу данных. Т.е. одна программа как-то передает данные в другую.
Нам, как программистам,. нужен некий механизм ПЕРЕДАЧИ данных.

Дальше уже идет специализация — каким образом это можно сделать. На сегодня основных вариантов три:

  1. Файловая система — одна программа записывает в файл и другая программа читает данные из файла
  2. Сетевое взаимодействие — две программы используют сеть для передачи данных друг другу
  3. Передача из одной области памяти в другую. Данный вариант достаточно часто используется в рамках одной программы, но это не обязательно

Конечно же есть внешние устройства, которые подключаются, например, по USB, COM-порту или как-то еще. И для них тоже требуется передача данных. Хотя нередко для таких устройств операционная система может предложить некое подобие работы с файловой системой.

Сосредоточимся на передаче данных. Что это с технической точки зрения ? Да очень просто — надо “переслать” некое количество байт. Т.е одна программа (отправитель), используя какой-то механизм, “отправляет” байты, а другая (потребитель), используя тот же механизм, “потребляет” эти байты. Причем логично, что байты идут друг за другом от отправителя к потребителю … в виде некоего ПОТОКА байтов.

Это конечно же исключительно мои догадки, но мне кажется, что разработчики Java думали как-то так, когда создавали библиотеку для передачи данных. Основой для них стало понятие ПОТОКА данных.

Причем, что на мой взгляд, важно отметить — ПОТОК данных предполагает, что среда переноса данных может быть разная. Это файловая система, по сути контроллер жесткого диска. Или это сетевая карта, в которую (или из которой) записываются (читаются) байты. Во всех случаях, по сути, вы должны записать/считать байт по определенному адресу. Дальше в дело вступает электроника — вы записали байт по адресу, контроллер той же сетевой карты отправит это байт в сеть, где контроллер сетевой карты на другом компьютере поместит этот байт по определенному адресу, который будет доступен для чтения.

Читать еще:  Справочник по javascript

Таким образом можно рассматривать механизм потоков, как инструмент. С помощью которого вы как-бы подключаетесь к источнику данных (в случае чтения) или приемнику данных (в случае записи) и после подключения вам просто надо либо читать оттуда, либо писать.туда.
Мне почему-то всегды было удобно видеть это как некоторую “трубу”, с одной стороны которой мой код, а с другой стороны все, что может принимать (или порождать) набор байтов. Я просто “заливаю” в эту трубу байты. А как они там на другом конце трубы попадают в приемник — не мое дело. Я просто использую “трубы” под каждый вид приемника — для файла, для сети.

Еще крайне интересным моментов является возможность “соединять” разные потоки. Чуть позже мы увидим практическое воплощение этой идеи.
Если создать образное представление, то вы можете использовать трубу, которая например окрашивает воду, которая проходит через нее, в другой цвет. Или фильтрует. Или насыщает какими-то добавками. И на конец этой трубы вы “прикрепляете” трубу в другими возможностями. Вода (или байты) проходя по этим трубам, трансформируется.
Если смогли представить, то будет здОрово, если не получается — ничего страшного. Надеюсь, что дальнейшие примеры позволят вам это увидеть.

Типы потоков

По направлению движения данных потоки можно разделить на две группы:

  1. Поток ввода (Input) — данные поступают из потока в нашу программу. Мы их читаем из этого потока
  2. Поток вывода (Output) — данные поступают в поток из нашей программы. Мы их пишем в этот поток

Вторым критерием разделения может служить ТИП передаваемых данных. Да-да, байты не всегда являются удобным вариантом передачи — есть еще текст. Символы. Я надеюсь, вы помните, что символ в Java занимает ДВА байта. Так вот передача двух байтов как одного целого числа имеет сложность — какой байт должен идти первым ? Есть такая неприятная ситуация — в разных операционных системах этот вопрос решается по-разному.- вы можете поискать информацию в Интернете на тему big endian little endian и узнать, как непросто бывает подружить Windows и Linux или просто Linux на разных компьютерах. В данной статье я не ставлю такой задачи — просто констатирую факт: передача символов длиной в два байта требует дополнительных усилий. Поэтому и появилось такое разделение:

В итоге мы получаем 4 типа потоков. Для каждого из этих типов Java предлагает отдельный базовый абстрактный класс. Почему абстрактный ? Потому, что у нас есть специализация — файлы, сеть, память. И расширяя базовый класс специальный класс решает свои специальные задачи. Но базовые функции для всех одинаковые. Что удобно — все специальные потоки по своей сути одно и тоже. Это дает гибкость и универсальность. Вот эти классы:

  1. InputStream — поток для чтения байтов (поток ввода)
  2. Reader — поток для чтения символов (поток ввода)
  3. OutputStream — поток для записи байтов (поток вывода)
  4. Writer — поток для записи символов (поток вывода)

Основной функцией для потоков ввода является метод read в нескольких модификациях, которые мы рассмотрим позже. Разница для InputStream и Reader состоит только в том, что первый читает байты (byte), а второй — символы (char).
Вполне логично вытекает название основного метода для классов OutputStream и Writer — метод write. Тоже в нескольких модификациях.

Основные действия с потоком

Схема работы с потоком в упрощенном виде выглядит так:

  1. Создается экземпляр потока
  2. Поток открывается (для чтения или записи)
  3. Производится чтение из потока/запись в поток
  4. Поток закрывается

Первые два пункта часто совмещены в рамках одного действия. По сути потоки можно представить как трубу, в которую “заливаются” байты или символы. Причем что еще интереснее, эти трубы можно “склеивать” друг с другом. Т.е один поток может передавать данные в другой, предварительно как-то их модифицируя.
Этот прием мы еще увидим, а пока давайте решим простую задачу — запишем строку в файл. В текстовый файл. Т.е. Нам потребуется поток для символов — Writer. Потом мы прочитаем этот файл — и для этого используем Reader.
Чуть выше я говорил, что Reader и Writer — абстрактные классы. Для работы с файлами нам потребуются уже конкретные и это будут FileReader и FileWriter.
Первым шагом мы запишем текст в файл. Порядок работы с потоком я в принципе описал, поэтому давайте конкретизируем наши действия. Создание и открытие файлового потока на запись делает в момент создания экземпляра объекта FileWriter, у которого конструктор принимает в качестве параметра строку с именем файла. Далее в цикле мы пишем в поток символы из строки и потом закрываем наш поток. Обратите внимание на конструкцию блока try. Мы уже встречали такое в разделе JDBC — групповые операции.
Повторю его идею — в момент начала блока try .. catch вы можете открыть ресурс (важно, чтобы он реализовывал интерфейс AutoCloseable). В таком случае по окончании блока ресурс будет автоматически закрыт и вам не надо вызывать метод close. Блок try .. catch мы должны использовать, т.к. Операции по открытию и записи в файл могут порождать исключения FileNotFoundException и IOException. Исключение FileNotFoundException является подклассом IOException и в принципе нам нет необходимости обрабатывать его отдельно. Так что мы сократили все до IOException.
Также советую внимательно прочитать комментарии в коде — они объясняют многие моменты.
Перейдем от слов к делу — смотрим код нашего примера

скачать — java.io.ioexception что это

Java-Что вызывает исключение IOException (2)

Документация по Java полезна, чтобы знать основную причину конкретного исключения IOException

Просто взгляните на direct known sub-interfaces IOException странице документации:

ChangedCharSetException, CharacterCodingException, CharConversionException, ClosedChannelException, EOFException, FileLockInterruptionException, FileNotFoundException, FilerException, FileSystemException, HttpRetryException, IIOException, InterruptedByTimeoutException, InterruptedIOException, InvalidPropertiesFormatException, JMXProviderException, JMXServerErrorException, MalformedURLException, ObjectStreamException, ProtocolException, RemoteException, SaslException, SocketException, SSLException, SyncFailedException, UnknownHostException, UnknownServiceException, UnsupportedDataTypeException, UnsupportedEncodingException, UserPrincipalNotFoundException, UTFDataFormatException, ZipException

Читать еще:  Thread sleep java примеры

Большинство из этих исключений самоочевидны.

Мало IOExceptions с коренными причинами:

EOFException : Сигналы о том, что конец файла или конец потока неожиданно достигнут во время ввода. Это исключение в основном используется потоками ввода данных в конец сигнала потока

SocketException : брошено, чтобы указать, что существует ошибка при создании или доступе к Socket.

RemoteException : RemoteException является общим суперклассом для ряда связанных с связью исключений, которые могут возникать во время выполнения удаленного вызова метода. Каждый метод удаленного интерфейса, который расширяет java.rmi.Remote, должен указывать RemoteException в предложении throws.

UnknownHostException : брошено, чтобы указать, что IP-адрес хоста не может быть определен. (вы не можете подключиться к Интернету)

MalformedURLException : брошено, чтобы указать, что произошел неверный URL. Либо ни один юридический протокол не может быть найден в строке спецификации, или строка не может быть проанализирована.

java.io.IOException , по-видимому, является наиболее распространенным типом исключения, по совпадению, он кажется также самым двусмысленным. Я все время вижу throws IOException при записи сокетами, файлами и т. Д. Тем не менее, я никогда не стрелял в меня, поэтому мне интересно, что это такое, что должно быть сделано для исключения. Документация не очень помогает в объяснении того, что происходит:

Сигналы о том, что произошло какое-либо исключение ввода-вывода. Этот класс является общим классом исключений, вызванных неудачными или прерванными операциями ввода-вывода.

Может кто-нибудь объяснить некоторые случаи, когда будет выбрано исключение IOException или как оно должно использоваться.

Предположим, вы были:

  1. Чтение сетевого файла и его отсоединение.
  2. Чтение локального файла, который больше не доступен.
  3. Использование некоторого потока для чтения данных, а другой процесс закрыл поток.
  4. Попытка прочитать / записать файл, но не имеет разрешения.
  5. Попытка написать файл, но дисковое пространство больше не доступно.

Есть еще много примеров, но они наиболее распространены в моем опыте.

Руководство по Java Core. Файлы и работа с ними.

При разработке программного обеспечения мы сталкиваемся с приложениями, в которых необходимо передавать или принимать файлы. Практически все классы, необходимые для этой задачи находтся в паке java.io. В работе с файлами испольщуется такое понятие, как поток (stream), который принимает входной файл и перемещает его в место назначения.

В языке программирования Java поддерживаются потоки для различных типов данных. Давайте рассмотрим их.

Потоки (Streams)

Мы можем сказать ,что поток – это последовательность данных. Существует два вида потоков:

  • Входящий поток
    В Java для чтения файлов используется InputStream .
  • Исходящий поток
    В Java используется OutputStream для записи данных в файл.

Схематично это можно изобразить так:

В Java крайне хорошо поддерживается работа с файлами. Рассмотрим различные примеры работы с файлами.

Байты

Чаще всего, для работы с байтами используются FileInputStream и FileOutputStream. Давайте рассмотрим как это работает на примере простого приложения.

Создайте в корневой папке проекта папку resources. В это йпапке создайте два файла: inputFile.txt и outputFile.txt.

Файл inputFile.txt:

Оставьте файл outputFile.txt пустым.

В результате работы программы мы получим следуюющий результат:

После запуска приложения смотрим файл outputFile.txt

Копирование успешно выполнено.

Символы

Байтовые потоки в Java используются для ввода и вывода 8-битных элементов. Символьные потоки используюстся для работы с 16-битной кодировкой Unicode.

Для работы с символами, чаще всего используют FileReader и FileWriter. FileReader читает одновременно по 2 байта, а FileWriter, в своб очередь, записывает по 2 байта за раз.

Для понимания того, как жто работает на практике рассмотирм пример простого приложения.

Создайте в корневой папке проекта папку resources. В это йпапке создайте два файла: inputFile.txt и outputFile.txt.

Файл inputFile.txt:

Оставьте файл outputFile.txt пустым.

В результате работы программы мы получим следуюющий результат:

После запуска приложения смотрим файл outputFile.txt

Копирование успешно выполнено.

Стандартные потоки

Как и во многих других языках программирования, в Java обеспечивается ввод информации в программу во время её выполнения. Для этих целей в Java существует три стандартных потока:

  • Стандратный ввод
    Используется для ввода пользователем информаци (обычно – клавиатура) и представлен элементом System.in.
  • Стандартный вывод
    Используется для вывода данных пользователю (обычно – экран монитора) и представлен элементом System.out.
  • Стандартная ошибка
    Используется для вывода ошибок произошедших при работе программы (обычно – на экран монитора) и представлен элементом System.err.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

Запускаем программу и начинаем вводить символы. Если нам необходимо выйти – вводим символ ‘Q’.

В результате работы рпограммы мы получим, примерно, следующий результат:

Чтение и запись файлов

Теперь рассмотрим чтение и запись файлов более подробно.

Рассмотренные ранее InputStream и OutputSream используются для чтения и записи данных из файлов записи их в файлы.

Давайте посмотрим а иерархию этих двух классов:


Далее мы рассмотрим FileInputStream и FileOutputStream.

FileInputStream

Этот элемент используется для чтения данных из файлов.

FileInputStream имеет следующие методы:

  • public void close() throws IOException
    Этот метод закрывает поток и освобождает любый ресурсы системы, которые связаны с этим файлом. В случае ошибки “бросает” IOException.
  • public void finalize() throws IOException
    Этот метод “чистит” соединение с файлом. И проверяет, что метод close() был вызван. В случае ошибки “бросает” IOException.
  • public int read(int r) throws IOException
    Этот метод читает определённые байты данных из входящего файла .Возвращает int. Если весь файл прочитан – будет возвращено занчение -1. В случае ошибки “бросает” IOException.
  • public int read(byte[] r) throws IOException
    Этот метод читает количество байтов, равное длине массива (r.length). Если весь файл прочитан – будет возвращено занчение -1. В случае ошибки “бросает” IOException.
  • public int available() throws IOException
    Этот метода возвращает количество байтов, которое может быть прочитано из заданного входного файла. Возвращаетint.

Рассмотрим два ключевых входных потока:

FileOutputStream

Этот поток используется для создания файлов и записи в них данных. Если файл, в который мы хотим записать данные ещё не существует, то FileOutputStream создаст его автоматически.

Исходящий поток имеет следующие методы:

  • public void close() throws IOException
    Этот метод закрывает исходящий поток и освобождает все ресурсы системы, который связаны с ним. В случае ошибки “бросает” IOException.
  • protected void finalize() throws IOException
    Этот метод “чистит” соединение с файлом. Проверяет был ли вызван метод close(). В случае ошибки “бросает” IOException.
  • public void write(int w) throws IOException
    Этот метод записывает опредлённые байты в указанный файл. В случае ошибки “бросает” IOException.
  • public void write(byte[] w) throws IOException
    Этот метод записывает количество байтов, равное длине заданного массива (w.length) в указанный файл. В случае ошибки “бросает” IOException.
Читать еще:  Java android toolbar

Рассмотрим два ключевых исходящих потока:

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

В результате работы программы мы получим, следующий результат:

Навигация файлов и I/O

Рассмотрим другие ключевые классы, которые мы модем использовать при работе с файлами и I/O:

Директории в Java

Директория (грубо говоря – папка) – это экземпляр класса File, который содержит список других файлов.

Для создания директорий существует два метода, которые мы можем использовать:

  • mkdir()
    Этот метод создаёт директорию и возвращает логическое значение true, если создание прошло успешно, и false – если нет. Ошибка может быть вызвана либо тем, что данная директория уже существует, либо тем, что вводнй путь директории ещё не создан.
  • mkdirs()
    Этот метод метод создаёт и саму директорию и путь (родительские папки) к этой директории.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

В результате работы программы будет создана директория (папка) с названием testDir по указанному пути. Вы олжны вставить свой желаемый путь создаваемой директории.

Кроме того, мы также можем получить список файлов и директорий, которые находятся в интересующей нас папке с помощью метода list().

Рассмотрим пример простого приложения, в которм мы попробуем получить список всех файлов и директорий в корневой папке проекта.

В результате работы программы мы получим, примерно, следующий результат:

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

В следующем уроке мы изучим такую важную составляющую языка программирования Java, как исключения (Exceptions).

Java.io.IOException: обнаружено не было

Я новичок в android, и это мой первый проект на Android. Я борюсь с проблемой «проверки подлинности» более чем на один день. Я попробовал несколько вариантов, но никто из них не работал.

В принципе, я хочу вызвать REST API и получить ответ. Я уверен, что в API нет проблем, поскольку я использую тот же самый в другом приложении iOS.

Я передаю заголовок авторизации, но все же аутентификация не отображается. Я нашел несколько вопросов о stackoverflow, связанных с этим, но некоторые из них не работали, и некоторые из них не имеют смысла для меня.

Я получаю код статуса 401 . Я знаю, это означает, что никакая аутентификация не прошла или не прошла, тогда они ошибаются. Здесь, я уверен, мои прошедшие правильные.

Посмотрите на скриншот logcat:

Любая помощь будет оценена по достоинству. Спасибо.

Эта ошибка возникает из-за того, что сервер отправляет 401 (неавторизованный), но не дает заголовок WWW-Authenticate который является подсказкой для клиента, что делать дальше. Заголовок WWW-Authenticate сообщает клиенту, какой тип аутентификации необходим (либо Basic, либо Digest ). Это, вероятно, не очень полезно в безгласных http-клиентах, но именно так определяется HTTP 1.1 RFC . Ошибка возникает из-за того, что lib пытается проанализировать заголовок WWW-Authenticate но не может.

(…) Ответ ДОЛЖЕН включать поле заголовка WWW-Authenticate (раздел 14.47), содержащее вызов, применимый к запрашиваемому ресурсу. (…)

Возможные решения, если вы можете изменить сервер:

  • Добавьте поддельный заголовок «WWW-Authenticate», например: WWW-Authenticate: Basic realm=»fake» . Это просто обходное решение, а не решение, но оно должно работать и клиент http удовлетворен ( см. Здесь обсуждение того, что вы можете поместить в заголовок ). Но будьте осторожны, чтобы некоторые клиенты-клиенты могли автоматически повторить запрос, результатом которого было несколько запросов (например, слишком часто увеличивает неверный счет входа в систему). Это наблюдалось с клиентом iOS http.
  • Как предложил громвчар в этом блоге, чтобы избежать автоматической реакции на вызов, как всплывающая форма входа в браузере, вы можете использовать нестандартный метод аутентификации, например: WWW-Authenticate: xBasic realm=»fake» . Важным моментом является то, что realm должна быть включена.
  • Используйте код статуса HTTP 403 вместо 401 . Это семантика не то же самое и обычно при работе с логином 401 это правильный ответ ( см. Здесь подробное обсуждение ), но более безопасное решение с точки зрения совместимости.

Возможные решения, если вы не можете изменить сервер:

Как писал @ErikZ в своем посте, вы можете использовать try & catch

Используйте другой http-клиент, например, OkHttp

Какую версию Android вы тестируете?

У меня возникли трудности с аутентификатором Android во время некоторых разработок на Gingerbread (я не знаю, работает ли он по-разному в более поздних версиях Android). Я использовал Fiddler2 для проверки HTTP-трафика между моим приложением и сервером, обнаружив, что аутентификатор не отправил строку аутентификации для каждого HTTP-запроса. Мне это нужно.

Вместо этого я обратился к этому:

Это вырезание и вставка из моего кода. Обратите внимание, что urlConnection является объектом HttpURLConnection.

У меня была такая же проблема на устройствах, на которых работает pre-KitKat Android, но я использовал библиотеку Volley, поэтому исправление на стороне клиента, предоставленное @ for3st, не работало для меня, мне пришлось настроить его для Volley, вот оно, надеюсь, это Помогает кому-то бороться с этой проблемой:

Таким образом возвращается ошибка 401, и ваша политика повтора может выполнять свою работу (например, маркер запроса … и т. Д.). Хотя IOException может быть вызвано какой-то другой проблемой, кроме 401, поэтому вы можете выбрать синтаксический анализ сообщения об исключении для ключевого слова Authorization и вернуть другой код ответа для других.

Имел ту же проблему на некоторых старых устройствах (например, Huawei Y330-U11). Правильный способ исправить это – исправить его на стороне сервера, как указано в наиболее популярном ответе.

Однако, это действительно разочаровывает, что проблема возникает только на некоторых устройствах. И я считаю, что это происходит из-за различных реализаций «UrlConnection». Различные версии Android – разные реализации «UrlConnection».

Таким образом, вы можете исправить это, используя везде «UrlConnection». Попробуйте использовать okhttp и okhttp-urlconnection.

Вот способ добавить эти библиотеки к вашей конструкции градиента:

Он решил проблему для меня на этих устаревших устройствах. (Мне пришлось использовать OkClient для RetoFit RestAdapter)

PS Последние андроиды на момент написания статьи используют старую версию библиотеки OKHTTP внутри себя как «UrlConnection» (с обновленными именами пакетов), поэтому кажется, что это довольно солидная вещь

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector