Java缓冲字节流复制文件的代码

对于机械硬盘来说,复制文件时,如果每次复制的数据比较小(比如几个字节),而量又特别大就会是个非常蛋疼的事情,效率非常非常的低,如果能够使用缓存一次性复制较大的数据(8~10K),那么就可以大大提高效率了。

而Java提供了带缓存的读写字节流BufferedInputstream和BufferedOutputsteam,那么通过这两个流复制文件可以提高文件复制的效率,因为通过缓存的方式可以一次性读取更多的字节数,然后再一次性写入更多的字节数,这样可以大大的降低硬盘的IO压力,从而提高复制效率。

Java中BufferedInputstream和BufferedOutputsteam默认的缓冲buff是8K,当然,我们也可以自定义buff,而经过测试(不严谨),发现自定义一个8K的buff比Java使用默认的8K的buff速度要快…而自定义buff的代码也不多,所以建议优先使用自定义buff的代码,那么代码如下: 继续阅读

Java Socket设置连接超时的代码

Java的Socket如果连接不到指定IP和Port的主机,就会抛出IOException异常,而通常情况下,从连接到出现IOException会有一段不定的时长,就是所谓的超时时长,如果超时时长过长,在开发时会影响测试,如果代码成了产品,又会非常的影响用户体验,那么要怎么设置这个时长呢?

Socket的类提供了一个方法:

public void connect(SocketAddress endpoint, int timeout) 
				throws IOException

参数:
endpoint – SocketAddress 提供主机IP和Port
timeout – 要使用的超时值(以毫秒为单位)。

该方法用于将Socket连接到指定的服务器,并设定一个超时值。超时值设定为大于0时,当超时后,就会抛出异常,停止连接,而超时值设为0将无限超时。

因此,使用上述方法就可以设置Socket连接的超时时长了,代码如下: 继续阅读

JSP EL表达式的属性名中不能出现的字符

写Servlet返回JSP的值时,是这样写的:

req.setAttribute("login-error", "登录失败");

JSP中是这样写的:

${login-error}

运行后,页面显示了一个“0”…

这是什么鬼,后台也报错了(我提取出了关键错误信息):

org.apache.el.parser.ParseException: Encountered ” “error “” at line 1, column, Was expecting one,
“}”, “.”, “[“, “>”, “gt”, “<“, “lt”, “>=”, “ge”, “<=”, “le”, “==”, “eq”, “!=”, “ne”, “&&”, “and”, “||”, “or”, “*”, “+”, “-“, “/”, “div”, “%”, “mod” 继续阅读

Spring报配置文件错误(莫名其妙)

状态

今天用Spring写东西,运行时报配置文件写错了,还是调了一会儿,把报错的地方看了,没找到,又把所有配置都看了一遍,还是没找到……

把所有bean删了,<beans>标签中间就剩下几行空白换行,还是报错……报错的地方都是空白的……无语了,最后突然想到,会不会就是那几行空白出的错……

于是把空白删了,就不报错了……原来是不知道为什么手抖了吧,那几行空白中夹了个全角的空格,这太坑了……

所以,小伙伴们找不到错误可以考虑下这个问题!

 

Java修道之路:WEB应用的四大域笔记

在Servlet和JSP中有用来保存和传递对象参数的对象,这个对象可以看作是个容器,也称为域,程序可以往里面装键值对(绑定对象)。域有4个,分别是:

1、request:请求,所有请求相关的对象参数都被绑定在里面,如果是页面传输的参数通过getParameter方法获取,如果是通过setAttribute方法绑定的参数,通过getAttribute方法获取。该域只能该请求链访问。

2、pageContest:JSP页面上下文,该域只有JSP有,代表整个JSP页面,可以通过该域获得页面的所有属性,当然也可以通过setAttribute和getAttribute方法绑定和获取对象参数。该域在该JSP页面中都能访问。

3、session:会话,当浏览器访问服务器时,服务器会为该浏览器在服务端创建一个session,session可以用来保存数据,当然也是使用setAttribute和getAttribute方法。 继续阅读

tomcat搭建的web项目,网页第二次访问时卡住……

状态

今天用servlet和jsp写了个web小项目,后台查询mysql数据库是使用的dbcp连接池,只开了1个连接。

写完后,启动tomcat访问页面列表时,发现第一次访问没有问题,但是刷新页面或再访问其他列表页面时就一直卡住,服务端不返回任何数据到浏览器……

折腾了很久,各种打桩,发现在重启tomcat的时候,后台可以把第二次访问的页面需要查询的列表打印到控制台,但是不会返回给浏览器(其实,这个时候是没有机会返回了),经过分析,这个很像是后台在等待连接数据库,所以一直无法返回结果。仔细查看程序后,果不其然,后台访问完数据库时,忘了关闭连接,我只开了1个连接,所以第二次访问时后台一直在等待连接数据库……

坑大了,马上加上关闭连接的代码,重新部署后就OK了……所以,连接使用完一定要关闭啊!!!

想起了另一个坑,java操作文件时,没有关闭读写文件的流,文件打死都无法删除……还只有通过任务管理器结束javaw.exe进程后才能删除……所以自己创建的流用完了也要关闭啊!!!

Javascript浅尝:《贪吃蛇》续1——网页上的键盘事件

上一篇文章,我挂出了一个我用JS写的贪吃蛇,感觉怎么样呢?

因为最近在学习JS,就想找个项目来练习练习,之前用Java写过贪吃蛇,实现方法是现成的,所以就想到再用JS来写一个。

写代码之前,第一个考虑的就是按键的实现问题,这里有2点:

  1. 按方向键和空格键可以进行转向和暂停操作。
  2. 一般情况下,按方向键和空格键的时候页面会滚动,会影响玩游戏,所以游戏中,按键时滚动条必须锁定,而结束游戏后需要解锁。

那么就先来说说第一点,比较容易,给document添加onkeydown事件,通过event.keyCode来判断是哪些按键被按下,然后执行相应的操作。 继续阅读

Javascript浅尝:贪吃蛇,好不好玩吖~

开 始 游 戏

提示: 游戏中按 [空格键] 暂停


重 新 开 始
结 束 游 戏

按方向键开始移动…

得分: 0

Javascript的贪吃蛇终于写完了,后面再放出教程!最好使用Chrom来玩~

源码放在了github上,这里直达:github.com/Strangeen/JS_Snake

Java修道之路:读取指定路径的文件(如:相对路径,包路径)的方法

写java程序的时候,会用到配置文件,对于配置文件放在哪个目录,怎么读取也算是个麻烦的问题,下面就来说说怎么读取这些文件吧!

1、读取项目根目录的文件:

在Eclipse环境下,“.”(点)代表项目根目录,也就是src目录的父目录,使用时也可以省去“.”,也就是说“./test.txt”或者“test.txt”就代表在项目根目录下的test.txt文件。

下面代码可以用于测试,前提是,项目根目录有“test.txt”文件:

File file = new File("./test.txt");
// File file = new File("test.txt"); // 或者这样写

System.out.println(file.exists()); // true

2、读取相对路径的文件:

相对路径是指相对于该.class文件(在Eclipse中也就是正在编辑的.java文件)的路径,我们知道在html中读取相对文件是使用“文件名“或”文件夹名/文件名”表示与该.html同目录的文件或文件夹下的文件,使用“..”表示父目录文件夹,但是在Java中不全是这样的(我已经悲催的试过了……)。 继续阅读

File对象占多少字节呢?

那天操作File对象的时候,就在想,File对象和其对应的路径字符串哪个更占空间呢?也是突然的好奇心,对象到底占多少个字节呢?

今天就来看看如何得到对象所占的字节数,这里提供两种方法:

1、通过ByteArrayInputStream将对象存入byte数组,然后得出byte数组的大小

2、通过ObjectOutputStream将对象写入txt文件,然后查看txt文件大小

下面来看看代码:

/**
 * 1、通过ByteArrayInputStream写入byte数组实现
 */
@Test
public void test1() throws IOException {
	
	String path = "D:/abc/test.txt";
	File file = new File(path);
	
	// 创建byte数组输出流
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	
	// 创建对象输出流,并套在byte输出流上,这样就可以将对象输出到byte数组中了
	ObjectOutputStream oos = new ObjectOutputStream(baos);
	oos.writeObject(file);
	
	/* 上面两步已经将file对象转成了字节保存在baos的缓冲区了
	 * 通过baos调用toByteArray或者toString就可以查看到缓冲区的内容了 
	 */
	byte[] buf = baos.toByteArray();
	System.out.println("File对象字节数:" + buf.length); // 84
	
	// 将字符串按照默认编码转换为byte数组
	byte[] byteStr = path.getBytes();
	System.out.println("Path字符串字节数:" + byteStr.length); // 15
	
	// 结论:说明File对象中不止存储了Path字符串,还有些其他的东西...
}

说明一下:ByteArrayInputStream是java.io包中的类,可以这么理解,FileOutputStream是把程序中的对象输出到文件中,而这个ByteArrayInputStream是把程序中的对象输出到自带的byte数组缓存中,而读取这个缓存使用方法toByteArray或toString。 继续阅读

PreparedStatement提交null值

Java程序通过JDBC驱动向Oracle数据库的某张表中的age字段(number类型)插入数据,就当这张表只有这一个字段吧。

嗯,上面是前提……

这个时候我使用的是java.sql.PreparedStatment执行带参数的SQL语句,代码如下:

int age = 0;
String sql = "insert into table_name (age) values (?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, age);

这个时候age为0,我就想让插入到数据库的值是null,而不是0,然后我就尝试了这样:

pstmt.setInt(1, null);

当然,是报错了……那么我该怎么办呢?

其实,API还为我们提供了一个方法——setNull,代码改为如下:

if (age == 0) {
    pstmt.setNull(1, java.sql.Types.INTEGER);
} else {
    pstmt.setInt(1, age);
}

来解释一下,setNull的第一个参数和setInt一样,都是“?”的位置号,后面那个Types.INTEGER是SQL类型代码,当插入int时为INTEGER,这个可以查看java.sql.Types的常量,我还不是很明白对应关系……反正这里就是这么用的啦~有兴趣的朋友可以再研究研究~

Eclipse重新生成.class文件(重新编译)的方法

今天遇到个问题,突然发现项目文件夹下的bin目录中的.class文件全部消失了……也不知道是eclipse出问题了还是哪个小屁孩儿趁我不在恶作剧给我删了……

无论我怎么修改.java文件,都无法重新编译……看样子应该是系统或者eclipse出问题了。后来还是解决了……

如果小伙伴们遇到这种情况,使用下面的方法即可恢复:

1、设置eclipse自动编译:菜单栏选择“project” – “Build Automatically”,这时“Build Automatically”前面会有一个小勾。

2、Clean一下项目的.class文件:菜单栏选择“project” – “Clean”,然后根据情况选择,左边是清理全部项目,右边是清理指定的项目,我选择的清理全部项目,选择后点击“OK”。

这个时候可以看到eclipse最下方的状态栏显示清理项目和构建项目,完成后稍等片刻,.class文件就重新生成完毕了。

发送到桌面快捷方式不见了!!!

状态

莫名其妙,“发送到桌面快捷方式”不见了……找回方法:

1、开始菜单中输入shell:sendto回车。

2、此时sendto文件夹打开,按住shift点鼠标右键,在弹出的菜单中选“在此处打开命令提示符”。

3、打开黑框框后,输入“color>桌面快捷方式.desklink“回车。

就可以找回来了!!!

Oracle数据库11g快捷版使用教程(有度娘网盘链接哦~)

最近在学习Oracle数据库,好吧,我承认没有那么高大上,其实就是用Oracle数据库学习SQL……

既然在学习,装备就要齐全的说,Oracle数据库,SQL Deverloper就要安装上噻!

上Oracle官网下载Oracle Database,刚看到下载链接就被吓的不要不要的了……尼玛2.5G是几个意思啊?下载速度再快也要按小时计时了……(后面下载的时候也证实了,下载速度非常稳定的20k左右……半夜速度相对快点……)

Oracle数据库2.5G吓得我不要不要的

Oracle数据库2.5G吓得我不要不要的

继续阅读

Java修道之路:学习笔记(1) —— ArrayList集合

ArrayList是List接口的实现类,List是可重复集,也可以叫做有序集。

List的常用实现类还有LinkedList。ArrayList和LinkedList拥有不同的物理存储方式,前者类似于数组,后者称之为链表,即可以通过上一个元素找到下一个元素。

不同的物理方式赋予不同的性质,ArrayList插入元素慢,但是查找元素快,而LinkedList插入元素快,查找元素慢,两者遍历速度相同。

下面以ArrayList为例,列出几个需要注意的点,其他的常用方法查API去~

先给一个ArrayList,并赋值:

List list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");

1、打印,List的父类java.util.AbstractCollection重写了toString方法,因此可以将元素直接打印出来。

System.out.println(list.toString());  // [One,Two,Three]
// List的父类java.util.AbstractCollection重写了toString方法,因此可以将元素直接打印出来

继续阅读