I/O流常用复制和读取文件

一、简介

你要把一个视频,拷贝到你的电脑硬盘里,这个可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出 output ,即流向内存是输入流,流出内存的输出流。

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写 出数据。

1、IO的分类

根据数据的流向分为:输入流和输出流。

输入流 : 把数据从 其他设备 上读取到 内存 中的流。

输出流 : 把数据从 内存 中写出到 其他设备 上的流。

格局数据的类型分为:字节流和字符流。

字节流 : 以字节为单位,读写数据的流。

字符流 : 以字符为单位,读写数据的流。

2、顶级父类

输入流 输出流
字节流 字节输入流 InputStream 字节输出流 OutputStream
字符流 字符输入流 Reader 字符输出流 Writer

二、读入文件

1、FileInputStream类方法

常用的方法:

public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

读取单个字节:

FileInputStream fis = new FileInputStream("fos.txt");
int b;
while ((b=fis.read())!=-1){
    System.out.println((char)b);
}
fis.close();

读取到数组中:

FileInputStream fis = new FileInputStream("fos.txt");
int len;
byte[] bytes = new byte[4];
while ((len = fis.read(bytes)) != -1) {
    System.out.println(new String(bytes));
}
fis.close();

2、FileReader类方法

常用的方法

public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 从输入流读取一个字符。
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

读取单个字符

  FileReader fileReader = new FileReader("fos.txt");
  int b;
  while ((b=fileReader.read())!=-1){
      System.out.println((char)b);
  }
  fileReader.close();
}

读取到数组中:

 FileReader fileReader = new FileReader("fos.txt");
 int len;
 char[] chars = new char[3];
 while ((len=fileReader.read(chars))!=-1){
     System.out.println(new String(chars));
 }
fileReader.close();

读取到数组中(按位读取)

  FileReader fileReader = new FileReader("fos.txt");
  int len;
  char[] chars = new char[3];
  while ((len=fileReader.read(chars))!=-1){
      System.out.println(new String(chars,0,len));
  }
  fileReader.close();
}

3、读一行文件:(字符缓冲流)

常用方法:

BufferedReader: public String readLine() : 读一行文字。

代码:

    BufferedReader br = new BufferedReader(new FileReader("fos.txt"));
//    读取一行文件内容
    String line = br.readLine();
//    循环所读文件的所有内容
    String end;
    while ((end=br.readLine())!=null){
        System.out.println(line);
    }

三、写出文件

1、FileOutputStream类方法

使用IO输出文件的方式:

FileOutputStream fos=null;
try {
  //方法一:
    fos = new FileOutputStream("D://fos.txt");
    fos.write(97);
  //方法二:
    byte[] bytes = "你好吗".getBytes();
    fos.write(bytes);
  //方法三:
    byte[] b = "abcde".getBytes(); 
    // 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。 
    fos.write(b,2,2);
} catch (Exception e) {
    e.printStackTrace();
 } finally {
    try {
       fos.close();
 } catch (IOException e) {
     e.printStackTrace();
   }
}

每次程序运行,创建输出流对象,都会清空目标文件中的数据。如果想要在每次是增量的输出的话,就得使用下面的两个构造方法;

public FileOutputStream(File file, boolean append) : 
创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name, boolean append) : 
创建文件输出流以指定的名称写入文件。

这两个构造方法,参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据。

这样创建的输出流对象,就可以指定是否追加续写了;

FileOutputStream fos = new FileOutputStream("fos.txt"true);

系统中的换行符:

Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;
Unix系统里,每行结尾只有 换行 ,即 \n ;
Mac系统里,每行结尾是 回车 ,即 \r 。从 Mac OS X开始与Linux统一。

2、FileWriter类方法

public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
public void write(int c) :写出一个字符。
public void write(char[] cbuf) :将 b.length字符从指定的字符数组写出此输出流。
public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
public void write(String str) :写出一个字符串

flush会把之前的内容收写出到文件中,每次的flush都会刷新写出到文件中,最后close关闭资源的时候,也会写出一次数据; 实时刷新数据到文件中

  FileWriter fw = new FileWriter("ddd.txt");
  fw.write(97);
  fw.flush();
  fw.write('f');
  fw.flush();
  fw.write('9');
  fw.flush();
  fw.close();

写出内容到文件

        FileWriter fw = new FileWriter("test.txt");
//        写出char类型内容
        fw.write(48);
        fw.flush();
//        写出字符串
        fw.write("好的");
        fw.flush();
//        写出char型数组
        char[] chars = {'1','2', '3','4','5'};
        fw.flush();
//        写出字符串指定内容
        fw.write(chars);
        fw.write("qwert",2,3);
        fw.flush();
//        写出char型数组指定内容      
        fw.write(chars,2,2);
        fw.flush();
        
        fw.close();

四、复制文件

1、字节流方式

     // 1.创建读入的对象
    FileInputStream fis = new FileInputStream("D:\\test.jpg");
	//1.2 创建写出的对象
    FileOutputStream fos = new FileOutputStream("test_copy.jpg");
     // 2.读写数据
        byte[] b = new byte[1024];
        int len;
        while ((len = fis.read(b))!=-1) {
            fos.write(b, 0 , len);
        } 
    // 3.关闭资源
        fos.close();
        fis.close();

2、缓冲流方式

  BufferedInputStream fis = new BufferedInputStream(new FileInputStream("fos.txt"));
  BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("copy.txt"));
  int len;
  while ((len=fis.read())!=-1){
      fos.write(len);
  }
  fis.close();
  fos.close();
posted @ 2019-12-23 15:16  ah_lydms  阅读(142)  评论(0编辑  收藏  举报