繁体   English   中英

JDBC / WebRowSet:readXml(阅读器阅读器)与readXml(InputStream iStream)

[英]JDBC / WebRowSet: readXml(Reader reader) vs. readXml(InputStream iStream)

这是一个简单的示例,用于将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);

但是,不是真的,使用InputStream将xml文件读入WebRowSet对象比使用Reader更快吗? 如果是这样,那么在这种情况下,readXml(Reader reader)的作用是什么?

一个采用InputStream (面向字节),而另一个采用Reader (面向字符)。 提供的方法更多是为了方便。 在某些情况下,您拥有InputStream ,而在其他情况下,则为Reader并被迫转换为特定类型很麻烦,而行集引用实现所使用的基础XML库能够很好地处理这两种情况。 因此,既提供又便宜又方便。

我不确定为什么您认为InputStream会比阅读器快。 哪个更快取决于很大程度上取决于流或读取器的实际类型(例如是否缓冲)。 由于XML是面向字符的格式,因此使用Reader可能会有次要的优势,但是如果与缓冲与未缓冲相比这有明显的区别,我会感到惊讶。

简而言之,两种方法都存在的原因是方便性而不是性能。

例如,如果我已经有一个带有值的字符串,那么构造一个StringReader比尝试使用ByteArrayInputStream派生一个InputStream更方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM