OutputStream

OutputStream:字节输出流的根类(基类,顶级父类),定义了所有字节输出流应该具备的方法
FileOutputStream:文件输出流是用于将数据写入文件的输出流

public abstract void write(int b)写入一个字节
public void writer(byte[] b) 写出 一个字节数组的字节
public void close() 关闭io资源

  1. fos.write(0b01100001);//当前输入的是一个a的二进制字节码
  2. fos.write(97);
  3. fos.write('a');

输出流的源代码实现:如果输出时没有该文件,则会先创建该文件,再输出数据
默认的写出是覆盖掉了文件以前的内容,如果想每次运行程序写出数据不覆盖之前的内容,使用特定的构造方法
public FileOutputStream(String name,boolean append) append参数:是否追加数据

在FileOutputStream的构造方法当中,指定的io资源可以是文件对象,也可以是文件路径,其本质是相同的。
一般情况下直接使用给予文件路径的方式创建IO流对象,因为源代码中会自动帮助我们创建File对象。

InputStream

InputStream:字节输入流的根类(基类,顶级父类),定义了所有字节输入流应该具备的方法
FileInputStream:文件输入流是用于从文件当中读取数据的输入流

  1. public static void main(String[] args) throws Exception {
  2. //读取当前项目下的StringDemo.java文件
  3. FileReader fr = new FileReader("StringDemo.java")
  4. //一次读取一个字符数组
  5. char[] chs = new char[1024] ;
  6. int len = 0 ;
  7. while((len=fr.read(chs))!=-1) {
  8. System.out.println(new String(chs,0,len));
  9. }
  10. //释放资源
  11. fr.close();

public int read() 一次读取一个字节,返回的就是这个字节本身,读取到文件末尾返回-1

  1. package test1;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. public class FileCopy {
  6. public static void main(String[] args) throws IOException {
  7. FileInputStream in = new FileInputStream("a.txt");
  8. FileOutputStream out = new FileOutputStream("b.txt");
  9. int b = 0;
  10. while((b=in.read())!=-1){
  11. out.write(b);
  12. }
  13. out.close();
  14. in.close();
  15. }
  16. }

public int read(byte[] b):读取一个字节数组,返回是本次读取的字节个数,参数用于每次存储字节数据的数组,读取到文件末尾返回-1

  1. package test1;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.RandomAccessFile;
  6. public class FileCopy2 {
  7. public static void main(String[] args) throws IOException {
  8. FileInputStream in = null;
  9. FileOutputStream out = null;
  10. try {
  11. in = new FileInputStream("a.txt");
  12. out = new FileOutputStream("c.txt");
  13. byte[] b = new byte[10];
  14. int len = 0;
  15. while((len=in.read(b))!=-1){
  16. out.write(b,0,len);
  17. }
  18. }catch (IOException e){
  19. }finally {
  20. if(out!=null){
  21. out.close();
  22. }
  23. if(in!=null){
  24. in.close();
  25. }
  26. }
  27. }
  28. }

image.png

  • 高效流 - 高级流
  • 原理:缓存区 - 临时存放多个数据,一次性调用底层的资源,减少调用的次数,从而提升程序运行的效率
  • 所以在高级流的低层需要一个低级流作为支撑

  • 高效字节流的api:
  • BufferedInputStream/BufferedOutputStream

  • 高效流和普通流基本一样,高效流使用普通流作为构造函数的参数,在普通流的基础上增加了缓存区

  • 高效write写出的时候,写出的位置是在缓存区,并不是目标资源
  • 需要通过flush()方法将缓存区中的内容写到目标资源中 - 目的是提高效率

  • 方法:
  • void flush() - 刷新缓存区
  • void close() - 关闭流,关闭前调用flush()方法

读取文本打印到控制台

  1. package test1;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.jar.JarOutputStream;
  6. /**
  7. *读取文本打印到控制台
  8. */
  9. public class FileInputStreamTest2 {
  10. public static void main(String[] args) throws IOException {
  11. FileInputStream fis = new FileInputStream("a.txt");
  12. ArrayList<Byte> list = new ArrayList<>();
  13. byte b[] = new byte[50];
  14. int len=0;
  15. while ((len=fis.read(b))!=-1){
  16. //准确的获取每一个元素
  17. for (int i = 0; i < len; i++) {
  18. list.add(b[i]);
  19. }
  20. //System.out.print(new String(b,0,len));
  21. }
  22. byte[] bytes = listToArray(list);
  23. System.out.println(new String(bytes,0,bytes.length));
  24. fis.close();
  25. }
  26. //定义一个方法,传入一个ArrayList集合,集合的泛型是数组,将集合中所有数组拼接在一起,返回一个大数组
  27. public static byte[] listToArray(ArrayList<Byte> list){
  28. //计算list中每个元素的长度,求总长度len
  29. int len = list.size();
  30. //根据总长创建一个大数组
  31. byte[] bytes = new byte[len];
  32. //嵌套遍历list元素的每个元素,有序取出有序放去大数组
  33. for (int i = 0; i < list.size(); i++) {
  34. bytes[i] = list.get(i);
  35. }
  36. //返回大数组
  37. return bytes;
  38. }
  39. }