文件操作和IO

目录

认识文件

树型组织和目录

文件路径

文本划分

文件权限

文件分割符

Java中的文件操作

属性

构造函数

方法

使用

创建一个文件

创建目录

获取下一级子文件或目录

获取文件信息

获取目录下所有的文件或目录

重命名

文件内容的读写(数据流)

关于io操作

InputStream

FileInputStream

文件读取

文件读取2

字符输入流读取文件

OutputStream

FileOutputStream

字节流写文件

字节流复制文件

字符流写文件


认识文件

文件包含数据内容本身+metadata(文件的头信息,即文件名,修改时间,文件大小等)

树型组织和目录

多子树

文件路径

绝对路径:从根节点到叶子节点的整个路径(windows是从各个磁盘开始)

C:\Go\bin\go.exe

相对路径:从任意一个节点出发,到目的节点

../上一级

./当前目录

从:C:\Go\bin\go.exe

到:C:\Java\jdk1.8.0_192

../../Java\jdk1.8.0_192(从当前文件夹出发,如果是文件,则从当前.exe文件的上一级的文件夹出发)

文本划分

文本类型、二进制类型

打开文本,需要指定的编码格式,保存和打开的时候编码格式要一致,否则就是乱码

文件权限

读、写、执行

文件分割符

windows是\,linux是

但是很多工具,比如java中,写/和\都可以,因为某些工具,java程序会自动转为系统的文件分隔符

Java中的文件操作

java.io.File

属性

构造函数

注意:File f = new File("C:/xxx") 不存在的路径的话,这个File对象还是实例化了,只是不存在(可以通过一个方法来判断)

方法

使用

创建一个文件

package File操作;

import java.io.File;
import java.io.IOException;

public class 创建一个文件 {

    public static void main(String[] args) throws IOException {
        File f = new File("C:/Test/1.txt");
        if(!f.exists()){
            f.createNewFile();
        }
    }
}

创建目录

package File操作;

import java.io.File;

public class 创建目录 {

    public static void main(String[] args) {
        //创建一级目录
        File f = new File("C:/Test/1");
//        if(!f.exists()){
            f.mkdir();//如果存在也不会保存
//        }

        //创建多级目录
        File f2 = new File("C:/Test/2/3/4");
        f2.mkdirs();
    }
}

获取下一级子文件或目录

package File操作;

import java.io.File;
import java.util.Arrays;

public class 获取下一级子文件或目录 {
    public static void main(String[] args) {
        File f = new File("C:/Test/2");
        File[] children = f.listFiles();
        System.out.println(Arrays.toString(children));
    }
}

获取文件信息

package File操作;

import java.io.File;
import java.util.Date;

public class 获取文件信息 {

    public static void main(String[] args) {
        File f = new File("E:/Test/1.txt");
        System.out.println("path: "+f.getPath());
        System.out.println("name: "+f.getName());
        //返回文件的大小(字节数)
        System.out.println("length: "+f.length());
        //返回上次修改时间:返回一个Long,可以转换为时间
        System.out.println("last modified: "+f.lastModified());
        System.out.println("last modified => Date: "+new Date(f.lastModified()));
        System.out.println("isFile: "+f.isFile());
        System.out.println("isDirectory: "+f.isDirectory());
    }
}

获取目录下所有的文件或目录

package File操作;

import java.io.File;

public class 获取目录下所有的文件或目录 {

    //递归遍历
    public static void main(String[] args) {
        File f = new File("C:/Test/2");
        list(f);
    }

    private static void list(File f){
        //不管是文件还是目录,都打印(需求)
        System.out.println(f);
        //如果是目录,还需要查找子文件/目录
        if(f.isDirectory()){
            //子文件/目录,不包含孙子
            File[] children = f.listFiles();
            //再次递归
            for(File child : children){
                list(child);
            }
        }
    }
}

重命名

package File操作;

import java.io.File;

public class 重命名 {
    public static void main(String[] args) {

        //重命名
//        File f = new File("C:/Test/1.txt");
//        f.renameTo(new File("C:/Test/1_rename.txt"));

        //移动
//        File f = new File("E:C:/Test/1_rename.txt");
//        f.renameTo(new File("C:/Test/10/1_rename.txt"));

        //删除文件
//        File f = new File("C:/Test/10/1_rename.txt");
//        f.delete();

        //删除目录:目录下没有东西才可以删
        //所以:如果删除有东西的目录:要一个一个遍历,依次删除
        File f = new File("C:/Test/1");
        f.delete();
    }
}

文件内容的读写(数据流)

关于io操作

将一个设备传输到另一个设备就是io操作,i是input,o是output

io不同的类型:

(1)文件io

(2)网络io

InputStream

FileInputStream

构造方法

如果利用try(创建io流),再try结束,会自动关闭流

文件读取

package io操作;

import java.io.FileInputStream;
import java.io.IOException;

public class 文件读取 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:/Test/1.txt");
//        FileInputStream fis = new FileInputStream(new File("C:/Test/1.txt"));

        byte[] bytes = new byte[fis.available()];
        int b;
        //不停的读,一直读到输入流结束(文件结束)

        for(int i=0; (b = fis.read()) != -1; i++){
            bytes[i] = (byte) b;
        }
        System.out.println(new String(bytes, "UTF-8"));
    }
}

文件读取2

package io操作;

import java.io.FileInputStream;
import java.io.IOException;

public class 文件读取2 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:/Test/1.txt");
//        FileInputStream fis = new FileInputStream(new File("C:/Test/1.txt"));
        //先准备一个字节数组,用来保存每次读取的数据
        byte[] bytes = new byte[1024];
        //每次读取的长度
        int len;
        //不停的读,一直读到输入流结束(文件结束)
        while((len = fis.read(bytes)) != -1){
            //此时,字节数组中,0~len范围,就是读取的数据
            //二进制数据转为字符串,需要和保存时的编码格式一致
            //String的构造方法,把字节数组,从offset(偏移量)的位置,读取len个长度
            //也就是,将 offset 到 offset+len 范围的字节数据,转为字符串
            String s = new String(bytes, 0, len, "UTF-8");
            System.out.println(s);
        }
    }
}

字符输入流读取文件

package io操作;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class 字符输入流读取文件 {

    public static void main(String[] args) throws IOException {
        //使用的比较多的是BufferedReader => 读文本文件,且效率比较高
        //先获取一个字节流
        FileInputStream fis = new FileInputStream("C:/Test/1.txt");
        //在包装为一个字节字符转换流
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        //再包装为字符流
        BufferedReader br = new BufferedReader(isr);
        String line;
        //读取一行,如果没结束,就一直读
        while((line=br.readLine()) != null){
            System.out.println(line);
        }
    }
}

OutputStream

FileOutputStream

构造方法

注意:输出流,写了数据,如果这个输出流对象,有flush,记得调用一下,表示刷新缓冲区,进入硬盘

字节流写文件

package io操作;

import java.io.FileOutputStream;
import java.io.IOException;

public class 字节流写文件 {

    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("C:/Test/1.txt");
        String s = "写文件操作";
        fos.write(s.getBytes("UTF-8"));
        fos.close();
    }
}

字节流复制文件

package io操作;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class 字节流复制文件 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:/Test/1.txt");
        FileOutputStream fos = new FileOutputStream("C:/1_copy.txt");
        byte[] bytes = new byte[1024*8];
        int len;
        while((len=fis.read(bytes))!=-1){
            //字节数组中0~len范围是读取的数据,就同时往输出流写数据
            fos.write(bytes, 0, len);
            fos.flush();
        }
        fos.close();
        fis.close();
    }
}

字符流写文件

package io操作;

import java.io.*;

public class 字符流写文件 {

    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
        //先获取一个字节输出流
        FileOutputStream fos = new FileOutputStream("C:/Test/1.txt");
        //在包装为一个字节字符转换流
        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
        //在包装为一个字符输出流
//    BufferedWriter bw = new BufferedWriter(osw);
        PrintWriter pw = new PrintWriter(osw);

        //这些字符输出流的api,写文本内容,就比较方便
        pw.print("哈哈");//不带换行的输出
        pw.println("学习");//带换行
        pw.flush();
        pw.close();
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值