大兴模版网站搭建哪家好,阿里云成功备案的网站增加域名,郑州人流医院哪家好,网页制作专业选择1. 认识文件
1#xff09;文件概念
“文件”是一个广义的概念#xff0c;可以代表很多东西
操作系统里#xff0c;会把很多的硬件设备和软件资源抽象成“文件”#xff0c;统一管理
但是大部分情况下的文件#xff0c;都是指硬盘的文件#xff08;文件相当于是对“硬…1. 认识文件
1文件概念
“文件”是一个广义的概念可以代表很多东西
操作系统里会把很多的硬件设备和软件资源抽象成“文件”统一管理
但是大部分情况下的文件都是指硬盘的文件文件相当于是对“硬盘”数据的一种抽象 机械硬盘HDD适合顺序读取磁头移动需要时间 固态硬盘SSD内部是集成程度很高的芯片 2目录 一台计算机上有很多文件这些文件是通过“文件系统”操作系统提供的模块来进行组织的
操作系统使用“目录”文件夹这样的结构来组织文件
目录内部可能还包含其他的文件/目录
3文件路径
可以通过文件路径来确定当前文件具体所在的位置
1. 绝对路径以 C: D: 盘开头
2. 相对路径先指定一个目录作为基准目录从基准目录出发看沿着怎样的路径能找到指定的文件。一般以 . 或者 .. 开头 . 的情况可省略 . 当前目录 .. 当前目录的上一级目录 如果是命令行进行操作基准目录就是当前所处的目录
如果是图形化界面的程序基准目录就不好判断了
对于IDEA来说基准目录就是项目目录
4文件类型
从编程的角度看
1. 文本——文件中保存的数据都是字符串保存的内容都是合法字符
2. 二进制——文件中保存的数据仅仅是二进制数据包要求保存的内容是合法字符 合法字符涉及字符集/字符编码 如 utf8 有一个大的表格码表列出什么字符对应到什么编码 如果文件是 utf8 编写的此时文件的每个数据都是合法的 utf8 编码的字符 ——文本文件 如果存在一些不是 utf8 合法字符的情况——二进制 判断文件的类型——
直接使用记事本打开这个文件如果是乱码文件就是二进制否则就是文本
记事本就是尝试按照字符的方式来展示内容这个过程会自动查码表
写代码时文本文件和二进制文件的编码方式不同
2. Java 中操作文件
1. 文件系统的操作 File
创建文件删除文件判断文件是否存在判断文件类型重命名
2. 文件内容的操作 流对象
读文件/写文件
1File 概述文件系统操作
属性
修饰符积累性属性说明static StringpathSeparator 依赖于系统的路径分隔符 String 类型的表示 static charpathSeparator 依赖于系统的路径分隔符 char 类型的表示
pathSeparator 是一个路径中用来分割目录的符号 Windows \ 和 / Linux / 一般还是使用 / 使用 \ 在代码中要搭配转义字符使用 构造方法
签名说明File(File parent,String child) 根据父目录孩子文件 创建一个新的对象 File(String pathname) 根据文件路径创建一个新的实例 路径可以是绝对路径或相对路径 File(String parent,Strinf child) 根据父目录孩子文件路径创建实例 父目录用路径表达式 1一个File对象就表示一个硬盘上的文件 在构造对象的时候就需要把这个文件的路径指定进来绝对路径/相对路径都可以 2文件名 前缀 扩展名 使用路径构造对象一定要把前缀和扩展名都带上 方法
修饰符及返回值类型方法签名说明StringgetParent() 返回File对象的父目录 文件路径 StringgetName()返回File对象的纯文件名称StringgetPath()返回File对象的文件路径StringgetAbsolutePath()返回File对象绝对路径的StringgetCanonicalPath() 返回File对象的修饰过的 绝对路径 booleanexist() 返回File对象描述的文件是否 真实存在 booleanisDirectory() 返回File对象代表的文件是否是 一个目录 booleanisFile() 返回File对象代表的文件是否是 一个普通文件 booleancreateNewFile() 根据File对象自动创建一个 空文件创建成功后返回true booleandelete() 根据File对象删除该文件 成功删除后返回true voiddeleteOnExit() 根据 File 对象标注文件将被删除删除动作会到 JVM 运行结束时才会进行 String[]list() 返回File对象代表的目录下的 所有文件名 File[]listFile() 返回File对象代表的目录下的所有文件以File对象表示 booleanmkdir()创建File对象代表的目录booleanmkdirs()创建File对象代表的目录如果必要会创建中间目录booleanrenameTo(File dest)进行文件剪切粘贴操作booleancanRead()判断用户是否对文件有可读的权限booleancanWrite()判断用户是否对文件有可写的权限 Windows上的盘符不分大小写 getCanonicalPath() 针对绝对路径进行简化后得到的路径 对IDEA来说基准目录就是项目所在的目录 绝对路径就是把当前的相对路径拼接到基准目录上 System.out.println(files); 打不出数组内容是数组的哈希值 在JVM上层Java代码中没有任何办法获取到“内存地址” 要想拿到内存地址只能靠native方法进入到JVM内部通过C代码获取到 System.out.println(Arrays.toString(files)); 会打印出系统自带的特殊目录不让用户感知到防止被随意修改 2文件内容的读写 —— 数据流
流对象文件内容操作
在标准库中提供的读写文件的流对象stream有很多类可以归结到两个大的类别中
1. 字节流对应二进制文件
每次读/写的最小单位是“字节”8bit InputStream OutputStream 2. 字符流 对应文本文件
每次读/写的最小单位是“字符”一个字符可能对应多个字节
本质上是对字节流的又一层封装把文件中几个相邻的字节转换成一个字符自动查字符集表 Reader Writer GBK一个中文字符集 两个字节 utf8一个中文字符集 三个字节 输入/输出是站在CPU的角度上 输出——读 输入——写 1. Reader 类
Reader 是抽象类不能new实例只能new子类 标准库已经提供了现成的类
创建Reader对象的过程就是”打开文件“的过程 文件不存在就就会打开失败 1. 无参数 read一次读取一个字符
2. 一个参数 read一次读取若干个字符会把参数指定的 cbuf 数组给填充满
4. 三个参数 read 一次读取若干个字符会把参数中的 cbuf 数组从off位置开始到len的范围尽量填满 1把这个 cbuf 空数组不是null没有实际意义的数组尽量填满 2使用 close 方法是为了释放文件描述符PCB—— 顺序表数组 进程每次打开文件都需要在这个表里分配一个元素这个数组的长度是存在上限的 当数组占满后再尝试打开文件会触发文件资源泄露类似内存泄漏 3read 返回值是 int 表示读取的字符数若文件读完了返回 -1 reader.close(); 该方法可能会执行不到如果程序出现逻辑错误会报异常终止程序调用不到 close 可以使用 try{}finally{reader.close();
} //但过于繁琐不够优美 try{ } // try with resources () 中定义的变量会在 try 代码结束的时候正常结束还是抛出异常自动调用其中的 close 方法 要求写到 () 里的对象必须实现 Closeable 借口 ——流对象都可以这么写 在Java标准库内部对于字符编码做了很多的处理 1只使用char此时使用的字符集固定是 unicode 若使用String此时会自动把每个字符的 Unicode 转换成 utf8 2char[] c 包含的每个字符都是 unicode 编码的 String s new String(c); 一旦使用这个字符数组构成String就会在内部把每个字符都转换成 utf8 可配置 s.charAt(i) 也会把对应的 utf8 的数据转换成 unicode 3把多个 unicode 联系放到一起难以区分从哪到哪是一个完整的字符 utf8 可以做到区分 可以认为 utf8 是针对连续多个字符进行传输时的一种改进方案 2. Write 类 1. 一次写一个字符 2. 一次写一个字符串 3. 一次写多个字符字符数组 4,5. offset 是从数组/字符串中的第几个字符开始写 Write 写入文件默认情况下会把原文件的内容清空掉 若不想清空需要在构造方法中添加一个参数 此时回见内容写到原有文件的末尾 3. OutputStream类
和 Write 类似, OutputStream 打开一个文件默认会清空文件的原有内容
写入的数据会成为文件中的新数据
若不想清空可以使用追加写的方式在构造方法中第二个参数传入 true 此处已经写入了字符串但在文件中却未写入 缓冲区 PrintWriter 这样的类在进行写入的时候不一定是直接写硬盘而是先把数据写入到一个内存构成的“缓冲区”中buffer ——引入缓冲区是为了提高效率减少读硬盘的次数 当写入缓冲区后如果还没来及将缓冲区的数据写入硬盘进程就结束了此时数据就丢了 有时候需要手动使用 flush 方法将数据写入硬盘 ——刷新缓冲区 4. InputStream类 以上是将文件中的数据全部读完的两种方式前者的IO次数更少性能更好 Scanner 进行字符读取 Scanner(InputStream is, String charset) 使用 charset 字符集进行 is 的扫描读取 文件练习
扫描指定目录找到名称中包含指定字符的所有普通文件不包含目录并且后续询问用户是否要删除该文件
1list 列出目录内容
2判断文件类型
3删除文件
找到目录中的所有文件以及子目录中的所有文件只要遇到子目录就往里找
可以使用“递归”的方式把所有的子目录都扫描一遍