文件的基本操作
什么是文件?
文件就是保存数据的地方,比如大家经常使用的word文档,txt文档,Excel文件。。。。
在我们java编程中会经常提到流的概念,这里的流指的就是文件流 也称IO流
文件在程序中是以流的形式来操作的
数据是保存在文件里边,而文件是保存在磁盘的,如果需要从文件(磁盘)中读取数据至java程序(内存)中 我们就要用到输出流,反之要把java程序中的数据写至文件或者磁盘中,那就是输出流
常用的文件操作
创建文件对象相关构造器和方法
//创建文件对象FILE对象
File
类是用来操作文件的类,但它不能操作文件中的数据
方法1:
File file=new File(path);//path是路径
方法2:
//根据父目录文件+子路径构建
File parenFile=new(parenpath);//创造父目录文件对象 可以是"e:\\"
File file=new File(parenFile,son);//son为子路径名称,parenFile是父目录的文件对象,而不是字符串路径
方法3:
//根据父路径和子路径构建
File file(parenpath,sonpath),//parenpath是父目录文件路径,sonpath是子目录路径
要注意的是,在java程序中创建的File对象只是存在java程序中而已,如果需要将这个文件对象写入磁盘,应该调用file.creatNewFile方法
并且在涉及文件时用的是\\或者/;
获取文件信息
在获取文件信息之前,需要先创建一个文件对象
这里假设我们创造一个文件对象File file,我们可以调用这些方法
file.getName();//得到文件名字
file.getAbsolutePath;//获取文件绝对路径
file.getParent;//获取父级目录
file.length();//获取文件大小
file.exists();//判断文件是否存在
file.isFile();//判断是不是一个文件
file.usDirectory();//判断是不是一个目录
file.delete();//文件删除,目录只能删除空目录
目录操作
在java编程中目录也被视为文件的形式,也是用FIle对象来接收
在java中创建文件我们说过了,调用creatNewFIle()方法来创建调用这个方法的文件对象的文件,但是创建目录我们不用这个方法,我们在创建目录的时候用
file.mkdir();//创建一级目录使用这个方法 什么是一级目录?比如:"D:\\demo"
file.mkdirs();//创建多级目录使用这个方法
java IO流原理
I/O是input/Output得到缩写,I/O技术是非常实用的技术,用于处理数据传输,如读,写文件,网络通讯等
java程序中,对于数据的输入/输出操作以“流”的方式进行
java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或者输出数据
程序读取文件输入流 程序写入文件输出流
输入流:input,读取外部数据,从磁盘读取到程序
输出流:output,输出内部数据,从程序输出到磁盘
流的分类
按操作数据单位不同分为:字节流(8bit),字符流(按字符)//操作二进制文件使用字节流,操作文本文件使用字符流
按数据流的流向不同分类:输入流,输出流
按流的角色不同可以分为:节点流,处理流/包装流
字节流:字节输入流(InputStream),字节输出流(OutputStream)
字符流:字符输入流(Reader),字符输出流(Writer)
字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。
OutputStream和inputStream以及Reader和Writer都是抽象类 不能直接实例化,我们应该使用实现该类的子类
流是一个媒介就像是外卖小哥在用户和物流中心之间的物品传递一样,在用户和物流中心之间物品的转换 需要用到外卖小哥得作为媒介来传递物品
也可以这么说 java程序是用户 外卖小哥是流 文件对象是物流中心 输入流就是外卖小哥把物流中心的物品送到用户手中,输出流就是外卖小哥将用户手中的物品送到物流中心
I/o流体系图——常用的类
InputStream:字节输入流
InputStream抽象类是所有类字节输入流的超类
InputStream的常用子类:
1.FileInputStream:
构造器:new FileInputStream(File file); new FileinputStream("path");
构造一个FileInputStream对象之后将这个对象与文件联系,则可以使用以下方法:
read(byte X):用于单个字节文件,如果读取成功返回1,读取失败/读取完成之后返回-1,该方法是一个个字节读取,效率低,并且一个中文是三个字节,读取的时候会出现乱码
read(byte[] X):用于读取字节数组,读取成功,返回读取字节的大小,读取失败/读取完成之后返回-1,该方法读取的是一个byte数组,效率比较高
2.ObjectInputStream
3.BufferedInputStream
outputstream:
跟InputStream的操作一致
注意:FileOutputStream f = new FileOutputStream(file);这样创建的流在调用write方法会覆盖原来的内容,如果不想覆盖原来的内容可以这样创建FileOutputStream f = new FileOutputStream(file,true);
在使用write方式时,可以写入单个字符和字符串
单个字符:file.write('X');
字符串:file.write("abc".getBytes());将字符串转化成byte字节数组在进行写入,如果不转化是不能直接写入的
也可以写入字节数组
file.write(byte[] X,n,m):读取字节数组,从字节数组第n个开始读到第m个
字符流
FileRead字符输入流:从文件读取字符到程序里
和字节流的函数类似
read(char X)
FileRead也是调用read方法,不过不同的是该read方法和字节流FileinputStream的read方法相比,字符流读到的是中文是按照一个字符来很衡量,将这个中文字符转换成int类型返回出去,而字节流是一个一个字节读取 中文是一个字符,但是占3个字节,字节流每次读取到一个中文都是把中文拆成三分,每一份在返回出去之后重新编码都和原来的不一样
read(char[] X):读取一个字符数组,效率比上面的要高
FileWrite字符输出流:从程序中将字符写入文件
常用写入方法:
write('X');
write(char[] X);
write("XXX");
write("XX".tocharArray);
该如何选择,如果有字符串,应该选择Fileread和Fiewrite,也就是字符流
如果是二进制文件,应该选择字节流,这样可以做到无损
节点流和处理流:
节点流
我们在保存对象的时候有时候可能需要保存他的数据类型,比如 100这个数据 保存在文件里边是字符串,但是,他在程序里边可能是int类型 也可能是String类型,如果按照常规的写入读取方法,那我们就没有办法去判断他的数据类型了
那我们为了要保存数据的数据类型,就得引出序列化 和反序列化
序列化:保存数据时将数据类型也进行保存
反序列化:在文件写入程序时,讲文件的数据带着数据类型写入给程序
如果你需要一个对象可以被序列化/反序列化,你这个类必须要求实现Serializable接口
比如你有一个Class Dog类想要被序列化,你就需要让这个dog类去实现Serializable这个接口
这个接口是一个标记接口,里边时没有方法的,所以直接实现这个接口不用重写接口的方法
处理流:ObjectinputStream和ObjectoutputStream
他有个构造器,可以接受inputStream或者outputStream
他的功能是提供了流的序列化/反序列化
标签:文件,java,字节,字符,IO,file,读取 From: https://www.cnblogs.com/tutouaqiu/p/17003291.html