android培训——我的java笔记,期待与您交流!
文件搜索操作
怎么用java来搜索想要找的文件呢?
这次用递归来搜索~
public static void findFile(File target, String ext){
//如果目标文件不为空
if(target != null){
//判断目标文件是不是文件夹
if(target.isDirectory()){
//如果是把其下所有的文件放到一个文件集合里
File[] files = target.listFiles();
if(files != null){
//遍历文件夹下所有文件
for(File file: files){
//如果file还是个文件夹,就会再次运行到这里……
findFile(file,ext);
}
}
//如果不是文件夹了,就会来到这里
}else{
//得到target的绝对目录
String path = target.getAbsolutePath();
//判断是否是ext字符串结尾
if(path.endsWith(ext))
System.out.println(path);
}
}
}
文件复制操作
对于文件复制首先写了一个方法
方法名 | 返回值 | 参数 |
---|---|---|
copyFile | void | File target 要复制的文件,String dest 复制路径 |
public static void copyFile(File target, String dest){
String fileName = target.getName();
File destFile = new File(dest + fileName);
System.out.println(destFile.getName());
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(target);
out = new FileOutputStream(destFile);
byte[] bytes = new byte[1024];
int len = -1;
while((len = in.read(bytes)) !=-1){
out.write(bytes, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
由于并不知道要复制的文件类型所以使用字节流。
主程序
public class CopyFileDemo {
public static void main(String[] args) {
File target = new File("E:/something/picture/1.jpg");
String dest = "E:/something/pic/";
copyFile(target, dest);
}
缓冲流,打印流
缓冲流
频繁的读写操作太繁琐,所以使用缓冲流。
java的缓冲流使用的是一种叫做装饰着模式的设计方法,简单来说就是对流进行装饰使其可以讲数据缓冲起来然后一起写入或读取,这样就比一般的流更加高效。
下面是几个比较重要的缓冲流
名称 | 作用 |
---|---|
BufferedInputStream | 字节输入缓冲流 |
BufferedOutputStream | 字节数出缓冲流 |
BufferedReader | 字符输入缓冲流 |
BufferedWriter | 字符输出缓冲流 |
打印流
那打印流又是做什么用的呢,就是用来打印的……
一般的字节流想要输出字符,就需要将字符串转化为字节,而打印流就可以直接输出各种类型的数据,构造方法中接受输出流
PrintStream(OutputStream out)
这样就创建了一个打印流,作为打印流当然也可以显式定义编码
PrintStream(OutputStream out, boolean autoFlush, String encoding)
其中的print方法可以输出各种类型的数据,方便输出。
对象序列化
对象序列化就是指将一个对象转化为二进制的byte流。
所以讲对象保存到文件上的操作叫序列化,那么从文件将对象提取出来就是反序列化。
ObjectOutputStream可以实现序列化,ObjectInputTream实现反序列化,被序列化的对象必须实现java.io.Serializable接口。
这个接口里面什么内容也没有,是一个标记接口,凡是实现这个接口的类都可以序列化。
如果一个对象的属性不用被序列化,可以使用transient 关键字
装饰者模式
java的io本身就是一个很好的装饰者模式的例子,这里也随便写写。
装饰者模式有什么好处呢,或者说什么情况下可以用装饰者模式呢,查看java的IO就可以大概知道一些,子类功能繁多,如果每一种直接继承自IO,那之前的什么输入流,输出流,字节输入流,字符输入流,文件输入流,文件输出流balabala~~,子类太多就会很用臃肿,这个时候使用装饰者模式是很好的选择。
装饰者模式的意图:动态地给对象添加一些额外的职责。而且比生成子类更灵活。
其实作者并不懂--!上面都是瞎掰的
常见的编码
常见的编码有下面这几种
ISO8859-1
单字节编码,也就是说字符范围最多0-255,主要应用在英文中。
GBK/GBK2312
中文的国际编码,专门用来表示汉字,双字节编码,也就是说一个汉字两个字节。
UTF-8
一中长度可变的编码,每个字符长度1-6个字节不等,可以用来表示所有语言字符
乱码
说完编码,肯定会带来乱码的烦恼
那么造成乱码的根本原因就是:
1,程序使用的编码与本机的编码不统一
2,网络服务中,客户端与服务端编码不统一
NIO
新学一个New IO,貌似能提高效率。有优点就有缺点,NewIO以块的方式来处理IO,相比流来说更加复杂。
ByteBuffer
返回值 | 方法名 |
---|---|
static ByteBuffer | allocate(int capacity) 分配一个新的字节缓冲区 |
abstract ByteBuffer | put(byte b) 可以添加内容 |
重要参数 | 含义 |
---|---|
position | 位置 |
limit | 极限位置 |
capcacity | 容量 |