这是一个简单的示例,用于将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)的目的是什么?
答案 0 :(得分:1)
一个使用InputStream
(面向字节),另一个使用Reader
(面向字符)。提供的方法更多是为了方便。在某些情况下,您有一个InputStream
,而在另外一个Reader
中,被迫转换为特定类型很麻烦,而行集引用实现所使用的基础XML库只能处理精细。因此,提供两者既便宜又方便。
我不确定您为什么认为InputStream
会比读者快。哪个更快取决于很大程度上取决于流或读取器的实际类型(例如是否缓冲)。由于XML是面向字符的格式,因此可能使用Reader
会有次要的优势,但是如果与缓冲与未缓冲相比,这是一个明显的区别,我会感到惊讶。
因此,简而言之,两种方法都存在的原因是方便而不是性能。
例如,如果我已经有一个带有值的字符串,那么构造一个StringReader
比尝试使用InputStream
派生ByteArrayInputStream
更为方便。