当前位置: 首页 > article >正文

File和InputStream,OutputStream

目录

认识⽂件

树型结构组织 和 ⽬录

⽂件路径(Path)

文件的种类

File类

属性

构造方法

方法

代码示例

文件内容的读写——数据流

java中提供了一组类表示流

1.字节流

2.字符流

InputStream概述

方法

说明

FileInputStream概述

构造方法

OutputStream概述

方法

说明


认识⽂件
我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时, 往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概 念,就类似办公桌上的⼀份份真实的⽂件⼀般。

狭义的文件=》保持在硬盘上的文件

广义的文件=》操作系统进行资源管理的一种机制,很多软件/硬件资源抽象成”文件来表示


通俗的说文件夹是文件,专业上来说是目录

树型结构组织 和 ⽬录
同时,随着⽂件越来越多,对⽂件的系统管理也被提上了⽇程,如何进⾏⽂件的组织呢,⼀种合乎⾃ 然的想法出现了,就是按照层级结构进⾏组织⸺也就是我们数据结构中学习过的树形结构。这样, ⼀种专⻔⽤来存放管理信息的特殊⽂件诞⽣了,也就是我们平时所谓⽂件夹(folder)或者⽬录
(directory)的概念。
计算机中目录套目录构成了树形结构

从树根开始到最终的文件中间需要经过哪些目录,把这些目录记录下来就构成“路径”

一般使用/来分割路径中的多级目录

⽂件路径(Path)
如何在⽂件系统中如何定位我们的⼀个唯⼀的⽂件就成为当前要解决的问题,但这难不倒计算机科学 家,因为从树型结构的⻆度来看,树中的每个结点都可以被⼀条从根开始,⼀直到达的结点的路径所 描述,⽽这种描述⽅式就被称为⽂件的绝对路径(absolute path)
除了可以从根开始进⾏路径的描述,我们可以从任意结点出发,进⾏路径的描述,⽽这种描述⽅式就 被称为相对路径(relative path),相对于当前所在结点的⼀条路径
相对路径需要明确一个基准路径
1.在idea中直接运行,基准路径就是项目路径
2.打一个jar包,单独运行jar包
当前在哪个目录下执行运行命令
基准目录就是哪个目录

文件的种类

从 开发角度把文件分成两类

1.文本文件

2.二进制文件

即使是普通⽂件,根据其保存数据的不同,也经常被分为不同的类型,我们⼀般简单的划分为⽂本⽂ 件和⼆进制⽂件,分别指代保存被字符集编码的⽂本和按照标准格式保存的⾮被字符集编码过的⽂ 件

最后,很多操作系统为了实现接⼝的统⼀性,将所有的 I/O 设备都抽象成了⽂件的概念,使⽤这⼀理念 最为知名的就是 Unix、Linux 操作系统⸺万物皆⽂件。

Java标准库提供了一系列的类操作文件

1.文件系统操作

创建文件,删除文件,重命名,创建目录

2.文件内容操作

针对一个文件的内容进行读和写


File类

File用于操作文件系统

属性

构造方法

参数String文件的路径使用绝对路径/相对路径均可

方法


代码示例
import java.io.File;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("./teat.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }
}
import java.io.File;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        file.createNewFile();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
    }
}
import java.io.File;
import java.io.IOException;
public class Main {
   public static void main(String[] args) throws IOException {
      File file = new File("some-file.txt"); // 要求该⽂件不存在,才能看到相
      System.out.println(file.exists());
      System.out.println(file.createNewFile());
      System.out.println(file.exists());
      System.out.println(file.delete());
      System.out.println(file.exists());
   }
}
import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("some-file.txt"); // 要求 some-file.txt 得存在
        File dest = new File("dest.txt"); // 要求 dest.txt 不存在
        System.out.println(file.exists());
        System.out.println(dest.exists());
        System.out.println(file.renameTo(dest));
        System.out.println(file.exists());
        System.out.println(dest.exists());
   }
}
import java.io.File;
import java.util.Arrays;

public class Demo4 {
    public static void main(String[] args) {
        File file = new File("./");
        String[] list = file.list();
        System.out.println(Arrays.toString(list));
    }
}

文件内容的读写——数据流

java中针对文件内容的操作

主要是通过一组“流对象”来实现的

计算机中的“流”和水流非常相似

因此,计算机中针对读写文件,也是使用流(Stream)词

流是操作系统层面的术语,和语言无关

各种编程语言操作文件都叫流


java中提供了一组类表示流

分成两个大类别

1.字节流

读写文件,以字节为单位

是针对二进制文件使用的

InputStream 输入   从文件读数据

OutputStream 输出   往文件写数据

2.字符流

读写文件,以字符为单位

是针对文本文件使用的

Reader 输入   从文件读数据

Writer 输出   往文件写数据


InputStream概述
方法

说明
InputStream 只是⼀个抽象类,要使⽤还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输⼊设备都可以对应⼀个 InputStream 类,我们现在只关⼼从⽂件中读取,所以使⽤ FileInputStream

FileInputStream概述
构造方法

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Demo7 {
    public static void main(String[] args) throws IOException {
        //InputStream inputStream = new FileInputStream("./test.txt");
        //inputStream.close();
        try(InputStream inputStream = new FileInputStream("./test.txt")){
            while(true){
//                int data = inputStream.read();
//                if(data == -1){
//                    break;
//                }
//                System.out.println(data);
                byte[] data = new byte[1024];
                int n = inputStream.read(data);
                if(n == -1){
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.println(data[i]);
                }
            }
        }
    }
}

FileInputStream

1.打开  try with resource

2.读read

3.关闭 Closable


OutputStream概述
方法

说明
OutputStream 同样只是⼀个抽象类,要使⽤还需要具体的实现类。我们现在还是只关⼼写⼊⽂件
中,所以使⽤ FileOutputStream
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Demo8 {
    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("./output.txt")){
            outputStream.write(97);
            byte[] bytes = {97,98,99};
            outputStream.write(bytes);
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }
}

对于OutputStream来说默认情况下尝试创建不存在的文件

是会清除上次的文件内容的

追加写的模式避免内容被清空


1.流对象的使用流程

先打开,再读写,最后关闭

2.应该使用哪个流对象

先区分是文本,二进制

再区分度读还是写


http://www.kler.cn/a/381030.html

相关文章:

  • 一篇文章学会HTML
  • 深度学习每周学习总结J9(Inception V3 算法实战与解析 - 天气识别)
  • Vue进阶之Vue RouterSSR
  • 详细ECharts图例3添加鼠标单击事件的柱状图
  • 常耀斌:深度学习和大模型原理与实战(深度好文)
  • 深入理解 HTTP HEAD 请求:节省带宽、提高效率的秘密武器
  • JavaEE初阶---网络原理值TCP篇(三)
  • gradle下载的jar包,源码出现Decompiled .class file, bytecode version
  • nginx监控指标有哪些
  • AI开发-三方库-torch-torchvision
  • Redis学习:BigKey、缓存双写一致性更新策略和案例
  • 小土堆学习笔记15:搭建小实战和Sequential的使用
  • w~自动驾驶~合集4
  • 【深度学习】DreamClear:提升图片分辨率的模型
  • git cherry-pick 小技巧
  • 【日志】初学顺序表
  • 基于springboot+vue实现的网上预约挂号管理系统 (源码+L文+ppt)4-104
  • 如何应对Oracle SQL语句的数据去重问题,应该考虑哪几个方面?
  • BFS-专题
  • 【Python】Python自习课:第一个python程序
  • GPT原理;ChatGPT 等类似的问答系统工作流程如下;当用户向 ChatGPT 输入一个问题后:举例说明;ChatGPT不是通过索引搜索的传统知识库
  • C++ explicit 关键字
  • 基于Arcpy和MATLAB批量提取指定经纬度点的栅格数据并转换为矩阵格式
  • 计算机系统结构为什么用architecture 而不是structure?
  • redis:set集合命令,内部编码,使用场景
  • 软件测试学习笔记丨Vue常用指令-条件渲染(v-if)