Java—IO流目录
1、文件
概念
什么是文件
- 文件对我们并不陌生文件是保存数据的地方比如大家经常使用的Word文档,txt文件excel文件…都是文件。它既可以保存一张图片也可以保持视频声音…
文件流
文件在程序中以流的形式来操作
流: 数据在数据源(文件)和程序(内存)之间经历的路径
- 输入流:数据从数据源(文件)到程序(内存)的路径
- 输岀流:数据从程序(内存)到数据源(文件)的路径
常用操作
创建文件对象相关构造器和方法
相关方法
new File( String pathname)//很据路径构建一个Fle对象 new File( File parent, String child)//根据父目录文件+子路径构建 new File( String parent, String child)//根据父目录+子路径构建
获取文件相关信息
File file = new File("e:\\test.txt"); file.getName; //文件名 file.getAbsolutePath; //文件绝对路径 file.getParent; //文件父级目录 file.length; //文件大小(字节) file.exists; //文件是否存在 file.isFile; //是否为文件 file.isDirectory; //是否为目录
目录操作和文件删除
mkdir
创建一级目录、mkdirs
创建多级目录、delete
删除空目录或文件
2、IO流原理及流的分类
IO流原理:
- I/O是 :Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。
如读/写文件,网络通讯等- Java程序中,对于数据的输入/输出操作以"流( stream)"的方式进行。
- Java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方
法输入或输出数据- 输入 input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
- 输出 output:将程序(内存)数据输出到磁盘、光盘等存储设备中
IO流分类:
- **按操作数据单位不同分为:**字节流(8bit),字符流(按字符)
- **按数据流的流向不同分为:**输入流,输出流
- **按流的角色的不同分为:**节点流,处理流/包装流
(抽象基类) 字节流 字符流 输入流 InputStream
Reader
输出流 OutputStream
Writer
3、节点流和处理流
节点流可以从一个特定的数据源读写数据,如
FileReader
、FileWriter
[源码]
处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能
如
Buffered Reader
、BufferedWriter
[源码]
节点流和处理流的区别和联系
- 节点流是底层流/低级流直接跟数据源相接。
- 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。[源码理解]
处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连[模拟修饰器设计模式]处理流的功能主要体现在以下两个方面:
- 性能的提高:主要以增加缓冲的方式来提高输入输岀的效率
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使
用更加灵活方便
4、输入流
InputStream
InputStream
抽象类是所有类字节输入流的超类
FileInputStream
(文件输入流)
构造方法
/*通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。*/ FileInputStream(File file) /*创建 FileInputStream通过使用文件描述符 fdObj ,其表示在文件系统中的现有连接到一个实际的文件。*/ FileInputStream(FileDescriptor fdObj) /*通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。*/ FileInputStream(String name)
读取
read
方法@Test public void readFile01() { //文件路径 String filePath = "C:\\Users\\lying\\Desktop\\hi.txt"; FileInputStream fileInputStream = null; int read =0; try { fileInputStream = new FileInputStream(filePath); //一次读一个字节 读完返回-1 while ((read = fileInputStream.read()) != -1){ System.out.println((char) read); } }catch (IOException e){ e.printStackTrace(); }finally { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } @Test public void readFile02() { //文件路径 String filePath = "C:\\Users\\lying\\Desktop\\hi.txt"; FileInputStream fileInputStream = null; int len =0; //一次读1024个字节 byte[] buf = new byte[1024]; try { fileInputStream = new FileInputStream(filePath); //读完返回-1 while ((len=fileInputStream.read(buf)) != -1){ System.out.println(new String(buf,0,len)); } }catch (IOException e){ e.printStackTrace(); }finally { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
BufferedInputStream
(缓冲字节输入流)
构造
BufferedInputStream(InputStream in) //创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。 BufferedInputStream(InputStream in, int size) //创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。
方法
返回值 方法名 说明 int
available() 返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 void
close() 关闭此输入流并释放与流相关联的任何系统资源。 void
mark(int readlimit) 见的总承包 mark的方法 InputStream 。 boolean
markSupported() 测试这个输入流是否支持 mark和 reset方法。 int
read() 见 read法 InputStream的一般合同。 int
read(byte[] b, int off, int len) 从给定的偏移开始,将字节输入流中的字节读入指定的字节数组。 void
reset() 见 reset法 InputStream的一般合同。 long
skip(long n) 见 skip法 InputStream的一般合同。
ObjectInputStream
(对象字节输入流)
构造
ObjectInputStream() //为完全重新实现ObjectInputStream的子类提供一种方法,不必分配刚刚被ObjectInputStream实现使用的私有数据。 ObjectInputStream(InputStream in) //创建从指定的InputStream读取的ObjectInputStream。
方法
Reader
FileReader
构造方法
new FileReader(File/String);
方法
read
:每次读取单个字符,返回该字符,如果到文件末尾返回-1read(char[])
:批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
相关API:
new String(char)
:将char转换成 Stringnew String(char[],off,len)
:将char的指定部分转换成 String
BufferedReader
构造
BufferedReader(Reader in) //创建使用默认大小的输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz) //创建使用指定大小的输入缓冲区的缓冲字符输入流。
方法
返回值 方法名 说明 void close() 关闭流并释放与之相关联的任何系统资源。 Stream lines() 返回一个 Stream ,其元素是从这个 BufferedReader读取的行。 void mark(int readAheadLimit) 标记流中的当前位置。 boolean markSupported() 告诉这个流是否支持mark()操作。 int read() 读一个字符 int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。 String readLine() 读一行文字。 boolean ready() 告诉这个流是否准备好被读取。 void reset() 将流重置为最近的标记。 long skip(long n) 跳过字符
InputStreamReader
(转换流)
构造
InputStreamReader(InputStream in) //创建一个使用默认字符集的InputStreamReader。 InputStreamReader(InputStream in, Charset cs) //创建一个使用给定字符集的InputStreamReader。 InputStreamReader(InputStream in, CharsetDecoder dec) //创建一个使用给定字符集解码器的InputStreamReader。 InputStreamReader(InputStream in, String charsetName) //创建一个使用命名字符集的InputStreamReader。
方法
返回值 方法名 说明 void close() 关闭流并释放与之相关联的任何系统资源。 String getEncoding() 返回此流使用的字符编码的名称。 int read() 读一个字符 int read(char[] cbuf, int offset, int length) 将字符读入数组的一部分。 boolean ready() 告诉这个流是否准备好被读取。
5、输出流
OutputStream
FileOutputStream
(文件输出流)
构造方法
FileOutputStream(File file) //创建文件输出流以写入由指定的 File对象表示的文件。 FileOutputStream(File file, boolean append) //创建文件输出流以写入由指定的 File对象表示的文件。 FileOutputStream(FileDescriptor fdObj) //创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。 FileOutputStream(String name) //创建文件输出流以指定的名称写入文件。 FileOutputStream(String name, boolean append) //创建文件输出流以指定的名称写入文件。
写入
write
方法@Test public void writeFile(){ FileOutputStream fos = null; String filePath = "C:\\Users\\lying\\Desktop\\hii.txt"; try { fos = new FileOutputStream(filePath); //如果文件不存在将会先自动创建,再写入,存在则直接写入 一次写入一个字节 //当写入内容时会覆盖之前内容 fos.write('w'); System.out.println("写入完成"); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } @Test public void writeFile2(){ FileOutputStream fos = null; String filePath = "C:\\Users\\lying\\Desktop\\hii.txt"; String temp = "2021年1月1日,民法典正式实施。一年来," + "全国各地人民法院准确适用民法典,依法公正裁判一系列民事案件," + "内容涉及物权、人格权、侵权责任等社会生活的方方面面。" + "这些案件裁判不仅对案件当事人的生活产生具体影响," + "而且为社会公众的各类民事活动明确了规范指引、树立了行为指向,产生了积极的导向作用。"; try { fos = new FileOutputStream(filePath); //如果文件不存在将会先自动创建,再写入,存在则直接写入 一次写入一个字节数组 fos.write(temp.getBytes(StandardCharsets.UTF_8)); System.out.println("写入完成"); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
BufferedOutputStream
(缓冲字节输出流)
构造
BufferedOutputStream(OutputStream out) //创建一个新的缓冲输出流,以将数据写入指定的底层输出流。 BufferedOutputStream(OutputStream out, int size) //创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。
方法
返回值 方法名 说明 void flush() 刷新缓冲输出流。 void write(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始到缓冲的输出流。 void write(int b) 将指定的字节写入缓冲的输出流。
ObjectOutputStream
(对象字节输出流)
构造
ObjectOutputStream() //为完全重新实现ObjectOutputStream的子类提供一种方法,不必分配刚刚被ObjectOutputStream实现使用的私有数据。 ObjectOutputStream(OutputStream out) //创建一个写入指定的OutputStream的ObjectOutputStream。
Writer
FileWriter
- 构造方法
new FilleWriter(File/ String)
:覆盖模式,相当于流的指针在首端new Filewriter(Fie/ String,true)
:追加模式,相当于流的指针在尾端
- 方法
write(int)
:写入单个字符
write(char)
:写入指定数组
write(char,off,len)
:写入指定数组的指定部分
write( string)
:写入整个字符串
write( string,off,len)
:写入字符串的指定部分
相关APl: String类:toCharArray
:将 String转换成char 注意:
Filewriter
使用后,必须要关闭( close)
或刷新(fush)
,否则写入不到指定的文件!
BufferedWriter
构造
BufferedWriter(Writer out) //创建使用默认大小的输出缓冲区的缓冲字符输出流。 BufferedWriter(Writer out, int sz) //创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
方法
void close()
关闭流,先刷新。
void flush()
刷新流。
void newLine()
写一行行分隔符。
void write(char[] cbuf, int off, int len)
写入字符数组的一部分。
void write(int c)
写一个字符
void write(String s, int off, int len)
写一个字符串的一部分。
返回值 方法名 说明 void close() 关闭流,先刷新。 void flush() 刷新流。 void newLine() 写一行行分隔符。 void write(char[] cbuf, int off, int len) 写入字符数组的一部分。 void write(int c) 写一个字符 void write(String s, int off, int len) 写一个字符串的一部分。
OutputStreamWriter
(转换流)
构造
OutputStreamWriter(OutputStream out) //创建一个使用默认字符编码的OutputStreamWriter。 OutputStreamWriter(OutputStream out, Charset cs) //创建一个使用给定字符集的OutputStreamWriter。 OutputStreamWriter(OutputStream out, CharsetEncoder enc) //创建一个使用给定字符集编码器的OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) //创建一个使用命名字符集的OutputStreamWriter。
方法
返回值 方法名 说明 void close() 关闭流,先刷新。 void flush() 刷新流。 String getEncoding() 返回此流使用的字符编码的名称。 void write(char[] cbuf, int off, int len) 写入字符数组的一部分。 void write(int c) 写一个字符 void write(String str, int off, int len) 写一个字符串的一部分。
6、Properties类
构造
Properties() //创建一个没有默认值的空属性列表。 Properties(Properties defaults) //创建具有指定默认值的空属性列表。