优化型网站建设,公司网站模板大全,cms wordpress主题,vs2010怎么做网站阿华代码#xff0c;不是逆风#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力#xff01;#xff01; 希望本文内容能够帮助到你#xff01;#xff01; 目录
一#xff1a;认识文件
1#xff1a;文件的概念
2#xff1a;文件的结构
3#xff1a;文件路径… 阿华代码不是逆风就是我疯 你们的点赞收藏是我前进最大的动力 希望本文内容能够帮助到你 目录
一认识文件
1文件的概念
2文件的结构
3文件路径
1绝对路径
2相对路径
3举例
二文件的分类
1文本文件
2二进制文件
3如何判断文件的种类
三Feil类对文件操作
1Feil类
2File类的构造方法
3获取属性方法
代码示例一
代码示例二 4判断方法 5创建删除方法
6创建移动方法
7创建File对象代表的目录
8文件改名操作
四文件流
五字节流
1InputStream
0打开文件
1构造方法
2类/异常解析
3文件资源泄露
4read方法
①引入
②三种参数代码示例
2OutputStream
3Scanner联动
编辑
六字符流
1Reader类
2Writer类 一认识文件
1文件的概念
对于计算机来说“文件”是一个非常广义的概念可以指普通的文件文件夹一些硬件设备也被抽象成了文件例如键盘耳机显示器网卡等
对于机械硬盘来说它更加擅长顺序读写不擅长随机读写
比如有一个很大的文件我们需要把这个文件整体复制一份就是顺序读写
某个目录中有很多的小文件数目比较多需要把整个目录都拷贝一份就是随机读写。
2文件的结构
文件系统的结构是按照“树形结构”来组织文件的是N叉树一个普通文件非目录就是一个叶子节点对一个目录文件来说里面又可以有很多的子节点
3文件路径 形如上述的图片从树根节点一级一级的往下走直到直到目标文件这个过程中经过的所有文件目录的名字串起来使用正斜杠——“/”或者反斜杠——“\”分割就构成了“路径”
注此过程并非是遍历树可以想象成类似于Hash这样的结构
1绝对路径
从树根节点 出发一层一层到达目标文件
2相对路径
先指定一个“当前目录”/“基准目录”从当前目录出发找到目标文件
3举例 二文件的分类
1文本文件
文本文件是按照“字符串”的形式来理解文本内容的文本文件里面的二进制内容也都表示为字符串可以理解为——二进制内容都是合法的字符像字符编码英文字母用ASCII汉字用utf8/gbk
举例.java .c .cpp 文本文档
2二进制文件
二进制文件没有上述的限制储存任何数据都可以。
举例图片音频可执行程序动态库.class文件富文本文件
富文本文件包括不限于word docx excle xlsx power point pptx
3如何判断文件的种类
使用记事本打开文本文件如果看到的是乱码就是二进制文件
三Feil类对文件操作
引入在Java中对于文件操作的Api这里有两类
针对文件系统的操作创建删除重命名
针对文件内容的操作读文件写文件
1Feil类 2File类的构造方法 3获取属性方法 代码示例一
构造File用绝对路径
import java.io.File;
import java.io.IOException;public class IO1 {public static void main(String[] args) throws IOException {File f new File(C:/User/1/test.txt);//绝对路径//File f new File(./test.txt);System.out.println(f.exists());//判断文件目录是否存在System.out.println(f.getParent());System.out.println(f.getName());//返回file对象的名称System.out.println(f.getPath());//返回file对象的文件路径System.out.println(f.getAbsolutePath());//返回绝对路径System.out.println(f.getCanonicalPath());//返回对象修饰过后的路径canonical规范的}}代码示例二
构造对象用相对路径
.getPath()得到的就是构造方法中的参数
Canonical读音克挠你扣规范的——可以理解为化简路径
import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 19:28*/
public class IO1 {public static void main(String[] args) throws IOException {//File f new File(C:/User/1/test.txt);//绝对路径File f new File(./test.txt);System.out.println(f.exists());//判断文件目录是否存在System.out.println(f.getParent());//返回父目录文件路径System.out.println(f.getName());//返回file对象的名称System.out.println(f.getPath());//返回file对象的文件路径System.out.println(f.getAbsolutePath());//返回绝对路径System.out.println(f.getCanonicalPath());//返回对象修饰过后的路径canonical规范的}}4判断方法 我们可以使用file.createNewFile如下代码也可以直接手动在当前目录创建一个File文件——名字叫test.txt
import java.io.File;
import java.io.IOException;public class IODemon2 {public static void main(String[] args) throws IOException {File file new File(./test.txt);System.out.println(file.exists());//文件存在吗System.out.println(file.isFile());//是普通文件嘛System.out.println(file.isDirectory());//是目录吗boolean ret file.createNewFile();//创建文件返回的结果就是创建成功和创建失败System.out.println(ret: ret);}}5创建删除方法
file.delete删除文件返回值类型为boolean类型
file.deleteNewFile退出时删除文件返回值为void
注删除目录只能一级一级的删除
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:17*/
public class IODemon3 {public static void main(String[] args) throws IOException, InterruptedException {File file new File(./test.txt);//boolean ret file.delete();//删除文件//System.out.println(ret);boolean ret file.createNewFile();//创建文件file.deleteOnExit();//返回值为void类型退出的时候删除文件测试的时候注意看左边的目录栏Thread.sleep(5000);}}6创建移动方法
import java.io.File;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:44*/
public class IODemon4 {public static void main(String[] args) {File file new File(.);//返回的是对象代表的目录下所有的文件//返回的是一个String[]类型的数组String[] files file.list();System.out.println(Arrays.toString(files));//返回的file对象代表的目录下所有的文件不过是以file对象表示File[] files2 file.listFiles();System.out.println(Arrays.toString(files2));}
}7创建File对象代表的目录
import java.io.File;
import java.lang.reflect.Field;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:58*/
public class IODemon5 {public static void main(String[] args) {/* File file new File(./aaa);//创建file为对象的目录boolean ret file.mkdir();System.out.println(ret);*//* File file new File(./bbb);boolean ret2 file.mkdirs();//mkdirs可以用于创建单个目录也可以用于创建多级目录System.out.println(ret2);*//*File file new File(./aaa/bbb/ccc);boolean ret2 file.mkdirs();//mkdirs可以用于创建单个目录也可以用于创建多级目录System.out.println(ret2);*/File file new File(./bbb);boolean ret file.delete();//删除只能一级目录一级目录的删System.out.println(ret);}
}8文件改名操作
注意细节file1文件改名为file2对象
import java.io.File;public class IODemon6 {public static void main(String[] args) {File file1 new File(./aaa/bbb/ccc/bbb);File file2 new File(./bbb);boolean ret file2.renameTo(file1);//把bbb这个文件移入./aaa/bbb/ccc的/ccc下System.out.println(ret);}}四文件流
什么是文件流呢
举个例子要写100字节的内容我们可以分10次写每次写10字节的内容也可以分5次来写每次写20字节的内容;当然也可以一次性写完
“流”是操作系统提供的概念Java标准库中对于“进行了”封装提供了一组类来负责这些工作
我们把这些类主要分为两种字节流和字符流
五字节流
代表类InputStream——输入流OutPutStream——输出流
1InputStream
0打开文件
按照读文件的方式打开一个文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 11:46*/
public class IODemon7 {public static void main(String[] args) throws IOException {/*//打开文件InputStream inputStream new FileInputStream(./test.txt);//在中间一定会涉及一些对文件的操作之类的如果遇到bug或者像return之类的不可控的操作close操作可能就会执行不到了//打开了文件最后还要关掉打开文件操作会抛出FileNotFoundException异常inputStream.close();//关闭文件会抛出IOException异常前后两者为父类子类的关系*//*//第二种写法InputStream inputStream null;try {inputStream new FileInputStream(./test.txt);}finally{inputStream.close();}*//*//第三种写法try with resources版本try (InputStream inputStreeam new FileInputStream(./test.txt)){//出了try{}代码块范围后编译器会自动调用.close方法关闭文件//FileInputStream继承于InputStreamInputStream又实现了Closeable接口必须实现了Closeable接口才可以被放到try里面}*/}}1构造方法 注你给cpu送的信息叫输入比如读操作。cpu给存储器等这些硬件设备送的信息叫做输出比如写操作
2类/异常解析 3文件资源泄露
如果不执行文件关闭.close方法就会有大问题。这里本质上是释放了文件的相关资源PCB文件描述符表不懂得铁子可以看前面写过的文章这个表本质是一个数组或者顺序表每打开一个文件就会占据一个位置如果不关闭一直打开就会导致表被耗尽后续再想打开就会报错。
那么提问文件描述符表不会动态扩容吗对操作系统的内核来说需要很高的性能付出的代价太大了容易造成系统的卡顿 4read方法
①引入
read读文件就是把硬盘数据读取到内存当中buffer译为缓冲区 注意点①offset此处缩写了
注意点②传入的数组在方法内部对数组内容修改过后方法外部也能生效
注意点③字符流读取文件的时候
②三种参数代码示例
①*不带参数的读一个一个字符的读
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:18*/
public class IOStream8 {public static void main(String[] args) throws IOException {try(InputStream inputStream new FileInputStream(./test.txt)){//读取操作,读到-1的时候就会停止while(true){int a inputStream.read();if (a -1){break;}System.out.print(a );//读取的abcdef是ascii码值}}}
} ②*带入数组参数的读取一次读取多个字符
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:56*/
public class IODemon9 {public static void main(String[] args) throws IOException {try(InputStream inputStream new FileInputStream(./test.txt)){while (true){//也可以一次读若干个字节,buffer(缓冲区)byte[] buffer new byte[1024];//读的时候会尝试把buffer[1024]填满int n inputStream.read(buffer);//传入的参数是buffer数组方法内部对数组内容进行修改后方法外部也能生效实际上填不满1024个字节if (n -1){break;//读取到最后一个字符就break}for (int i 0; i n; i) {System.out.printf( %x ,buffer[i]);//遍历数组并打印}}}}
} ③*构造String从0读到n利用offset
offset翻译为抵消补偿
注意看while循环什么是文件流假设我们要读取的文件很大在这个循环中每次尽可能读取1024个字节可能读到的字节数比这个要小这次读不完我们就先用String给存起来0到n下一次while循环就接着读“特别像字符串拼接 ”
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 13:22*/
public class IODemon10 {public static void main(String[] args) throws IOException {try(InputStream inputStream new FileInputStream(./test.txt)){while (true){//也可以一次读若干个字节,buffer(缓冲区)byte[] buffer new byte[1024];//读的时候会尝试把buffer[1024]填满int n inputStream.read(buffer);//传入的参数是buffer数组方法内部对数组内容进行修改后方法外部也能生效if (n -1){break;}String string new String(buffer , 0 , n);//构造一个String对象数组前n个字节来构造System.out.printf(string);//遍历数组并打印}}}
} 2OutputStream
按照写的方式打开文件 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:06*/
public class IODemo11 {public static void main(String[] args) throws FileNotFoundException {try{//打开操作会把原有文件中的内容清空所以罪魁祸首不是Write操作而是打开操作OutputStream outputStream new FileOutputStream(./test.txt);//OutputStream outputStream new FileOutputStream(./test.txt,true);追加写byte[] buffer new byte[]{97,98,99,100,101};outputStream.write(buffer);}catch (IOException e) {throw new RuntimeException(e);}}
}3Scanner联动
ScannerSystem.in中System.in本质就是一个InputStream import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:21*/
public class IODemo14 {public static void main(String[] args) throws FileNotFoundException {try(InputStream inputStream new FileInputStream(./test.txt)){Scanner scanner new Scanner(inputStream);while(scanner.hasNext()){String s scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}六字符流
以字符为单位进行读写例如用utf8表示汉字3个字节就是一个汉字每次读写都得以3个字节为单位来进行读写不能一次读半个汉字
在用char类型的数组存储汉字时是把3个字节组成的utf8汉字转化为了Unicode输出为String类型时在把Unicode转化为字节
代表类Reader——输入Writer——输出 1Reader类
代码示例
把byte换为char测试一下区别在于打印汉字
import java.io.*;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:33*/
public class IODemo12 {public static void main(String[] args) {try{//Reader和Writer的字符流与OutputStream和InputStream相似Reader reader new FileReader(./test.txt);while(true){char[] buffer new char[1024];int n reader.read(buffer);if (n -1){break;}String s new String(buffer , 0 , n);System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}如果文件中有内容换行操作了那么有可能会有一些内容打印不到 2Writer类
记住要把文件打开操作放到try的括号里要不然不会默认执行close关闭文件操作
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:07*/
public class IODemo13 {public static void main(String[] args) {try(Writer writer new FileWriter(./test.txt,true)) {String s 可选择续写操作 或者 清空在写操作;writer.write(s);} catch (IOException e) {throw new RuntimeException(e);}}
}