-
file.list()和file.listFiles()的使用
public static void listDirectory(File dir) throws IOException{ if(!dir.exists()) throw new IllegalArgumentException("目录:"+dir+"不存在."); if(!dir.isDirectory()) throw new IllegalArgumentException(dir+"不是目录."); //list()方法用于列出当前目录下的子目录和文件,不包含子目录下的内容 /*String[] filenames = dir.list(); for (String string : filenames) { System.out.println(dir+"\\"+string); }*/ //如果要遍历子目录下的内容就需要构造成File对象做递归操作,File提供了直接返回File对象的API File[] files = dir.listFiles();//返回的是直接子目录(子文件)的抽象 if(files!=null && files.length > 0){ for (File file : files) { if(file.isDirectory()){ //递归 listDirectory(file); }else{ System.out.println(file); } } } }
查看全部 -
File file = new File();
file.exist():返回是否文件是否存在
file.mkdir():创建目录
file.mkdirs():创建多层子目录
file.delete():删除文件
file.getName():返回文件名
file.getAbsolutePath():返回文件路径
file.isDirectory():返回是否是目录
file.isFile():返回时否是文件
file.createNewFile():创建新的文件。
file.getParent():返回父目录
查看全部 -
"gbk":中文占2个字节,英文占1个字节。
"utf-8":中文占3个字节,英文占1个字节。
java是双字节编码 utf-16be:中文占2个字节,英文占2个字节。
不同编码的java项目的文本文件直接复制粘贴会乱码,复制内容则不会。查看全部 -
查看全部
-
查看全部
-
查看全部
-
查看全部
-
mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下:
new File("/tmp/one/two/three").mkdirs();
执行后, 会建立tmp/one/two/three四级目录
new File("/tmp/one/two/three").mkdir();
则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false
查看全部 -
5)序列化中 子类和父类构造函数的调用问题
父类实现了序列化接口:
其子类都可以进行序列化
序列化:把关于父类的信息也写入文件,因为用到了子类,所以会递归调用父类的构造方法
反序列化:因为序列化时已经把关于父类的信息写入文件,所以读取的时候就不再调用父类的构造函数初始化父类的信息。
子类实现了序列化接口:
序列化:因为用到了子类,所以会递归调用父类的构造方法,但是不会把关于父类的信息写入文件
反序列化:读取到的信数据因为没有父类的信息,所以要重新调用父类的构造方法来初始化信息。
代码:
public class ObjectSeriaDemo2 {
public static void main(String[] args) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("demo/obj1.dat"));
f1 f1=new f1();
oos.writeObject(f1);
oos.flush();
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("demo/obj1.dat"));
f1 f2=(f1)ois.readObject();
System.out.println(f2);
}
}
class f {
public f() {
System.out.println("f");
}
}
class f1 extends f implements Serializable{
public f1() {
System.out.println("f1");
}
}
结果:
f
f1
f
com.imooc.io.f1@776ec8df
查看全部 -
本节目的:了解一下对一些序列化的优化问题
4) transient关键字
加了之后不会对transient修饰的属性进行JVM默认的序列化,但是可以自己对该属性另外写方法进行序列化(并不是所有的元素都要进行序列化,可节省空间)
方法签名:
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException
从ArrayList源码拷贝过来的方法签名,用来对transient关键字修饰的属性进行序列化
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException
从ArrayList源码拷贝过来的方法签名,用来对transient关键字修饰的属性进行反序列化
代码:
类:Student
用transient修饰的属性:private transient int age;
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
s.defaultWriteObject();//把jvm默认能序列化的元素进行序列化
s.writeInt(age);//把用transient修饰的属性进行序列化
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException{
s.defaultReadObject();//把jvm默认能反序列化的元素进行反序列化
this.age=s.readInt();//把用transient修饰的属性进行反序列化读取
}
分析ArrayList源码中序列化和反序列化的问题:
ArrayList源码的底层是对数组的一些方法的包装,这里面的数组也用transient关键字修饰,为的是不让数组中的无效元素进行序列化,从而节省空间,增加效率
查看全部 -
3.对象的序列化和反序列化
代码解析:
对象的类:public class Student implements Serializable
主运行代码:
String file="demo/obj.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
Student s=new Student(100001,"拉萨市",20);
oos.writeObject(s);//一次写入一个Object
oos.flush();
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
Student s2=(Student)ois.readObject();//反序列化取出来的类要进行强制类型转换,一次读取一个Object
System.out.println(s2);
ois.close();
查看全部 -
8)BufferedInputStream/BufferedOutputStream
这两个流类与其他流类不同是,不管是读取还是写入,都多处了一个缓冲区,等数据凑一个缓冲区的大小的时候才会读取/写入,提高效率
FileOutputStream-->write()方法一次写入一个字节,相当于一滴一滴的转移
DataOutputStream-->writeXxx()方法相当于一瓢一瓢的转移
BufferedOutputStream-->write()方法相当于把水放到一个缸中,等缸满的时候然后在一次性把水全部转移
用法:
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));
int c;
while((c=bis.read())!=-1) {
bos.write(c);
bos.flush();//刷新缓冲区
}
bos.close();
bis.close();
文件拷贝可以用四种方法写,1.单字节无缓冲,2.单字节带缓冲,3.字节批处理无缓冲,4.字节批处理带缓冲
查看全部 -
每个中文两个字节
查看全部 -
java中需要手动释放的资源常见的有以下两个:
流相关资源
流相关资源一般遵循:
1)先开后关,先开的输入流,再开的输出流,通过读取输入流写入输出流中,那么应该先关输出流,再关输入流,但是一般关闭输入输出流操作都是在读写完成后的finally中执行的,所以即使先关输入流,再关输出流也不会任何问题,因为读写操作没有进行了。
2)先关外层,再关内层。如BufferedInputStream包装了一个FileInputStream,那么先
关BufferedInputStream,再关FileInputStream。但要注意的是由于一般处理流持有节点流引用,处理流都会在自己的close方法中去关闭节点流,因此我们只要关闭外层的处理流即可,如果多此一举的关闭节点流反而会报错。如BufferedInputStream包装了FileInputStream,我们只要关闭BufferedInputStream即可
3)只关处理流,不关节点流,原因见上述第二条
流相关文章参考:http://blog.csdn.net/u012250875/article/details/78341874
jdbc相关资源
Connection,PrepareStatement,ResultSet三个资源。这三个资源的获取顺序是:
先获得一个jdbc连接对象Connection,再通过连接对象获得一个sql预处理对象PrepareStatement,如果是查询的话最后还会通过PrepareStatement对象获取一个结果集ResultSet对象,关闭顺序与获取顺序正好相反。先关ResultSet,再关PrepareStatement,最后关Connection。
查看全部 -
first
查看全部
举报