首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC / WebRowSet: readXml(阅读器阅读器)与readXml(InputStream iStream)

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

Stack Overflow用户
提问于 2019-05-22 21:50:46
回答 1查看 133关注 0票数 0

下面是一个简单示例,用于将xml文件读入WebRowSet对象,然后将数据从该对象加载到数据库。

代码语言:javascript
复制
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-file读入WebRowSet的代码行替换为以下内容:

代码语言:javascript
复制
    FileReader fReader = null;
    try {
        fReader = new FileReader("priceList.xml");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    receiver.readXml(fReader);

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

EN

回答 1

Stack Overflow用户

发布于 2019-05-23 00:34:07

一个采用InputStream (面向字节),另一个采用Reader (面向字符)。提供的方法更多是为了方便起见。在某些情况下使用InputStream,而在其他情况下使用Reader并强制转换为特定类型是很麻烦的,而行集引用实现使用的底层XML库可以很好地处理这两种情况。因此,提供这两种服务既便宜又方便。

我不知道为什么你认为InputStream会比reader更快。哪个更快在很大程度上取决于流或读取器的实际类型(例如是否缓冲)。因为XML是一种面向字符的格式,所以使用Reader可能有一个小优势,但如果这与有缓冲和无缓冲相比有显著差异,我会感到惊讶。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56258435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档