Java PrintWriter flush属性

在做当前项目的socket开发时候,按照惯例使用BufferedReader和PrintWriter做输入输出,发现使用telnet连接服务器的时候,客户端输入正常,服务器输出正常 ,但是客户端没有接收到服务器的消息。考虑过是和Flush有关的问题,依稀记得以前看到过有关PrintWriter的介绍,是在调用println等方法的时候自动flush的,于是一直没仔细研究。研究过各个方面后以及其他代码之后,又重新把目光投向flush问题上,最终也确定了是这个问题。

首先,与PrintStream不同,PrintWriter不是遇到新行(ln,或n)就flush,而是在调用println,printf或者format方法被调用的时候flush的。然而这有一个前提,就是要开启自动flush的功能。这一设定是在PrintWriter的构造函数中的,autoFlush参数指定了构造的PrintWriter对象是否自动Flush:

PrintWriter(OutputStream out, boolean autoFlush)

PrintWriter(Writer out, boolean autoFlush)

以下构造函数构造的PrintWriter对象没有自动Flush属性:

PrintWriter(OutputStream out)

PrintWriter(Writer out)

PrintWriter(File file)

PrintWriter(File file, String csn)

PrintWriter(String fileName)

PrintWriter(String fileName, String csn)

Java SQL Statement初探

前几天说到新开始的Java项目,里面使用到了Java SQLite JDBC driver,今天继续来探讨一下Java中SQL数据库的使用。

应当注意到,在java当中,SQL语句的执行是以java.sql.Statement为载体的。我们先来看Statement的方法成员。有关java.sql.Statement的文档可以在Oracle找到。

Method 方法

executeQuery

ResultSet executeQuery(String sql)
                       throws SQLException

执行指定的SQL语句并返回一个结果集对象(ResultSet);

参数:

sql – 发送给数据库的sql语句,通常是静态的SQL SELECT语句;

返回:

一个包含查询结果的ResultSet对象,永远非空;

抛出:

SQLException – 如果数据库访问错误则抛出异常,比如说在已结束的Statement中调用这个方法或者SQL语句执行结果不是一个ResultSet。

executeUpdate

int executeUpdate(String sql)
                  throws SQLException

执行指定的SQL语句,比如INSERT,UPDATE或者DELETE语句,或者说是一个不产生结果的SQL语句,比如SQL DDL语句;

参数:

sql – 一组SQL Data Manipulation Language (DML)语句,比如INSERT,UPDATE或者DELETE;再或者说是一个不产生结果的SQL语句,比如SQL DDL语句;

返回:

以下可能:
(1)SQL Data Manipulation Language (DML)语句行数;
(2)如果SQL语句执行结果没有返回值则返回0;

抛出:

SQLException – 如果数据库访问错误则抛出异常,比如说在已结束的Statement中调用这个方法或者SQL语句执行结果产生了一个ResultSet。

close

void close()
           throws SQLException

立即释放Statement对象的数据库和JDBC资源而不是等待其自动关闭。通常来说在工作完成后立即释放资源是一个好的做法以避免耗尽数据库资源。
在一个一杯关闭的Statement对象上调用此方法不会有任何效果。

备注:

当一个Statement被关闭,其当前的结果集如果存在,则也会被关闭;

抛出:

SQLException – 如果数据库访问错误则抛出异常。

Java SQLite 初探

最近开始新的项目,初步规划使用Java,以及SQLite做CS架构的应用。目前用的是SQLite JDBC Driver 3.7.2。

使用的时候,首先引用

import java.sql.*

然后连接到数据库:

java.sql.Connection connection = java.sql.DriverManager.getConnection("jdbc:sqlite:sample.db");

执行SQL语句,准备查询字符串,以及执行查询:

java.sql.Statement statement = connection.createStatement();
statement.executeUpdate("drop table if exists sample");
statement.executeUpdate("create table sample(int_1 integer, str_1 string)");
statement.executeUpdate("insert into sample values(1, 'first')");
statement.executeUpdate("insert into sample values(2, 'second')");
java.sql.ResultSet rs = statement.executeQuery("select * from sample");

从结果集中取出内容:

while(rs.next())
{
    System.out.println("string = " + rs.getString("str_1"));
    System.out.println("integer = " + rs.getInt("int_1"));
}

到此为止上述代码完成了最基础的SQL语句的执行操作,SQLite数据库和java语言环境成功地连接起来了。

然而必须要说的是,这里使用的JDBC Driver尽管实现了上述操作,达到了在java环境中使用SQLite数据库的目标,但是数据库性能真的是令人堪忧。目前我们还没有进一步的需求使用更高性能的数据库,所以依然在使用JDBC Driver,但是如果日后对数据库的要求上来了,我估计在维持java和SQLite两个选项不变的前提下,是很需要把JDBC Driver换成相应的C Wrapper的。

站点迁移完成

今天完成了从旧站点fishinbox到新站点staryland.com的迁移工作。旧的fishinbox.tk站点依然存在,只是不会继续维护了。

新的站点依然使用cloudflare的CDN服务,国内访问速度不是很乐观,但是好在方便省心,激进的优化设置也许会有兼容性问题,不过就目前来看,在本站上运行状况良好。

此次迁移也标志着我正式开始记录日志了,思绪或者经验总是要与人分享的,记录下来宜人宜己。本站内容主要集中在编程(C++,C#,Java,PHP),数据库应用(SQL)等方面上,但日后会更加丰富。