Java中File类和文件IO流的使用

File类和文件IO流的使用

  • File类的使用
    • 1.声明方法
    • File类的部分方法使用:
      • mkdirs和mkdir方法
      • 创建文件 createNewFile
      • isFile()和listFiles()
  • 文件的IO流
    • 字节流
      • 1.输出流FileOutputStream
      • 2.输入流FileInputStream
    • 字符流
      • 输出流
      • 输入流

File类的使用

1.声明方法

import java.io.File;
import java.io.IOException;

public class FileInputStreamBlog {
     
    public static void main(String[] args){
     
    	//声明的文件可以是不存在的
        //第一种实例化方法:
        File file = new File("D:\\文件夹1\\b.txt");

        //第二种实例化方法:
        //这里的file2是在file1的路径下创建的
        File file1 = new File("D:\\文件夹1");
        File file2 = new File(file1,"a.txt");
    }
}

注意:当代码要求能跨平台使用时(相对路径用的比较多),路径分隔符就要用File.separator代替,因为不同系统的默认路径分隔符可能不同,如windows的默认分隔符是“\”,而Linux系统则是“/”;所以这个File.separator就是解决这种尴尬的局面,它会根据系统而转变成对应的分隔符。做法如下:

//第一种实例化方法:
File file = new File("D:"+File.separator+"文件夹1"+File.separator+"b.txt");

File类的部分方法使用:

mkdirs和mkdir方法

File file = new File("D:\\文件夹1");
File file1 = new File("D:\\文件夹2\\a.txt");
//两者返回值都是boolean类型
file.mkdir();  //创建单个文件夹
boolean key = file1.mkdirs();  //创建该路径下所有文件夹,注意:最后创建出名为a.txt的文件夹

创建文件 createNewFile

File file3 = new File("D:\\c.txt");
file3.createNewFile();

当路径不存在时会产生IOException,程序无权限操作系统文件时会产生SecurityException 。

isFile()和listFiles()

isFile():判断是否是文件类型
listFiles():返回该file路径下一层中所有的文件和文件夹,结合可查找所需文件:

package com.huilong.Test;
import java.io.File;
import java.io.IOException;
public class FileTest {
     
    public static void main(String[] args) throws IOException {
     
        File file = new File("D:\\");
        File[] files = file.listFiles();   //返回该file路径下一层中所有的文件和文件夹   
        print(files);

    }

    public static void print(File[] files){
     
        if (files!=null && files.length!=0){
     
            for (File file1:files){
     
                if (file1.isFile()){
             //判断是否是一个文件
                    if (file1.getName().endsWith(".txt")){
     
                        System.out.println("找到一个txt文件:"+file1.getAbsolutePath());
                    }
                }else {
     
                    File[] files1 = file1.listFiles();
                    print(files1);
                }
            }
        }
    }
}

文件的IO流

字节流

1.输出流FileOutputStream

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {
     
    public static void main(String[] args) throws IOException {
     
        FileOutputStream fos = new FileOutputStream("D:\\a.txt",true);
        //1.文件不存在则创建
        //2.要抛出FileNotFoundException是因为防止文件因权限不足创建失败
        //3.这里传参传入了一个true,就是开启追加模式;如果不传默认为false,则清空原文件的内容。

        byte[] bytes ="ABCD".getBytes();    //或者{65,66,67,68}
        fos.write(bytes);

        fos.write(bytes,1,3);  //这里还可以传参,重点:第一个数是起始位置,而第二个则是个数。

        fos.write(65);  //传入一个int,则忽略高24位,取低8位,如65:A

        fos.close();   //一定记得要关闭,否则文件会被一直占用
    }
}

2.输入流FileInputStream

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest {
     
    public static void main(String[] args) throws IOException {
     
        FileInputStream fis = new FileInputStream("D:\\a.txt");
        //这里可以选择传入一个File对象

        byte b = (byte) fis.read();    
         //这里没有传参的read方法是将指针下移一位,读到的值以int形式返回,若读到没有值则返回-1
        System.out.println((char) b);

        byte[] bytes = new byte[10];
        String str="";
        while(true){
     
        	int len =fis.read(bytes);
        	//1.此read方法是返回实际读到的字节的数量,若没有新值读入则返回-1
        	//2.这里传入byte数组的read方法是用读到的新值存在数组里,覆盖旧的值,当最后读到的新值不足以覆盖旧值,那么数组里会存有旧值。               
        	//3.byte数组的大小影响整体的读入速度(下载也是一种读入)
        	if(len==-1){
     
        	break;
        	}
        	str = new String(bytes,0,len); 
        	System.out.println(str);
        }
        fis.close();
    }
}

字符流

输出流

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {
     
    public static void main(String[] args) throws IOException {
     
        FileWriter fileWriter = new FileWriter("c.txt",true);
        //1.传入true为追加模式;不传则默认为false,先清空再添加数据
        //2.文件不存在则创建

        fileWriter.write("语句1");
        //这里的append是write的升级版,append返回this对象,所以一句中可多次调用append
        fileWriter.append("语句2\n").append("语句3");
        fileWriter.close();
    }
}

输入流

1.FileReader

import java.io.FileReader;
import java.io.IOException;

public class FileReaderBlog {
     
    public static void main(String[] args) throws IOException {
     
        FileReader fileReader = new FileReader("a.txt");
        //文件不存在或某种原因不能访问时返回FileNotFoundException

        char[] word = new char[10];
        StringBuffer str = new StringBuffer();
        while (true){
     
            int len = fileReader.read(word);
            if (len==-1){
     
                break;
            }
            str.append(new String(word,0,len));
        }
        System.out.println(str);
    }
}

2.InputStreamReader
字节流装饰为字符流:使用了装饰者设计模式

import java.io.*;
public class InputStreamBlog {
     
    public static void main(String[] args) throws IOException {
     
        FileInputStream fileInputStream = new FileInputStream("a.txt");
        //转换流:字节流装饰为字符流,使用了装饰者设计模式
        //参数一:要转换的字节流
        //参数二:指定编码名称(不传则使用默认字符集)
        InputStreamReader isr = new InputStreamReader(fileInputStream,"gbk");
        char[] word = new char[10];
        isr.read(word);
        System.out.println(new String(word));
        isr.close();
    }
}

注意:这里的char数组在接收数据,占用内存会根据接收的数据类型改变而改变,如接收了UTF-8占三个字节的汉字,那么数组中存放该汉字的char位就占三个字节。

你可能感兴趣的:(Java,java)