java基础第十六天 IO

1、File类

File类是对文件操作的类,是文件和目录路径名的抽象表示形式,能够创建文件(目录),删除文件(目录),重命名文件(目录)

注意:
删除目录的时候,如果目录有文件,不能完成删除,必须先把文件删除了,才能删除该目录。
删除是直接删除,不进回收站

特点:
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身
只有IO流才能访问文件的内容
File对象可以作为参数传递给IO流的构造函数

File类的常见构造方法:

public File(String pathname)
以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
    绝对路径:window下据对路径带盘符,linux下带根目录/
    相对路径:相对当前位置的路径 

public File(String parent,String child)
以parent为父路径,child为子路径创建File对象

文件操作相关

createNewFile() 创建新文件
delete() 删除文件

访问文件名:

getName() //能够得到文件名
getPath() //得到文件的路径+文件名
getAbsoluteFile() //得到绝对路径,返回File对象,可以继续操作文件
getAbsolutePath() //得到绝对路径,返回字符串
getParent() //得到文件的路径
renameTo(File newName) //文件重命名

文件检测

exists() //判断文件是否存在
canWrite() //判断文件是否可写
canRead() //判断文件是否可读
isFile() //判断是否一个文件
isDirectory() //判断是否一个目录

获取常规文件信息

lastModified()  //最后一次修改时间
length() //文件的长度

目录操作相关

mkDir()  //创建目录
mkDirs() //创建多级目录
list() //列出目录下的文件
listFiles() //列出目录下的文件对象

2、递归

方法递归:

1、方法调用本身
2、递归调用要有出口,否则就是死循环

/**
 * 求出10的阶乘  
 *  10*9*8*7*6*5*4*3*2*1
 * 
 * 注意递归得有出口:
 *      出口条件是:a==1
 * 
 * @author Administrator
 *
 */
public class DiGui02 {


    public static void main(String[] args) {
        System.out.println(mul(10));
    }


    public static int mul(int a){

        if(a==1){
            return 1;
        }
        else{
            return a*mul(a-1);
        }
    }
}

案例:递归删除某个目录下所有的txt文件,包含子目录

/**
 *  需求:
 *  删除桌面目录abc下所有目录的txt文件
 * 
 * 
 * @author Administrator
 *
 */
public class FileTest02 {


    public static void main(String[] args) {

        File file=new File("C:\\Users\\Administrator\\Desktop\\abc\\");
        FileTest02.delFileTxt(file);
    }

    public static void delFileTxt(File f){
        File[] files=f.listFiles();
        for (File file2 : files) {
            if(file2.isDirectory()){
                delFileTxt(file2);
            }else{
                if(file2.getPath().endsWith(".txt")){
                    file2.delete();
                }
            }
        }
    }
}

3、IO

IO:输入输出流

四大基类:Reader,Writer,InputStream,OutputStream

分类:

流向不同:
    输入流
        InputStream
        Reader

    输出流
        OutputStream
        Writer
按类型不同
    字节流
        InputStream
        OutputStream
    字符流 
        Reader
        Writer

JAVA中流操作基本上都是派生自以上四个基类,命名规则基本上如下:

    XXXXReader
    XXXXWriter
    XXXXInputStream
    XXXXOutputStream

备注:

对于文本文件,应使用字符Reader、Writer流
对于二进制文件,应使用字节InputStream、OutputStream流

3.1 FileInputStream

字节输入流InputStream常用方法:

 int read() //读取一个字节
 int read(byte[] b) //一次性读多个字节到缓冲区数组
 int read(byte[] b, int off, int len)

代码示例:

/*
 * 读入数据步骤:
 * 1、使用文件输入流打开指定文件
 *  对于文本文件,应使用字符输入流FileReader流
 *  对于二进制文件,应使用字节输入流FileInputStream流
 * 2、读取文件数据
 * 3、关闭输入流
 * 
 */
InputStream inputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次读一个字节
int read=0;
while((read = inputStream.read()) !=-1){
    System.out.print((char)(read));
}
inputStream.close();

System.out.println();
inputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//解决一次读一个字节中文乱码的方法
byte[] byte1 = new byte[inputStream.available()];
for (int i = 0; (read = inputStream.read()) !=-1;i++ ) {
    byte1[i]=(byte)read;
}
System.out.println(new String(byte1));

System.out.println();
inputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次读一个缓冲区
byte[] b=new byte[4096];
while((read=inputStream.read(b)) != -1){
    System.out.println(new String(b, 0, read));
}

3.2 FileOutputStream

字节输出流OutputStream常用方法:

 void write(int b);// 向流中写一个字节
 void write(byte[] b);//向流中写一个数组
 void write(byte[] b, int offset, int length);
 void flush(); //把数据从OS缓冲区刷入硬盘
 void close(); 需要先刷新,再关闭此流

常用实现类:FileOutputStream

 换行
    windown \r\n
    linux \n
    通常情况下只需要\n即可换行

 内容追加
    new FileOutputStream(String path, boolean append)
        append true表示向文件追加内容
        不写或者false,覆盖源文件的内容

代码实例:

OutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次写一个字节
out.write(97);
out.write(98);
out.write(99);
out.write(100);
out.close();


out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//按缓冲区来写
//换行
//  windown \r\n
//  linux \n
//  通常情况下只需要\n即可换行
out.write("中国足球队真没就了\r\n".getBytes());
out.write("就是穆里尼奥来了都不行\r\n".getBytes());
out.close();

3.3 FileReader

字符输入流:Reader

 int read() // 读取一个字符
 int read(char [] c) //一次性读多个字符到缓冲区数组
 int read(char [] c, int off, int len)

常用实现类:FileReader

代码示例:

Reader reader = new FileReader("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次对一个字符
int r=0;
while((r=reader.read()) != -1){
    System.out.print((char)r);
}

System.out.println();
reader = new FileReader("C:\\Users\\Administrator\\Desktop\\abc.txt");
//按缓冲区来读
char[] c=new char[4096];
while((r=reader.read(c)) != -1){
    System.out.print(new String(c,0,r));
}

3.4 FileWriter

字符输出流:Writer

 void write(int c);// 向流中写一个字节/字符
 void write(char[] cbuf);//向流中写一个数组
 void write(char[] buff, int offset, int length);
 void flush(); //把数据从OS缓冲区刷入硬盘
 void close(); 需要先刷新,再关闭此流

常用实现类:FileWriter

 因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数
 void write(String str);
 void write(String str, int off, int len);

换行

windown \r\n
linux \n
通常情况下只需要\n即可换行

内容追加

new FileWriter(String path, boolean append)
    append true表示向文件追加内容
    不写或者false,覆盖源文件的内容 

代码示例:

FileWriter writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次写一个字符
writer.write(97);
writer.write(98);
writer.write(99);
writer.write(100);
writer.flush();
writer.close();


//一次写一个缓冲区
writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\abc.txt",true);
char[] c= {'我','爱','你','中','国'};
writer.write(c);
writer.flush();
writer.close();

//一次写一个字符串
writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\abc.txt",true);
writer.write("我们都是中国人....\r\n");
writer.write("我们都是中国人....\r\n");
writer.write("我们都是中国人....\r\n");
writer.flush();
writer.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值