【java EE 的读写 你懂了么】

(点击跳转即可哦)

java学习专栏

LeetCode刷题专栏


主要操作

  1. 构造方法使用
  2. createNewFile() 以节点为单位
  3. delete() 删除文件
  4. exists() 判断文件是否存在
  5. isDirectory() 文件存在 且 文件是文件夹
  6. isFile() 文件存在 且 文件是普通文件
  File file = new File("D:\\java\\javastudy\\Java_EE课堂代码\\test.txt");
  System.out.println(file.exists());  
  System.out.println(file.isDirectory());
  System.out.println(file.isFile());
  1. absolute path: 一般的绝对路径
  2. canonical path: 标准的绝对路径
  3. getName() 得到文件名
  4. getParent() 得到父目录
File file = new File("D:\\java\\.\\.\\\\\\javastudy\\Java_EE课堂代码\\test.txt");
//返回值都是 String 
System.out.println(file.getCanonicalPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getName());
System.out.println(file.getParent());

输出结果:
D:\java\javastudy\Java_EE课堂代码\test.txt
D:\java\.\.\javastudy\Java_EE课堂代码\test.txt
test.txt
D:\java\.\.\javastudy\Java_EE课堂代码
  1. lastModified() 得到该文件最后一次被修改的时间(以时间戳 timestamp形式表现)

  2. listRoots 返回一个 File[] 列出可用的文件系统根

  3. File[] listFiles[] 返回目录下的所有孩子

  4. boolean mkdir() 创建一个目录文件, 失败原因:文件已经存在,路径上的祖先不存在

  5. boolean mkdirs() 可以一并把路径中目前还不存在的目录都创建出来

  6. boolean renameTo(File dest) 文件的重命名


File 类常见方法总结

一、 构造方法 绝对路径 or 相对路径

二、 判断文件属性

  1. 是否存在 exists()
  2. 是否是目录 isDirectory()
  3. 是否是普通文件 isFile()

三、 获取文件标准路径

  1. getCanonicalPath() throws IOException

四、 对于文件树结构的修改

  1. 创建节点

​ 1)创建目录 mkdirs() 2) 创建普通文件 createNewFile()

  1. 删除结点 delete()
  2. 移动节点(重命名结点) renameTo()

五、针对目录,可以获取目录下的所有孩子文件

  1. listFiles() 如果对一棵树进行遍历(深度优先(更常见) or 广度优先)

JDK 中 只提供了针对结点的操作,没有提供针对一棵树的操作!!

一切针对树的操作,都需要我们自己写代码搞定!

delete() 是不进入回收站的删除,是真正的删除

删除目录:1. 通过遍历的方式,把这个目录变成空目录(递归把子孙全部删掉) 2. 删除这个空目录

windows 上的回收站是删除,实际上只是把文件剪切到一个固定目录


相对路径: 最基本的相对路径, 进程运行时的工作目录,JVM下,通常就是进程启动时的目录。


关于 内容 的读写

关于读取

  1. 直接读取(以二进制数据的方式读取,表现在代码中 byte 为 单位)
  2. 文本读取

步骤

  1. java.io.InputStream 输入流
  2. 本身是一个抽象类,真正使用过程中 要依赖这个抽象的具体实现子类 FileInputStream 关于文件的输入流
  3. 抽象模型 进行一个接水操作
  4. 关闭 is.close

注意:除了要接水之外,我们还需要一个明确的信号(说明肯定不会有新的数据了)

是 暂时没水了 还是以后永远没水了

EOS 在我们的代码中,使用-1 去表示

文本读取
abstract int read()

只接一滴水:返回的是下个字节的数据

当返回值是 EOS (-1) 的时候,表示,以后永远都没有水了

   public static void main(String[] args) throws Exception {
       InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt");
       while (true){
           int data = is.read();
           if(data == -1){
               //返回值为 -1 时,表示 所有的数据已经被读完了
               break;
           }
           //否则 data 就是我们取到的数据
           byte b = (byte) data;
           System.out.printf("%02x\n",b);
       }
       is.close();
   }
int read(byte[] b)

一次接很多水,需要提前准备好桶(byte[])

返回值,本次接到多少水, n >= 0 && n <= byte.length

当返回值是EOS (-1),表示 以后永远没有水了

   public static void main(String[] args) throws Exception {
       InputStream is = new FileInputStream("D:\\java\\javastudy\\Java_EE课堂代码\\test.txt");
       //准备的水桶
       byte[] buf = new byte[1024];
       //去接水, n <= 1024 && n >= 0
       //真正的数据放在 buf[]
       int n = is.read(buf);
       byte[] bytes = Arrays.copyOf(buf,n);
       for(byte b : bytes){
           System.out.printf("%02x\n",b);
       }
       is.close();
   }
//水桶的大小 小于 水龙头的容量
public static void main(String[] args) throws Exception {
   InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt");
   byte[] bur = new byte[2];
   while (true){
       int n = is.read(bur);
       if(n == -1){
           break;
       }
       // n == 0 只是本次没数据,以后还有
       // n == -1 本次没数据,以后也没数据了
       for(byte b: bur){
           System.out.printf("%02x\n",b);
       }
   }
   is.close();
}

try-with-resources语法

InputStream is = null;
try{
    is = ...;
}catch (SomeException e){
    ...
}finally{
    if(is != null){
        is.close();
    }
}

就等价于

*.java
    try(InputStream is = ...){//try(定义变量 = ...)
        ...
    }catch(SomeException e){
        ...
    }//编译的时候自动添加了 is.close()

直接读取(二进制读取)

如何利用InputStream 进行二进制数据的直接读取

1 一个字节 2 一次读取一批 3 EOS (-1)

public String (byte bytes[], int offset,int length,String charsetName)

offset: bytes 的开始下标

public Scanner(InputStream source,String charsetName)

System.in 的类型 就是一个InputStream

处理文本数据(字符数据)

ASCII、Unicode、UTF-8、GBK

字符集(char set)

字符编码规则(char encoding)

如果每个人都定义自己的字符集,实际上没有任何的意义,所以,总是有标准委员会来规定好 一个字符集,大家一起遵守!,所以才会有各种各样的标准字符集的出现

ASCII [0 - 128] 表示的范围有限,一个字节 ASCII是Unicode 的子集

Unicode [0,2^32] 一千万亿 4个字节 ,如果真的每个字都用4个字节,就会有很多空间浪费,就有了不同的编码规则。UTF-8 UTF-32 UTF-16

GB(国标)GB2312 GB18030 GBK 中文英文 都是 2个字节

UTF-8:变长的编码规则,一个字符占用的空间 1~4不等,ASCII 范围内的,还是1 个字节,中文的字 一般是 3个字节

    public static void main(String[] args) throws Exception{
        try (InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
            byte[] buf = new byte[1024];
            int n = is.read(buf);
            String s = new String(buf,0,n,"UTF-8");
            System.out.println(s);
        }
    }

    public static void main1(String[] args) throws Exception{
        try(InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
            try (Scanner sc = new Scanner(is,"UTF-8")){
                while (sc.hasNextLine()){
                    String line = sc.nextLine();
                    System.out.println("|" + line +"|");
                }
            }
        }
    }

写 (OutputStream)

内存的写速度 远远快于 硬盘的写速度的,所以,为了平衡这个速度之差,一般通过“缓冲区 buffer”来处理

  1. 缓冲区满了 或者达到一定阈值
  2. 时间过了一段时间了
  3. 进程主动刷盘 关闭之前,统一做一次手动刷盘
OutputStream os = new FileOutputStream(./test.test);

如果文件之前不存在,则会进行创建(创建可能会失败,1 权限 2 路径上的目录不存在)

如果文件之前存在,会清空之前的文件内容,重新写入

public static void main(String[] args) throws Exception{
    try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
        os.write(0x20);  //空格
        os.write(0x0d);     // '\r'
        os.write(0x0a);     //'\n'

        os.write(0x65);
        os.write(0x65);
        os.write(0x65);
        //确保把缓冲区内可能遗留的数据全部写入 Output 设备中
        os.flush();
    }
}
public static void main(String[] args) throws Exception{
    try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
        byte[] buf = {0x65, 0x65, 0x20, 0x65, 0x0d, 0x0a, 0x65};
        os.write(buf);
        os.flush();
    }
}

Writer 抽象类 OutputStreamWriter 实现类

public static void main(String[] args) throws Exception{
    try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
        try(Writer writer = new OutputStreamWriter(os,"UTF-8")){
            writer.write("爱好\r\n");
            writer.write("单位");
            writer.flush();
        }
    }
}
public static void main(String[] args) throws Exception{
    try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
        try(Writer writer = new OutputStreamWriter(os,"UTF-8")){
            try(PrintWriter printWriter = new PrintWriter(writer)){

                printWriter.println("将飞机往返");
                printWriter.print(222);
                printWriter.flush();
            }
        }
    }
}

小结

InputStream 输入流, 背后就是输入设备(模拟的输入设备)

  1. read() / read(byte[])
  2. EOS(-1)
  3. Scanner(is,“UTF-8”)

OutputStream 输入流,背后就是输出设备(模拟的输出设备)

  1. write(int) / write(byte[])
  2. flush() 缓存区 (buffer) 平衡写入次数
  3. OutputStreamWriter(做字符集编码处理) + PrintWriter(使用我们熟悉的 print/println/printf)

要是对大家有所帮助的话,请帮我点个赞吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值