Java
1 java.io.File 文件系统管理
1)File类的用途:用于表示文件(目录),只用于表示文件(目录)的信息(名称、大小等)。不能对文件的内容进行访问。
File 代表文件系统中对文件/目录的管理操作(增删改查, CRUD)。
2 java.io.File 基本API
File(String)------->指定文件名的构造方法
long length()------->文件的长度
long lastModified()------>文件最后一次修改的时间
String getName()--------->返回由此抽象路径名表示的文件或者目录的名称
String getPath()----------->将此抽象路径名转换为一个路径名字符串
boolean exists()------------>检查文件或者目录是否存在
boolean dir.isFile()--------->检查是否是文件
boolean dir.isDirectory()----->检查是否是目录/文件夹
boolean mkdir()--------->创建一个目录(文件夹)
boolean mkdirs()--------->创建一系列目录(Test/sub/sub同时创建3个文件夹)
boolean delete()---------->删除此抽象路径名表示的文件或目录(如果此路径名表示一个目录,则该目录必须为空才能被删除)
boolean createNewFile() throw IOException-------->当且仅当不存在具有此抽象路径名指定名称的文件时,则不可分地创建一个新的空文件
File[] listFile()-------->返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
用法案例:
package io1;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class Demo2 {
public static void main(String[] args) throws IOException {
// File(文件)中常用的方法
File demo = new File("Demo");
if(!demo.exists()){
demo.mkdir();
}
File test = new File(demo,"test.txt");
if(!test.exists()){
test.createNewFile();
}
System.out.println(test.getName());
System.out.println(test.getParent());
//listFiles():把当前目录下面的所有文件取出来(列举出来)
File[] files =demo.listFiles();
System.out.println(Arrays.toString(files));
//将.txt结尾的文件拿出来
//FileFilter():接口里面包含accept(File aFile)---aFile是否
//满足条件,如果满足条件则把aFile放到数组当中,返回值是true,反之false
File[] files2 = demo.listFiles(new FileFilter(){//匿名内部类
public boolean accept(File aFile) {
System.out.println(aFile.getName());
return aFile.getName().endsWith(".txt") && aFile.isFile();
}
});
System.out.println(Arrays.toString(files2));
//用来做输出操作的循环语句,很简单,但是不够实用
//for(元素类型 元素名 :数组):把数组中的每个元素拿出来
for(File file : files){
System.out.println(file.getName());
}
System.out.println(test.lastModified());
System.out.println(new Date(test.lastModified()));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1 = sdf.format(new Date(test.lastModified()));
System.out.println(date1);
System.out.println(test.getPath());//相对路径
System.out.println(test.getCanonicalPath());//绝对路径
System.out.println(test.length());
System.out.println(test.canRead());//是否能读
System.out.println(test.canWrite());//是否能写
System.out.println(demo.isDirectory());//是否是目录
System.out.println(demo.delete());//目录是否可以删除
System.out.println(test.delete());//文件是否可以删除
}
}
3 回调模式和FIleFilter
File[ ] listFile(FileFileter)
4 RandomAccessFile 操作文件操作文件内容, 访问文件任意位置
1)Java 中的文件模型, 文件是byte by byte 数据的集合
data : 41 42 00 00 00 ff d6 d0 ...
index : 0 1 2 3 4 5 6 7 8
pointer: ^ 2)打开文件, 有两种模式 "rw", "r"
RandomAccessFile raf = new RandomAccessFile(file, "rw");
打开文件的时候文件指针默认指向开头 pointer=0
3)写入方法:raf.write(int) 将整数的"低八位"写入到文件中, 指针自动移动到下一个位置,准备再次写入
4)读取文件:int b= raf.read() 从文件中读取一个byte(8位)填充到int的低八位, 高24位为0,返回值范围正数: 0~255,
如果返回-1表示读取到了文件末尾! 每次读取后自动移动文件指针, 准备下次读取.
5) 文件读写完成以后一定关闭文件
6) 移位运算:>>> >> <<
移动数字
a >>> 无符号移位,就把数字向右移动,最左边用0补齐
0000 0010 >>> 1 -------> 0000 0001 向右移动一位除以2
b >> 数学移位,正数用0补齐,负数用1补齐
1111 1110 >> 1 --------> 1111 1111
<< 用0填充最后面的位置
1111 1110 << 1 --------> 1111 1100 向左移动一位乘以2
5 序列化与基本类型序列化
int -------------> 4 byte
long -----------> 8 byte
序列化: 将数据转换为 n个byte序列叫序列化: 数据 -------------> n byte
如:0x7fffffff -----------> [ 7f ff ff ff ]
反序列化: 将n byte 转换为一个数据的过程: n byte ---------------> 数据
如: [ 7f ff ff ff ] ------------> 0x7fffffff
RandomAccessFile 提供基本类型的读写方法,可以将基本类型序列化到文件和反序列化为数据
6 IO流 (InputStream, OutputStream)
InputStream, OutputStream 都是抽象类
InputStream 抽象了应用程序读取数据的方式
OutputStream 抽象类应用程序写出数据的方式
EOF = End of File = -1
输入流基本方法:
int b = in.read() 读取一个byte 无符号填充到int低八位,-1是EOF
in.read(byte[] buf) 读取数据填充到buf中
in.read(byte[] buf, int start, int size)读取数据填充到buf中
in.close();
输出流的基本方法:
out.write(int b) 写出一个byte到流 b的低八位写出到文件
out.write(byte[] buf) 将缓冲区buf都写入到流
out.write(byte[] buf, int start, int size)将buf的一部分写到流中.
out.flush() 清理缓冲
out.close();
文件输入流FileInputStream 继承了InputStream
FileInputStream 具体实现了在文件上读取数据
文件输出流FileOutputStream继承了OutputStream
FileOutputStream 具体实现了在往文件写入数据
用法案例:
package io1;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4 {
public static void main(String[] args) throws IOException {
//往文件中写入内容
//FileOutPutStream
//构造方法:FileOutputStream("文件的名字")----->如果文件不存在的话,会自动的创建一个新的文件
FileOutputStream fos = new FileOutputStream("src/test.txt");
// 写一个 -1 到文件中:11111111 11111111 11111111 11111111
int num = -1;
fos.write(num>>>24);
fos.write(num>>>16);
fos.write(num>>>8);
fos.write(num);
fos.write('A');
fos.write('B');
byte[] gbk = "王祖贤".getBytes("gbk");
fos.write(gbk);
fos.close();
print("src/test.txt");
}
public static void print(String fileName) throws IOException{
//从文件中读取内容:FileInputSteam
FileInputStream fis = new FileInputStream(fileName);
//把test中的所有内容全部读取出来,文件末尾EOF = -1
int b = 0;
while((b=fis.read())!=-1){
System.out.println(b);
}
}
}
7 DataOutputStream
DataOutputStream和DataInputStream是对“流”功能的扩展,可以更方便的读取int、long、字符等;类型的数据
DataOutputStream对基本的输出流功能的扩展,提供了基本数据类型的输出方法,也就是基本数据类型的序列化方法:
writeInt()
writeDouble()
writeUTF()
DataOutputStream可以理解为“过滤器”
DataOutputStream FileOutputStream
应用程序 ----------> 过滤器 ------------------> 输出流 ---------------> 文件(Byte)
writeInt(i) write() ff ff ff fd
DataOutputStream用法:
package myTest;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test3 {
public static void main(String[] args) throws IOException {
String file = "src/test.txt";
FileOutputStream fos = new FileOutputStream(file);
DataOutputStream dos = new DataOutputStream(fos);
//DataOutputStream 扩展了基本流fos的功能
dos.writeInt(5);
dos.writeInt(-5);
dos.writeLong(-5L);
dos.writeDouble(5.0);
dos.writeUTF("王祖贤");
dos.writeChars("刘德华");
dos.close();
IOUtils.printHex(file);
}
}
8 DataInputStream
DataInputStream是对基本输入流(InputStream)功能的扩展,它提供基本数据类型的输入方法,就是基本类型的反序列化。
DataInputStream 是过滤器,只是功能扩展,不能直接读取文件
DataInputStream提供的方法有:readInt() readDouble()........
FileInputStream DataInputStream
文件(Byte序列) ----------> 输入流 ------------------> 过滤器 --------------->应用程序
ff ff ff fd write() writeInt() 0x7fffffff
待续..................