一些常识
硬盘特点
擅长顺序读,不擅长随机读,尤其是机械硬盘。
随机读例如某个目录中的所有小文件的复制,顺序读是某个大文件的整体复制。
windows的文件系统是按照“树形结构”来组织文件。
路径的风格
1.绝对路径:从根节点出发,一层一层最终到达目标文件。
2.相对路径:从当前目录出发,找到目标文件,在IDEA中使用时可以用“.”来代替当前目录。也可以使用“..”来回退至上一层。
“/”与“\”的问题
首先“/”为正统写法,而“\”则是Windows的前身DOS提出的,所以windows额外支持“\”。还是推荐使用“/”。
文件的分类
文本文件:储存的文件在指定码表上都有据可查,都为合法的字符。
二进制文件:任意的二进制数字,不一定合法。
判断方法:可以使用记事本打开,为乱码的是二进制文件。
文本文件
二进制文件
Java中对文件操作的API
一、File类
所在包:java.io;
构造方法:File file = new File(“文件路径/绝对路径”);
file.getPath():获取文件路径
file.getAbsolutePath():获取文件绝对路径。
file.createNewFile():创建文件。
file.delete():删除文件。
file.exists(): 判断文件是否存在。
file.deleteOnExit():在退出时删除文件。
file.renameTo(file2):将文件重命名为file2。
File file = new File("./src/text2.txt");
file.createNewFile();
file.delete();
二、InputStream与OutputStream
1.InputStream t1 = new FileInputStream("文件路径");
FileInputStream为InputStream的子类。
方法:t1.read();
版本1:每次只读一个字符并返回这个字符的值(ASCII值),而且读到最后会返回-1.
版本2:可以先创建一个空的byte字符数组,当执行完成后字符数组中便传入了文件的内容(ASCII,可以使用char进行强转)。
版本3:在版本2的基础上增加了开始位置off和读入的字符长度len。
为了避免浪费过多的文件描述符表中的位置,每次使用后需要使用t1.close(),为了方便,可以使用try(nputStream t1 = new FileInputStream("文件路径")){
};
这样在执行完{
}里的内容后,IDEA会自动调动t1.close()。
try(InputStream t1 = new FileInputStream("./src/text.txt")){
int len = t1.read(buffer);
for (int i = 0; i < len; i++) {
System.out.print((char) buffer[i]+" ");
}
}
2.OutputStream t2 = new FileOutputStream(“文件路径”);
方法:t2.write();
版本1:一次写一个ASCII值。
版本2:写整个数组。
版本3:写数组的一部分(从off位置开始,写len个字符)。
注意:每次写入会清空原先的内容,可以使用追加来避免:
OutputStream t2 = new FileOutputStream("./src/text.txt",true);
即在末尾加个true。
三、Reader和Writer
1.Reader r = new FileReader(“文件路径”);
方法:
版本1:一次读一个字符。读到末尾返回-1.
版本2:将文件中的内容读到cbuf中去。
版本3:使用了封装了的char数组,
版本4:和前面的类似。
在显示cbuf中的内容时,可以使用String(cbuf,0,n);
n为有效的字符的下标,不然它会将所有的内容打印出来,包含未初始化的部分。
为什么推荐这个方法:在读文件时,如果碰到中文等utf8字符时,使用一次读一个字符的方法,会将utf8转化为unicode来打印,但是由于utf8为三个字节,char为两个字节,所以并不能打印,但是String(cbuf,0,n)可以将unicode转化为utf8.
char[] cbuffer = new char[100];
Reader r = new FileReader("./src/text.txt");
r.read(cbuffer);
System.out.println(new String(cbuffer,0,8));
2.Write w = new FileWrite("文件路径");
方法:w.write();
五个版本,但是主要使用w.write(String str)来使用字符串输入。
在写入时也会清除原本的内容,但是也可以使用末尾加true来进行追加。
Writer w = new FileWriter("./src/text.txt",true);
w.write("Hello World");
w.close();
四、Scanner辅助读文件
方法:
Scanner in = new Scanner(new FileInputStream("./src/text.txt")); while (in.hasNextLine()) { String line = in.nextLine(); System.out.println(line); }