JavaIO知识简述
IO流简介
IO即input(输入)/output(输出),input就是将数据加载到计算机内存,output就是将数据加载到文件,数据库等设备中.
IO流主要包含
- | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
InputStream
抽象类,是所有字节输入流类的父类
其子类包括:
- 常用方法
-
read():返回输入流中下一个字节的数据
比如我在src目录下写一个a.txt文件,文件内容是鸡你太美
因为read方法每一次读取一个字节然后指针移到下一个字节,当返回值为-1时表示读到文件末尾InputStream inputStream= null; try { inputStream = new FileInputStream("src\\a.txt"); int read = 0; while((read=inputStream.read())!=-1){ System.out.println(read); } } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
返回值是
233
184
…因为UTF-8一个汉字占三个字节比如"鸡"用字节表示就是"233 184 161",而每次读取的是一个字 节所以不能将"鸡"展示出来
-
read(byte b[]):将输入流读取的字节存储到字节数组b中
InputStream inputStream=new FileInputStream("src\\a.txt"); byte[] b=new byte[20]; int num=0; while((num=inputStream.read(b))!=-1){ System.out.println(new String(b)); } inputStream.close();
返回结果为:“鸡你太美”
-
read(byte b[],int off,int len):在read(byte[] b)基础上增加了off(偏移量),len(最大字节数)
返回结果:
鸡你太
源码:
-
skip(long n):忽略流中的n个字节,返回实际忽略的字节数
skip(3)后执行上面的read(byte[] b)结果是"你太美"
-
OutputStream
抽象类,是所有字节输出流的父类
- 常用方法
- write(int b):将字节b写入到输出流
- write(byte b[])将字节数组b写入输出流
- write(byte[] b,int off,int len):在write(byte b[])增加off,len
- flush(): 刷新输出流,并将资源释放
这些方法作用与InputStream基本相同只是方向不同
Reader
- 如果我们不知道编码格式将文本类型转换为字符类型就会出现乱码
- JVM将字节转换为字符会消耗时间
一般像音频,图片之类的文件使用字节流,一些文本使用字符流
Reader reader=new FileReader("src/a.txt");
char[] cbuf=new char[3];
int read = reader.read(cbuf);
System.out.println(new String(cbuf));
鸡你太
- 常用方法
- read()从输入流读取一个字符
- read(char[] cbuf)从输入流读取字符存储到cbuf
- read(char[] cbuf,int off,int len)
- skip(long n)
Writer
- 常用方法
- write(int c)
- write(char[] cbuf)
- write(char[] cbuf,int off,int len)
- append(char c)
- flush()
Writer writer=new FileWriter("src/a.txt");
writer.write("sdasd");
writer.append("12");
writer.close();
源文件内容是"鸡你太美"
现在是sdasd12
write写入会覆盖原内容,append是在后面追加
缓冲流
因为IO操作效率低且消耗性能,在IO流上添加适配器,将数据加载到缓冲区,避免频繁的IO操作,提高运输效率
他们的构造方法参数为对应的抽象类的子类