• 中文
    • English
  • 注册
  • 查看作者
    • Java-IO:File和字节输入输出流

      一. File类

      我们可以通过File类的一个接受字符串类型的构造方法来创建一个File实例

      File(String pathname)// 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

      有了该实例,我们就可以通过下面的方法在指定路径下下创建和删除文件:

      • boolean  exists():判断文件或者目录是否存在

      • boolean createNewFile():创建文件

      • boolean delete():删除文件

      package io.zhangjia.io;
      
      import java.io.File;
      import java.io.IOException;
      
      public class File{
          public static void main(String[] args) throws IOException {
         
      //                zhangjia文件夹是存在的
              File file = new File("E:\\zhangjia\\text.txt");
      
              if(!file.exists()){
      //            这里先不处理异常,先抛出
                  file.createNewFile();//如果E盘的zhangjia文件夹下的text.txt不存在,就创建这个文件
      
              } else {
                  file.delete();//  如果存在,就删除这个文件
              }
      
          }
      }

      上面的例子中,在E盘下,zhangjia的文件夹是已经存在的,所在可以直接在该路径下判断test.txt是否存在

      但是如果zhangjia文件不存在,或者zhangjia文件下还有多级目录,则需要先判断上机目录是否存在,才能去创建和删除test.txt文件

      • File getParentFile():获取上级目录

      • boolean  mkdirs():创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。 

      package io.zhangjia.io;
      
      import java.io.File;
      import java.io.IOException;
      
      public class File {
          public static void main(String[] args) throws IOException {
      
              File file = new File("E:\\zhangjia\\a\\b\\c\\text.txt");
              
              
              if(!file.getParentFile().exists()){ //如果上级目录不存在
                  file.mkdirs(); //则递归创建所有不存在的上级目录
              }
      
              if(!file.exists()){
      //            这里先不处理异常,先抛出
                  file.createNewFile();//如果text.txt不存在,就创建这个文件
      
              } else {
                  file.delete();//  如果存在,就删除这个文件
              }
      
          }
      }

      二.  InputStream:字节输入流

      字节输入流的操作步骤:

      1. 使用File类确定要操作的文件

      2. 使用InputStream的子类FileInputStream进行对象实例化

      3. 进行读操作

      4. 释放资源

      我们可以使用字节输入流来读取本地磁盘的文件内容:

      int read() :从此输入流中读取一个数据字节。 

      int read(byte[] b) : 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 返回读入缓冲区的字节总数,如果已经到达文件末尾而没有更多的数据,则返回 -1。 

      int read(byte[] b, int off, int len) :从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。返回读入缓冲区的字节总数

      接下来,我们在text.txt中存入下面的内容:

      ABCDEFGHIJKLMNOPQRSTUVWXYZ

      然后读取上面的文件内容:

      package io.zhangjia.io;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.util.Arrays;
      
      public class FileInputStream {
          public static void main(String[] args) throws IOException {
              File file = new File("E:\\zhangjia\\text.txt");
              FileInputStream is = new FileInputStream(file);
      
      //        不带参数的read方法,每次只读文件的单个字符
              int read = is.read();
              System.out.println("read = " + read); //read = 65
              read = is.read();
              System.out.println("read = " + read); //read = 66
      
      
              byte[] bytes = new byte[20];
              int read2 = is.read(bytes);
              System.out.println("read2 = " + read2); //read2 = 20
              String s = new String(bytes);//将字节数组转换为字符串
              System.out.println("s = " + s); // s = CDEFGHIJKLMNOPQRSTUV
      
              byte[] bytes2 = new byte[20];
              int read3 = is.read(bytes2,1,2);
              System.out.println(Arrays.toString(bytes2));
      //      [0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
              is.close();
      
          }
      }

      上面我们已经说过,read的带一个参数和带两个参数的方法,如果已经到达文件末尾,返回值都是-1,我们便可以利用这个特性来循环遍历文件的所有内容:

      package io.zhangjia.io;
      
      import jdk.nashorn.internal.ir.WhileNode;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.util.Arrays;
      
      public class FileInputStream {
          public static void main(String[] args) throws IOException {
      //        1. 使用File确定要读取的文件
              File file = new File("E:\\zhangjia\\text.txt");
      //        2.  实例化FileInputStream
              FileInputStream is = new FileInputStream(file);
      //        3.   开始读
              byte[] bytes = new byte[512];//长度任意,但是建议给偶数,防止中文乱码,其实偶数也有可能会中文乱码
              StringBuffer sb = new StringBuffer();
              int len = -1;
              while((len = is.read(bytes)) != -1){
                    /*
                      通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的String,新 String 的长度是字符集的函数
               bytes - 要解码为字符的 byte
               offset - 要解码的第一个 byte 的索引
               length - 要解码的 byte 数
              */
                  String s = new String(bytes,0,len);
              /*还可以再加一个参数,String(byte[] bytes, int offset, int length, String charsetName) 
              通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。比如:
              String s = new String(bytes,0,len,"UTF-8");
               */
                  sb.append(s);
              }
              System.out.println(sb);
              //输出:ABCDEFGHIJKLMNOPQRSTUVWXYZ
              is.close();
      
      
      
      
          }
      }

      二.  OutputStream:字节输出流

      字节输入流的操作步骤:

      1. 使用File类确定要操作的文件

      2. 使用OutputStream的子类FileOutputStream进行对象实例化

      3. 进行写操作

      4. 释放资源

      package io.zhangjia.io;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      
      public class FileOutputStream{
          public static void main(String[] args) throws IOException {
      //        1. 使用File确定要写入的文件
              File file = new File("E:\\zhangjia\\text.txt");
      //        2.  实例化FileOutputStream
      //        FileOutputStream os = new FileOutputStream(file); //替换原文件的所有内容
                FileOutputStream os = new FileOutputStream(file,true);//在原文件内容基础上添加内容
      //        3.   开始写
                String str = "zhangjia";
                byte[] bytes = str.getBytes();//将字符串转换为字节数组
      //          os.write(bytes); //全部写入
                os.write(bytes, 0, 2); //只写入两个,此时原文件变成了:ABC....XYZzh
                os.close();
      
      
          }
      }

      山东省
    • 0
    • 0
    • 0
    • 1.5k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: