IO流文件和标准流

1.File

  1. 创建FIle实例

    new File(String path);

  • 测试方法的使用:

    image-20210820144743951

    image-20210820140634358

    1. renameTo(File)把文件重命名到指定的文件路径下//原来的文件会消失

      1.renameTo(File)把文件重命名到指定的文件路径下//原来的文件会消失
      boolean b = file1.renameTo(file);
      
    2. //createNewFile()如果文件存在返回false,如果这个文件不存在则创建
      //delete(),删除文件

       File file3 = new File("hello.txt");
      if( file3.createNewFile()) System.out.println("创建成功");
      if( file3.delete()) System.out.println("删除成功");
      
    3. mkdir():文件目录的创建

      delete():删除目录,要想删除成功文件下不能有东西

      // 文件目录的创建
       File file2 = new File("file");
       if (file2.mkdir()) System.out.println("目录创建成功");
       if( file2.delete()) System.out.println("目录删除成功");/
      
    4. getParent():获取当前文件的上级目录,可以用来在这个文件的同级目录下创建其他的文件

2. 流的分类

image-20210820150123131

3.流操作

  1. 文本文件,使用字符流来处理
  2. 非文本文件,使用字节流来处理
  3. FileReader和FileInputStream都可以用数组来读取,一次读取多个字符或字节

image-20210820160208022

读取文件内容
  • 读取文件的内容 1.获取文件 2. 创建处理流 3. 操作文件 4.关闭流

  • 代码发现运用FileReader字符输入流读取文件可以读取出文件中 的中文不会乱码,单纯的复制不会乱码;FileReader读取的是字符

    public class StreamTest {
        public static void main(String[] args) throws IOException {
            //  把文件里面的内容读取到控制台
            // 1. 实例化文件File,指明需要操作的文件
            File file = new File("test.txt");
            // 2. 提供一个具体的输入输出流对文件进行操作
            FileInputStream fileInputStream = new FileInputStream(file);
            // 3. 读取read();读取到文件末尾时会返回-1,每次读取read后文件指针就会后移,且读取出来的数据是int类型ascii码值
            int e = fileInputStream.read();
            while (e != -1){
                System.out.print((char) e);
                e = fileInputStream.read();
            }
            // 4.关闭流操作
            fileInputStream.close();
        }
    }
    
  • FileReader一次读取多个字符的操作

    //   FileReader一次读取多个字符
    public void test1() {
        FileReader filereader = null;
        try {
            // 1. 指定需要操作的文件并且定义操作流
            filereader = new FileReader(new File("test.txt"));
            // 2. 取数据
            char[] cufn = new char[5];
            int len = 0;
            while ((len = filereader.read(cufn)) != -1) {
                System.out.print(new String(cufn, 0, len));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //3. 关闭流资源
            try {
                filereader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
向文件写入内容
  • FileWriter注意事项

    1. 如果给出的文件File不存在,则会自动创建文件;

    2. FileWriter使用的构造器是new FileWriter(file)/new FileWriter(file,fales),在对文件进行写入操作的时候,就会对文件原来的内容进行覆写

    3. FileWriter使用的构造器是new FileWriter(file,true)就会在文件原来的内容后面追加

      public void test1() throws IOException {
          //
          File file = new File("head.txt");
          FileWriter fileWriter = new FileWriter(file,true);
          fileWriter.write("I like java");
          fileWriter.write("I like java");
          fileWriter.close();
      }
      
  • 利用FileReader和FileWrite进行文件的复制操作

        // 对一个文件进行复制
        public void test2() throws IOException {
            FileReader fileReader = null;
            FileWriter fileWriter = null;
            try {
                fileReader = new FileReader("test.txt");
                fileWriter = new FileWriter("testCopy.txt",true);
                int i;
                while ((i=fileReader.read())!=-1){
                    fileWriter.write(i);
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                System.out.println("复制完毕");
                fileReader.close();
                fileWriter.close();
            }
        }
    
3.复制图片
  • 注意事项:

    1. 由于图片的底层是一个字节流的文件,运用FileReader和FileWrite复制会出现问题,想要复制需要运用字节流(FileInputStream)来处理

      // 尝试复制一个图片,字节流的文件
      public void test3() throws IOException {
          FileInputStream fileReader = null;
          FileOutputStream fileWriter = null;
          try {
              fileReader = new FileInputStream("test.png");
              fileWriter = new FileOutputStream("testCopy.png");
              int i;
              while ((i=fileReader.read())!=-1){
                  fileWriter.write(i);
              }
      
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } finally {
              System.out.println("复制完毕");
              fileReader.close();
              fileWriter.close();
          }
      }
      

4.缓冲流

缓冲流是对原有的四个节点流的包装,提高他们的效率;工作中不会使用四种基本的节点流

缓冲流使用:Buffer+四种基本的节点流

内部提供了一个缓冲区:数据会读到缓冲区,缓冲区满了后一次性写出去,缓冲区提高了效率(flush()刷新缓冲区)

代码:利用字节流: BufferInputStream和BufferOutputStream实现对图片的复制:

 bufferedInputStream= new BufferedInputStream(fileInputStream);        bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
public void test1()  {    //    FileInputStream fileInputStream = null;    FileOutputStream fileOutputStream = null;    BufferedInputStream bufferedInputStream = null;    BufferedOutputStream bufferedOutputStream = null;    try {        // 创建输入输出流        fileInputStream= new FileInputStream("test.png");        fileOutputStream = new FileOutputStream("testCopy.png");        //  创建缓冲区,优化输入输出流        bufferedInputStream= new BufferedInputStream(fileInputStream);        bufferedOutputStream = new BufferedOutputStream(fileOutputStream);        // 读取复制文件      // 此处是字节流的Buffer        byte[] copy =new byte[1024];        int len;        while ((len = bufferedInputStream.read(copy)) != -1){            bufferedOutputStream.write(copy,0,len);        }    } catch (FileNotFoundException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    } finally {        try {            // 关闭资源,从外层开始关闭            bufferedInputStream.close();            bufferedOutputStream.close();            fileInputStream.close();            fileOutputStream.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

5.转换流

转换流也属于处理流对节点流进行包装

  1. InputStreamReader
    • 在读取的时候把读取出来的字节流数据转化为字符流的数据载入程序中
  2. OutputStreamWrite
    • 程序在将字符流的数据转化为字节流的数据写入文件

代码:实现了对文本文件的复制和显示到控制台

public void test() throws IOException {    InputStreamReader inputStreamReader = null;    OutputStreamWriter outputStreamWriter = null;    try {        inputStreamReader = new InputStreamReader(new FileInputStream("test.txt"),"UTF-8");        outputStreamWriter = new OutputStreamWriter(new FileOutputStream("testCopy.txt"),"UTF-8");        char[] copy = new char[1024];        int len;        while ((len = inputStreamReader.read(copy)) != -1) {            String s = new String(copy, 0, len);            System.out.print(s);            outputStreamWriter.write(s);        }    } catch (FileNotFoundException e) {        e.printStackTrace();    } finally {        inputStreamReader.close();        outputStreamWriter.close();    }}

6.标准的输入输出流

  1. System.in 标准的输入流,默认从键盘输入
  2. System.out 标准的输出流,默认输出到控制台

键盘获取一行字符串

public static void main(String[] args) throws IOException {    BufferedReader bufferedReader = null;    try {        bufferedReader = new BufferedReader(new InputStreamReader(System.in));        System.out.println("请输入一行字符串");        while (true){            String data = bufferedReader.readLine();            if("e".equalsIgnoreCase(data)||"exid".equalsIgnoreCase(data))  //不考虑大小写,比较是否一样                break;            System.out.println(data);        }    } catch (IOException e) {        e.printStackTrace();    } finally {        bufferedReader.close();    }}

posted @ 2021-08-20 21:05  恸的池塘  阅读(113)  评论(0)    收藏  举报