Java从小白到大佬(File文件类以及IO流)
1.File类
1.1.什么是File文件类?
在文件系统中,每一个文件都存放在一个目录下。
File.separator 文件路径分隔符 / File.pathSeparator 文件分割符;
1.1.1.绝对路径
是由文件名和他的完整路径以及驱动器字母组成。例如:C:\Administrator\Desktop\hello.java
1.1.2.相对路径
相对于当前工作目录的。
1.2.关联文件
File file=new File(“C:\Users\Administrator\Desktop\hello.txt”);//后缀名与创建的文件无关
File file=new File(String parent,String child); 在父文件下面创建子文件 string后面是路径
File file=new File(uri); uri:统一资源定位符 类似于网址的东西
1.3.操作文件的常用指令
1.file.creatNewFile();创建该对象文件指令 有返回值 返回Boolean
2.file.mkdir()/file.mkdirs();创建文件夹 有返回值,返回Boolean
3.file.delete();删除文件或目录 有返回值,返回boolean 删除多级目录时每次只能删最后面的文件夹 当目录中有文件的时候无法直接删除该目录
4.file.renameTo():重命名 file.renameTo() 同目录下为更名,不同目录下为剪切
1.4.文件列表List
在关联文件之后需要对所关联的文件进行操作。
File file=new File("C:\\Administrator\\Desktop");
File [] files=file.listFile();//可以显示当前目录中所有文件返回的是File数组
1.4.1.获取当前目录下的文件
File file=new File("C:\\Administrator\\Desktop");
File [] files=file.listFile();
for(String string : files){
System.out.println(String);
}
1.4.2.获取当前目录下的文件(包括下级目录里面的文件)
String path="C:\\Users\\Administrator\\Desktop";
File file=new File(path,"hello.java");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
public static void showList(File file,int level) {
File [] filename=file.listFiles();
if(filename==null) {
return;
}
for (File file2 : filename) {
if(file2.isFile()) {
System.out.println(level+" : "+file2.getAbsolutePath());
}else {
showList(file2,level+1); //递归调用
}
}
}
1.4.3.获取以指定后缀名结尾的文件
1.4.3.1.普通查找(只能查找处当前目录里符合要求的文件)
String path="C:\\Users\\Administrator\\Desktop";
File file=new File(path);
String [] folder=file.list();
//1.普通查找
for (String string : folder) {
if(string.endsWith(".png")) {
System.out.println(string);
}
}
1.4.3.2.递归查找(可以查找出该目录下所有符合要求的文件)
String path="C:\\Users\\Administrator\\Desktop";
File file=new File(path);
private static void Recursive(File file) {
File [] file1=file.listFiles();
if(file1==null) {
return;
}
for (File file2 : file1) {
if(file2.isFile()) {
if(file2.getName().endsWith(".png")) {
System.out.println(file2.getName());
}
}else {
Recursive(file2);
}
}
}
1.4.3.3.过滤器查找(普通查和递归查的融合,在找的时候进行筛选,降低时间复杂度,但是也只是查找当前目录)
String [] name2=file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".png");
}
});
for (String string : name2) {
System.out.println(string);
}
}
1.4.3.4.利用递归思想对链栈进行尾插法
main(){
}
class Link{
Node head;
public Link(){
head.e=0;
head.next=null;
}
public void add(int e){
Node p=head;
add2(p,e);
}
public void add2(Node p,int e){
if(p.next==null){
Node n=new Node();
n.e=e;
p.next=n;
n.next=null;
}else{
add2(p.next,e);
}
}
public void print(){
print(head);
}
private void print(Node p){
if(p.next!=null){
System.out.println(p.next.e);
print(p.next);
}else{
System.out.println(p.e);
}
}
}
class Node{
int e;
Node next;
}
1.4.4.过滤器
由于过滤器只使用一次 所以可以通过使用匿名实现子类的匿名对象来解决。
public String[] list(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
FileFilter 是一个比FilenameFilter更高级的接口 原因是filter可以return更多的东西
2.IO流
2.1.简介IO及分类
为了对文件内容与操作
IO流:
按照流向分为:输入流 输出流
按照类型分 :字节流 字符流(字节流+码表) 字符流的本质就是字节流
2.2.IO流的四大基类
1.FileInputStream 字节输入流
2.FileOutputStream 字节输出流
3.Reader 字符输入流
4.writer 字符输出流
2.3.FileInputStream 字节输入流
此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。
2.3.1.创建字节输入流
法1)File file=new File("C:\\Administrrtor\\Desktop\\hello.txt");
FileInputStream fis=new FileInputStream(file);
法2)FileInputStream fis=new FileInputStream("C:\\Administrrtor\\Desktop\\hello.txt");
2.3.2.read()函数
2.3.2.1.read();
file.read() 从此输入流中读取一个数据字节。如果已到达文件末尾,则返回 -1(迭代步骤当第一个字节读取完之后会自动读向下一个字节)
void Demo(){
File file=new File("C:\\Administrrtor\\Desktop\\hello.txt");
FileInputStream fis=new FileInputStream(file);
int ch=0;
while((ch=fis.read())!=1){
System.out.println(ch);//输出读取的字节码
}
fis.close();
}
2.3.2.2.read(byte[]);
由于一个字节一个字节的读取文件速度过慢,所以read还有一个带参的方法用来读取文件
private static void test3() throws IOException {
File file=new File("Hello.txt");
FileInputStream fis=new FileInputStream(file);
byte [] buf=new byte[6];
int len=0;
while((len=fis.read(buf))!=-1) {
System.out.println(len);//输出的是读取的有效字节码长度
System.out.println(new String(buf,0,len));//将字节码用字符串输出
}
fis.close();
}
2.3.2.3.读取整个文件:while循环+read()
2.4.FileOutputStream 字节输出流
此抽象类是表示字节输入流的所有类的超类。字节输出流和字节输入流大致相同。
2.4.2.write()方法
在字节输入流中read()是用来读取文件,则输出流中的write()是用来输入文件内容。
2.4.3.复制文本
2.4.3.1.复制文件
1.确定源文件和目标文件
2.确定输入流和输出流
一个字节一个字节的读 效率低
读数组 效率高
public class FileCopy {
public static void main(String[] args) throws IOException {
String path1="C:\\Users\\Administrator\\Desktop\\IO.txt";
String path2="C:\\Users\\Administrator\\Desktop\\tu.txt";
File from =new File(path1);//源文件
File to =new File(path2);//目标文件
copy(from,to);
}
private void copy(File from,File to){
File [] file=from.listFiles();
if(file==null) {
return;
}
for (File file3 : file) {
if(file3.isFile()) {
copyFile(file3,to);
}else {
copy(file3,to);
}
}
private void copyFile(File from,File to){
File aimFile=new File(to,file.getName());
aimFile.createNewFile();
FileInputStream fis=new FileInputStream(file);
FileOutputStream fos=new FileOutputStream(aimFile);
byte[]buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1) {
fis.write(buf, 0, len);
}
fis.close();
fos.close();
System.out.println(aimFile+" is copy over");
}
}
}
2.4.3.2.复制目录
复制目录:
1.将源文件与目标文件关联
2.判断目标文件是否存在如果不存在则创建目标文件目录
3.遍历源文件
3.1.如果isFile(),则复制文件到目标文件
3.2.如果isFile()==false,则重新遍历
4.直到文件全部复制完成
public class FileCopy {
public static void main(String[] args) throws IOException {
String path1="C:\\Users\\Administrator\\Desktop\\IO";
String path2="C:\\Users\\Administrator\\Desktop\\tu";
File from =new File(path1);//源文件
File to =new File(path2);//目标文件
if(!to.exists()) {
to.mkdir();
}
copy(from,to);
}
private static void copy(File from,File to) throws IOException {
File [] file=from.listFiles();
if(file==null) {
return;
}
for (File file3 : file) {
if(file3.isFile()) {
copyFile(file3,to);
}else {
File newFolder=creatFolder(to,file3.getName());
copy(file3,newFolder);
}
}
}
private static File creatFolder(File to, String name) {
File folder=new File(to,name);
if(!folder.exists()) {
folder.mkdir();
}
return folder;
}
private static void copyFile(File file, File to) throws IOException {
File aimFile=new File(to,file.getName());
aimFile.createNewFile();
FileInputStream fis=new FileInputStream(file);
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream(aimFile);
BufferedOutputStream bos=new BufferedOutputStream(fos);
byte[]buf=new byte[1024];
int len=0;
while((len=bis.read(buf))!=-1) {
bos.write(buf, 0, len);
}
bos.flush();
bis.close();
bos.close();
System.out.println(aimFile+" is copy over");
}
}
2.5.Reader字符输入流与writer 字符输出流
2.5.1.缓冲流:提高效率(在字节流的基础上)
BufferedInputStream bis=new BufferedInputStream(fis);字节输入缓冲流
BufferedOutputStream bos=new BufferInputStream(fos); 字节输出缓冲流
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
在字节流的基础上加入缓冲流:
private static void copyFile(File file, File to) throws IOException {
File aimFile=new File(to,file.getName());
aimFile.createNewFile();
//输入缓冲
FileInputStream fis=new FileInputStream(file);
BufferedInputStream bis=new BufferedInputStream(fis);
//输出缓冲
FileOutputStream fos=new FileOutputStream(aimFile);
BufferedOutputStream bos=new BufferedOutputStream(fos);
byte[]buf=new byte[1024];
int len=0;
while((len=bis.read(buf))!=-1) {
bos.write(buf, 0, len);
}
bos.flush();
bis.close();
bos.close();
System.out.println(aimFile+" is copy over");
}
2.5.2.转换流:将字节流转换成字符流 (进出内存都只能以字节形似存在)可以指定输入/输出的码表
在字节流的基础上进行。
InputStreamReader isr=new InputStreamReader(new FileInputStream(from));/(new FileInputStreamRead(from),"GBK")
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(to));/(new FileOutputStreamWrite(to),"UTF-8")
返回的是字符串char[]