网站建设全攻略,wordpress中文书籍,手机模板网站模板下载工具,wordpress无法用qq邮箱验证前言
#x1f31f;#x1f31f;本期讲解关于CAS的补充和JUC中有用的类#xff0c;这里涉及到高频面试题哦~~~
#x1f308;上期博客在这里#xff1a;【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客
#x1f308;感兴趣的小伙伴看一看小编主页…
前言
本期讲解关于CAS的补充和JUC中有用的类这里涉及到高频面试题哦~~~
上期博客在这里【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客
感兴趣的小伙伴看一看小编主页GGBondlctrl-CSDN博客 那么废话不多说直接开整吧~~~ 目录
1. 文件流
1.1概念
1.2文件流分类
1.3文件流的操作
1.文件资源泄露
2.Inputstrea
read的方法
一个字节读取
多个字节读取
3.Outputstream
write的方法 一个字节写入
一段字节写入
4.Reader
read的方法
一个字符读取
多个字符读取 5.writer
write的方法 字符的读取
2.总结
2.1内容概括
2.2例题
1.查找硬盘上文件的位置
2.文件的复制
3.按照内容的方式在目录中进行搜索 1. 文件流
1.1概念
所谓的文件流是操作系统提出来的概念这里的C/Java都对流进行了封装那么这个抽象的概念如何进行具体化呢
例子
当我们要接一100mL水时我们可以将文件流具体化成为水流的意思而杯子就是文件那么我们大体上就有两种办法
1.我们可以一次性直接将这杯水直接性的接满
2.我可以一次性接10mL的水然后分10次接满这杯水 所以这里就是 我们可以应用到我们的文件流上即一个文件我们可以一次读取十个字节分十次读完这里代表的是共有100个字节或者直接一次性读100个字节 1.2文件流分类
在Java中文件流的读取操作分为两种
第一种字节流就是代表按照一个字节一个字节进行读取
即代表类 Inputstream这里代表输入读操作 Outputstream这里代表输出写操作 第二种字符流这里就是按照字符的方式进行读取文件的操作注意utf8读取的汉字一个汉字就是三个字符所以得以三个字符为单位读取汉字
即代表类 Read这里代表输入读操作 Write这里代表输出写操作 1.3文件流的操作
这里的四种输入输出流操作基本是一致的但是这里编着重讲解一下关于这四种文件流的具体实例演示这里就直接步入正题咯~~~
1.文件资源泄露
这里就是代表按照字节的形式读取数据,在这之前我们需要在idea工作目录下创建一个test.txt的文件便于我们接下来的文件设置操作图示如下 这里就是我们小编在idea工作目录下创建的一个普通文件我们可以在这面
实例化对象如下
InputStream inputnew FileInputStream(./test.txt)
注意这里在执行文件流后这里就要抛出一个IO异常并且在执行文件读取操作后要进行文件资源的释放
文件资源的释放
input.close();
为啥要进行文件资源的释放 这里会有一个进程控制块其中的文件描述附表就会记录当前进程打开了哪些文件而其中的顺序表就会有一个结构进行描述文件的一些属性 如果每次打开一个文件就会在文件描述附表中占用一个的位置如果不进行资源的释放就会导致文件描述附表被消耗殆尽 补充 这里还有一个重要的概念叫做“内存泄漏”在C/C中每malloc一个内存就要自己手动进行free掉但是在Java中自带的GC机制即垃圾回收机制就自动帮我们实现了这个过程 但是当我们实现这里close后可能由于return或者抛出异常就无法执行到我们需要的释放的文件资源那么在Java中就提供了两种办法
第一种
InputStream inputStreamnull;try {inputStreamnew FileInputStream();}finally {inputStream.close();}
注意这里小编已经在函数入口的main方法上进行了抛出异常的操作这里就是通过finally来实现这里的必须执行close方法第操作但是这种办法还是写得很是复杂
第二种 public static void main(String[] args) throws IOException {try (InputStream inputnew FileInputStream(./test.txt)){}
}
注意这种写法就是try with resources的写法这里就是try自动帮我们执行了这里的close方法
但是这里的try必须是实现了closeable接口的类才能够直接实现哈
这里的inputstream的内部原码 可以看到这里的inputstream就已经实现了Closeable这里的接口
综上所述这里的inputstream的例子合适其他的文件流的操作
2.Inputstrea
我们在上描述中实现了使用文件流操作中实现文件资源的释放的工作那么这里我们就要直接学习关于文件流之一inputstream的重要方法的使用
read的方法 read这里传递的类是int但是实际的类型就是byte类型0-255当文件读到末尾的时候就为-1 readbyte[ ]一个字节数组参数是一个输出型参数这里的字节数组是一个引用类型在方法内部进行修改在方法外也生效 readbyte[ ]int off, len这里的off是offest的意思代表的是偏移量len即代表的是偏移多少 一个字节读取
try (InputStream inputnew FileInputStream(./test.txt)){//一个字节一个字节进行读取while (true){int ninput.read();//当n-1就表示文件读取完毕了if(n-1){break;}System.out.printf(%x ,n);//ascll码值是10进制的但是16进制的就是61开始}
注意即通过循环来进行文件的读取当n-1的时候那么这里就表示文件已经读取完了即跳出循环 每次读取的字节进行打印这里表示的是按照十六进行进行读取
当我们在文件中输入abcd的时候图示如下 那么此时执行程序最后实现的打印就是如下图所示 这里按照16进制进行转化后就是如上所示但是直接进行输出最后的结果即是97 98 99 100
多个字节读取
代码如下 while (true){//进行一段字节进行读取byte[] buffernew byte[1024];int ninput.read(buffer);if (n-1){break;}for (int i 0; i n; i) {System.out.printf(%x , buffer[i]);}String snew String(buffer,0,n);System.out.println(s);}
注意这里就要通过buffer缓冲区进行一个文件读取的辅助通过read进行字节传入到buffer字节数组中然后通过n是否等于-1再次进行跳出循环的判断
我们还可以通过string进行将字节转化为字符的形式进行输出这里表示的是N个字节进行构造的字符串而不是整个字节
那么接下来的输出就是 那么这里在输出abcd的16进制后有多了abcd的字符串编码
3.Outputstream
这里和上面的inputstream是一致的都要进行文件资源的释放操作
write的方法 注意这里的第一个表示的是一个字节进行写入第二个表示按照一段字节进行写入操作第三个是按照的规定进行一段字节的写入 一个字节写入
代码如下 try (OutputStream outputnew FileOutputStream(./test.txt)){//一个字节进行写入造作int buffer197;output.write(buffer1);}catch (IOException e){throw new RuntimeException(e);} 注意这里的写入操作会导致每次进行文件打开操作的时候会清空文件的内容所以不管执行多少程序那么这里的内容始终就是a;
所以我们可以在文件路径后面添加true,表示从文件内容进行添加而不是删除内容后再添加
一段字节写入
public static void main(String[] args) {try (OutputStream outputnew FileOutputStream(./test.txt,true)){//输入要写入的数据byte[] buffernew byte[]{97,98,99};output.write(buffer,0,3);}catch (IOException e){throw new RuntimeException(e);}}
注意这里就涉及一个字节类的数组作为一个缓冲区域进行存字节数字0表示从0下标开始读取三个字节这里严格来说不是实现字节转化为字符而是读取端根据比配的字符编码进行显示的
这里由于存在true那么就会在文件内容后面再次拼接字符串
那么这里执行两次后输出结果就是如下 可以看得到在实现字符的拼接后就会打印两次abc;
4.Reader
read的方法 注意这里的方法和上面的inputstream基本是一致的但是这里是以char为单位进行的但是第三个就是一个类对字符数组进行封装本质上还是一个字符数组
一个字符读取 while (true){int n reader.read();if (n-1){break;}System.out.print((char)n );}
注意这里就不建议大家这样写因为文件流是对硬盘进行操作操作硬盘是一个低效的操作所以在实现的时候尽量减少这个操作
多个字符读取
代码如下
try (Reader reader new FileReader(test.txt)) {while (true){//这里的类型是char类型char[] buffernew char[1024];int nreader.read(buffer);if (n-1){break;}for (int i 0; i n ; i) {System.out.print(buffer[i]);}String s new String(buffer, 0, n);System.out.println(s);}
注意这里还是和inputstream写法基本是一致的只不过这里的string会将指定的字符数组转化为一个新的string对象并且在打印的时候会重新调用tostring对象所以就可以进行字符串的读取了
那么输出的结果就是 很明显这里在执行字符串的打印过后再次实现string的打印所以这里就是四个abcd 那么为什么这里的char两个字节为啥可以变为字符在utf8中表示的是三个字节 因为在进行utf8文件按照字符提取的时候先转化为unicode然后char存贮的是unicode的值最后再由unicode转化为utf8string类型这里就是Java已经封装好了的 5.writer
write的方法 注意这里唯一的点就是可一通过字符串来进行打印其余的基本和上面的文件流操作一致~~~ 字符的读取
public static void main(String[] args) {try (Writer writernew FileWriter(./test.txt)){String buffer开心每一天;//char[] buffernew char[]{开,心,每,一,天};writer.write(buffer,0,2);}catch (IOException e){throw new RuntimeException();}}
注意这里可以直接通过string来进行写入文件并且也可以通过实现char类型数组来进行文件的写入操作
2.总结
2.1内容概括
本期小编主要讲解了关于文件内容操作中比较重的文件流的操作包括inputstreamoutputstreamwriterreader以及重要的小知识点穿插在其中~~
2.2例题
1.查找硬盘上文件的位置
要求输入查找文件的名字以及查找的路径
代码位置IODemo8.java · GGBondlctrl/IO - 码云 - 开源中国 (gitee.com)
2.文件的复制
要求输入要复制的文件以及复制到的目标文件
代码位置IODemo9.java · GGBondlctrl/IO - 码云 - 开源中国 (gitee.com)
3.按照内容的方式在目录中进行搜索
要求输入要查找的内容以及要查找的文件路径
代码位置IODemo11.java · GGBondlctrl/IO - 码云 - 开源中国 (gitee.com)
以上小编都在代码中进行了注解小编这里就不再进行讲解了下期将直接进入网络的编程了~~
~~~~最后希望与诸君共勉共同进步 以上就是本期内容了 感兴趣的话就关注小编吧。 期待你的关注~~~