java基础--文件File 、IO流

File 文件和目录路径名的抽象表示(调用构造方法不一定有真实的路径或文件存在,只是有一个抽象的方法指向它)

  • 构造方法

    File(File parent, String child)
    File(String pathname)
    File(String parent, String child)

  • 创建方法

    public boolean createNewFile() throws IOException//创建文件(路径不存在时先创建目录,否则抛异常)
    public boolean mkdirs()//创建多层目录
    public boolean mkdir()//创建单层目录

  • 删除方法

    public boolean delete()//多层文件(文件夹)删除 必须先删除最里面的子文件(文件夹),否则删除失败

注:

1. 如果创建的文件或目录忘记写磁盘路径,则默认为项目路径
2. Java中的删除不走回收站
3. 要删除一个文件夹,该文件夹内不能包含文件或者文件夹

  • 重命名方法

public boolean renameTo(File dest) 重命名功能

File file3 = new File("a.txt");
file3.createNewFile();
System.out.println("rename:"+file3.renameTo(new File("b.txt")));
System.out.println("rename:"+file3.renameTo(new File("e:\\b.txt")));	

注:
1. 如果路径相同,则修改文件名
2. 如果路径不同,则想当与剪切并改名

  • 常用方法

    public File getAbsolutePath() 获取文件绝对路径
    public String getPath() 获取文件相对路径
    public String getName()(获取文件名称
    public long lastModified()//返回文件最后一次修改时间(毫秒)
    public long length()返回由此抽象路径名表示的文件的长度(字节数)。 如果此路径名表示目录,则返回值未指定。

    public String[] list()获取指定目录下的文件和目录字符串数组
    public File[] listFiles()获取指定目录下的所有文件或者文件夹的File数组

      File file4 = new File("e:\\");
      String[] strs = file4.list();
      for(String str:strs ){
          System.out.println(str);
      }
    
    /* 
      testworkspace
      var
      workerId
      小程序项目
      工作总结
      */
    
      File file5 = new File("e:\\");
      File[] files = file5.listFiles();
      for(File file : files ){
     		 System.out.println(file);
      }
      /*
      e:\testworkspace
      e:\var
      e:\workerId
      e:\小程序项目
      e:\工作总结
      */    
    

eg:查找某个磁盘下以.txt结尾的文件

例一:思路:获取某磁盘文件对象,遍历该磁盘下所有文件,输出符合条件的文件

  public static void main(String[] args) {
    File file = new File("e:\\");
    File[] files = file.listFiles();
    for(File f :files){
        //判断是否是文件
        if(f.isFile()){
            //判断是否是以.txt 结尾
            if(f.getName().endsWith(".txt")){
                System.out.println("返回结果:"+f.getName());
            }
        }
    }

例二:获取某磁盘下的String文件数组,一一判断过滤

 public static void main(String[] args) {
		File file = new File("e:\\");
		   //获取该路径下所有文件的string数组(并过滤不符合要求的str)
		   String[] strArray = file.list(new FilenameFilter() {
		   @Override
		    public boolean accept(File dir, String name) {
		           File file = new File(dir,name);
		           boolean flag = file.isFile();
		           boolean flag1 = name.endsWith(".txt");
		           return flag && flag1;
				 
		            }
		       });
	 
        for (String s: strArray){
            System.out.println("输出结果:"+s);
        }
}

注:== accept()方法可简写如下: return new File(dir,name).isFile() && name.endsWith(".jpg");==

IO流

  • 分类
    1.按流向

    输入流 (读数据)
    输出流(写数据)

2.按数据类型
字节流

字节输入流(InputStream)
字节输出流(OutputStream)

字符流(为方便操作文本数据,java提供了字符流)

字符输入流(Reader)
字符输出流(Writer)

  • 字节流学习

OutputStream(抽象类)常见方法

  1. 将给定的字节数组内容全部输出:public void write(byte b[]) throws IOException
  2. 将部分字节数组内容输出:public void write(byte b[], int off, int len) throws IOException(重点)
  3. 输出单个字节:public abstract void write(int b) throws IOException

eg1:

 public static void main(String[] args) throws IOException {
 	 //创建文件输出流
        FileOutputStream fos = new FileOutputStream("fos.txt");
        fos.write("hello IO".getBytes());
        //释放资源       
        fos.close();
    }	

创建文件输出流作用

1.创建文件fos.txt
2.创建fos.txt对象
3.将对象指向文件

close作用

1.让对象变成垃圾,这样就可以被垃圾回收器回收了

2.通知系统去释放跟该文件相关的资源

实现让数据换行

 fos.write("\r\n".getBytes());

注: 不同系统针对不同换行符识别不一样

windows: \r\n
linux: \n
Mac: \r

在计算机中中文存储分两个字节:第一个字节肯定是负数,第二个字节常见的是负数,有可能有正数,但是没有影响

eg2.将D盘下的ab.png 存储到该项目目录下(一次读一个字节)

 public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:\\ab.png");
   		FileOutputStream fos  = new FileOutputStream("mn.png");
        int by = 0;
        while((by = fis.read())!= -1){
            fos.write(by);
        }
        fos.close();
        fis.close();
}

eg3.输出a.txt内容 (一次读一个字节数组)

 public static void main(String[] args) throws IOException {
        //文件输入流
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos  = new FileOutputStream("b.txt");
        byte[] bytes = new byte[5];
       
        //第一次
        int len = fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));

        //第二次
         len = fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));

        //第三次
        len = fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));

        //第四次
        len = fis.read(bytes);
        System.out.println(len);
        System.out.println(new String(bytes));
    }

输出结果:

5
hello
5

wor
2
ldwor
-1
ldwor
第一次输出 hello
第二次输出 \r\nwor
第三次输出 ldwor
第四次输出  ldwor

eg4:代码简(优)化:

public static void main(String[] args) throws IOException {
    //文件输入流
    FileInputStream fis = new FileInputStream("a.txt");
    FileOutputStream fos  = new FileOutputStream("b.txt");
    byte[] bytes = new byte[5];
    int len = 0;
    while((len = fis.read(bytes))!= -1){
        fos.write(bytes,0 ,len);
    }
}
  • 字符流学习

    字符流 = 字节流+编码表
    在这里插入图片描述

  • OutputStreamWriter构造方法

    public OutputStreamWriter(OutputStream out)(根据默认编码将字节流的数据转换为字符流)

    public OutputStreamWriter(OutputStream out,Charset cs) (根据指定的编码把字节流转换为字符流)

  • write方法

    public void write(char[] cbuf, int off, int len) throws IOException

    public void write(String str, int off, int len) throws IOException

    public void write(int c) throws IOException

  • OutputStreamWriter构造方法

    public InputStreamReader(InputStream in)

    public InputStreamReader(InputStream in, CharsetDecoder dec)

  • read方法

    public int read() throws IOException

    public int read(char[] cbuf, int offset, int length) throws IOException

eg1:将字符串写入文件

public static void main(String[] args) throws IOException {
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt") );
    osw.write("a");
    osw.close();
}

注:当写入一个字符时,a.txt中没有文件,原因是:方法默认写入一个字符,a为一个字节,写入的a在缓冲流中,所以需要调用 osw.flush()

eg2:读取输入流输出到控制台

 public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
        int len = 0;
        while ((len = isr.read()) != -1) {
            System.out.print((char) len);
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值