JDBC / WebRowSet: readXml (читатель Reader) и readXml (InputStream iStream) - PullRequest
0 голосов
/ 22 мая 2019

Вот упрощенный пример для чтения xml-файла в объект WebRowSet и последующей загрузки данных из него в базу данных.

import javax.sql.rowset.RowSetProvider;
import javax.sql.rowset.WebRowSet;
import javax.sql.rowset.spi.SyncProviderException;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;


public class WebRowSetTest {
    public static void main(String[] args) throws SQLException {

        // Create WebRowSet object and populate it with data from xml-file.
        WebRowSet receiver = RowSetProvider.newFactory().createWebRowSet();
        Path file = Paths.get("priceList.xml");
        try (InputStream in = Files.newInputStream(file)) {
            receiver.readXml(in);
        } catch (IOException x) {
            x.printStackTrace();
        }
        System.out.println("WebRowSet deserialiazed.");

        // Establish connection with database
        String connectionURL = "jdbc:mysql://localhost:3306/testdb";
        Properties connectionProps = new Properties();

        connectionProps.put("user", "root");
        connectionProps.put("password", "1234");
        connectionProps.put("serverTimezone", "Europe/Moscow");
        Connection conn = DriverManager.getConnection(connectionURL, connectionProps);
        conn.setAutoCommit(false);

        // Load data from WebRowSet object to database.
        try {
            receiver.acceptChanges(conn);
        } catch (SyncProviderException spe) {
            System.out.println("You need specify how to resolve the conflict.");
        }

        // Close connection.
        conn.close();
    }
}

Существует еще один метод для чтения xml-файла, который использует Reader вместо InputStream. Итак, я мог бы заменить строки кода для чтения xml-файла в WebRowSet примерно так:

    FileReader fReader = null;
    try {
        fReader = new FileReader("priceList.xml");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    receiver.readXml(fReader);

Но не правда ли, что чтение xml-файла в объект WebRowSet с использованием InputStream быстрее, чем с помощью Reader? Если так, то какова цель readXml (Reader Reader) в этом случае?

1 Ответ

1 голос
/ 22 мая 2019

Один принимает InputStream (ориентированный на байты), а другой - Reader (ориентированный на символы).Методы предоставлены больше для удобства.В некоторых случаях у вас есть InputStream, а в других - Reader, и принудительное преобразование в определенный тип является обременительным, в то время как базовая библиотека XML, используемая эталонной реализацией набора строк, может справиться с любой из них просто отлично.Так что предлагать оба - просто дешево и удобно.

Я не уверен, почему вы думаете, InputStream будет быстрее, чем читатель.Что быстрее, в значительной степени зависит от фактического типа потока или читателя (например, буферизованный или нет).Поскольку XML является символьно-ориентированным форматом, вероятно, использование Reader имеет небольшое преимущество, но я был бы удивлен, если бы это было заметным отличием по сравнению с буферизованным и небуферизованным.

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

Например, если у меня уже есть строка со значением, то создание StringReader болееудобнее, чем пытаться получить InputStream, используя ByteArrayInputStream.

...