Java的File类和IO流其实真的不难
目录
- IO流:
- File类:
- 字节输出流:
- 字节输入流(从文件读取到控制台):
- 字符输出流:
- 字符输入流:
- 总结
IO流: IO流概述:
IO:输入/输出(Input/Output)
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的, 常见的应用:文件复制; 文件上传; 文件下载等等,总而言之,涉及到传输的,都涉及到流。
IO流体系图:
文章图片
文章图片
既然IO是涉及文件的操作,那么一定离不开文件操作的技术:
File类:
File 类是 java.io 包中唯一代表磁盘文件本身的对象。File 类定义了一些方法来操作文件,主要用来获取或处理与磁盘文件相关的信息,像文件名、 文件路径、访问权限和修改日期等,还可以浏览子目录层次结构。
File 类表示处理文件和文件系统的相关信息。File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性。所以和IO搭配在一起进行读出和写入的操作。
先看一张File类常用的方法总汇图:
文章图片
使用createNewFile()创建一个文件:
public class test01 {public static void main(String[] args) throws IOException {//先建立一个File对象,并传入路径File file1 = new File("G://abc.txt"); //创建空文件,如果没有存在则新建一个,并且返回True,如果存在了就返回falseSystem.out.println(file1.createNewFile()); }
如果执行后,该目录没有这个文件,那么会创建一个,并且返回true,如果已经存在了,就会返回false,代表创建失败。
文章图片
使用mkdir()创建一个目录:
File file2 = new File("G://a"); System.out.println(file2.mkdir()); //创建一个目录,如果没有存在则新建一个,并且返回True,如果存在了就返回false
使用mkdirs()创建多级目录:
File file3 = new File("G://a//b//c"); System.out.println(file3.mkdirs()); //创建多级目录,如果没有存在则新建一个,并且返回True,如果存在了就返回false
文章图片
接着我们需要使用IO流里面的功能对文件进行输入和输出:
先介绍四个常用的流:
- 字节输入流:InputStream
- 字节输出流:OutputStream
- 字符输入流:Reader
- 字符输出流:Writer
ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
所以我们知道计算机读取数据是一个一个的读取,当文件里面是数字或者英文的时候,因为都占了一个字节,所以可以正常读取出来。
那么如果是汉字呢?最少也占了两个字节,如果把一个汉字拆分读取,显示出来肯定是有问题的。
小结:如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流!
下面是四种流对应功能的方法名总汇表:
文章图片
字节输出流:
我们使用字节输出流给abc.txt文件里面写一句话:
public class test01 {public static void main(String[] args) {try{//创建输出流对象:OutputStream fos = null; fos = new FileOutputStream("G://abc.txt"); String str = "今天的博客是IO流"; //先将需要写入的字符打散成数组:byte[] words = str.getBytes(); //使用写入的功能fos.write(words); } catch (FileNotFoundException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }}}
运行后:
文章图片
字节输入流(从文件读取到控制台):
我们知道如果文件内是汉字,使用字节输入流,那么显示的肯定是乱码,如果现在文件里面是“我爱中国”这四个字,使用下面这段代码:
public class test02 {public static void main(String[] args) {//创建字节输入流对象:InputStream fis = null; try{fis = new FileInputStream("G://abc.txt"); int data; //fis.read()取到每一个字节通过Ascll码表转换成0-255之间的整数,没有值返回-1while((data=https://www.it610.com/article/fis.read())!=-1){//(char) data 将读到的字节转成对应的字符//中文的字符是2+个字节组成System.out.print((char) data); }} catch (FileNotFoundException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }finally {try{fis.close(); } catch (IOException e) {e.printStackTrace(); }}}}
输出的结果是:
文章图片
然后把文件内信息换成英文和数字:
文章图片
结论:有汉字的文件读取不能用字节流
字符输出流:
我们使用字符输出流给abc.txt文件里面写几句话:
public class test03 {public static void main(String[] args) {try{//使用字符输出流的FileWriter写入数据Writer fw = new FileWriter("G://abc.txt"); fw.write("我们在学Java"); fw.write("一起加油"); fw.close(); //关闭资源} catch (IOException e) {e.printStackTrace(); }}}
文章图片
也没用问题,我们发现,使用字符流写中文汉字更方便。
【Java的File类和IO流其实真的不难】
字符输入流:
可以设置缓存流提高获取值的效率:
public class test04 {public static void main(String[] args) throws IOException {//创建字符输入流对象:Reader fr = null; try{fr = new FileReader("G:/abc.txt"); //借助字符流对象创建了字符缓存区 把字符一个一个的取到后先放到缓存区//然后一起再读写到程序内存来,效率更高BufferedReader br = new BufferedReader(fr); //先去缓存区一行一行的读取String line = br.readLine(); while(line != null){System.out.println(line); line = br.readLine(); }} catch (FileNotFoundException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }finally {try {fr.close(); } catch (IOException e) {e.printStackTrace(); }}}
当文件内的信息为多行的时候:
文章图片
字节流和字符流总结:
- IO是文件的输入和输出,我们要想去对文件或者写,或者通过程序发送消息给另外的用户都要用到流。
- IO流分 字节流和字符流,字节流是以字节为单位IO,字符流是以字符为单位IO;通常读写图片、视频音频等用字节 流,如果读写文件的内容比如中文建议用字符流。
总结 IO流还有很多方法操作,比如复制文件、缓冲流(增加缓冲功能,避免频繁读写硬盘)、转换流(实现字节流和字符流之间的转换)、数据流(提供将基础数据类型写入到文件中,或者读取出来)等等
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- Python&Matlab实现蚂蚁群算法求解最短路径问题的示例
- mybatis|mybatis plus框架的@TableField注解不生效问题总结
- 『无为则无心』Python日志|『无为则无心』Python日志 — 65、日志模块logging的使用
- 你可能真的需要抛弃word了!细说在线文档如何碾压传统文档
- 未来的直播技术将会有哪些新的进化形式()
- 数睿数据深度 | 商业智能红海,下一代BI还能激起多大的浪花
- 词向量技术
- java|PostMan测试接口-----上传文件、导出excel
- Java|JavaScript基础
- JavaSE|异常学习笔记