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方法,因此可以将元素直接打印出来

继续阅读

约瑟夫问题用面向对象思想来解决的方法

上一篇文章说到了约瑟夫问题,现在再用面向对象的思想来解决。

先建立两个类:Child类和Circle类,分别保存小屁孩儿的信息和圆圈的信息。

约瑟夫问题的面向对象思想解决方法

约瑟夫问题的面向对象思想解决方法

代码如下:

Child类:

/**
 * 用于描述小孩儿的信息,最关键的是该小孩儿前后的两个小孩
 * @author Bigworld
 */
class Child {
	static int count = 1; // 用于生成小孩的编号,每次实例化一个小孩会加1
	
	Child prev, next; // 表示该小孩前后2个小孩
	int id;			// 表示小孩的编号

	public Child() {
		id = count ++; // 给小孩加编号
	}
}

继续阅读

Java修道之路:我也来讲讲约瑟夫问题

“约瑟夫”名字听起来挺B格的,可是不要以为是什么很高深的玩意儿。

举个例子:

有30个小屁孩儿,手拉手的围成一个圈,然后从第一个小屁孩儿开始报数,1,2,3,当报到3时,报3的那个小屁孩儿就退出圈,然后从该报4的那个小 屁孩儿重新开始报1,当又报到3时,报3的那个小屁孩儿退出,这样反复循环,当只剩下最后一个小屁孩儿的时候,问该小屁儿是这个圈中的第几个小屁孩儿。

问题就是这么简单,怎么做呢?

首先想到的就是使用数组模拟这个圈,方法可以,但是程序写起来比较繁琐。

那么面向对象思想呢?也可以,定义一个小孩儿类和一个圈类,然后构建一个双向循环链表,也可以搞定。但是代码量也挺大,而且构建链表的时候会犯晕……

其实,我想说的是一个代码量很少而且也很好理解的算法,就是使用Java提供的“队列(Queue)”,就可以轻松搞定。但是,在这之前必须转换一下思维。 继续阅读

Java修道之路:遍历枚举类以及随机选取枚举值的方法

Java中的Enum是个不错的东西,中文名字叫做“枚举”,怎么用呢?

首先定义一个枚举类,枚举类定义出来就是静态的,里面的值可以自己任意命名,之后Java会自动分配相应的int值,而我们调用枚举类不需要使用int值,而是直接使用枚举的命名,这个用法有点类似于常量。

在枚举类的API中(lang.Enum)还有一些方法,比如ordinal方法就是返回该枚举值对应的int值。

枚举类是定义出来了,但是如果想遍历该枚举类,以及随机选取一个枚举值,该怎么做呢?

经过实验,下面方法可行: 继续阅读

Java修道之路:为 JPanel添加事件监听

使用Java.swing创建窗口的时候一般如下代码:

JFram jf = new JFram();
Jpanel jp = new JPanel;
jf.add(jp);

这样,就创建了一个窗口。

这时如果想要向jp中的对象加入控制事件(如键盘事件),会遇到一个问题:jp无法获得事件……而监听到事件的是jf。

后来查询得知,其实代码很简单,只用给jp添加一段代码即可:

jp.setFocusable(true);

这段代码的意思是重新设置jp的焦点,覆盖其父类 Component的焦点设置,这样jp就可以获得事件了!