JavaSE 第五章 IO流---File类、字节流、字符流

5. IO流

5.1 File类

5.1.1 文件对象的构造

这个类对一个文件(夹)的描述。

关于路径分隔符:

路径分隔符是对目录的分隔。表示一层嵌套关系。

在windows系统下,分隔符是:\

在UNIX体系下,分隔符是:/

构造方法参数
File(String pathName)使用一个指定的文件路径来实例化一个File对象
File(String parent, String name)给定一个父目录路径和一个子文件名字,系统会自动的将其拼接在一起
File(File parent, String child)给定一个父目录和一个子文件的名字,系统自动拼接路径
public class FileDemo {
	   public static void main(String[] args) {
            //File构造函数演示
            String pathName = "hello.java";
            File f1 = new File(pathName);
            System.out.println(f1);

            File f2 = new File("/Users/IdeaProjects/JavaSE","hello.java");
            System.out.println(f2);

            //将parent封装成file对象。
            File dir = new File("/Users/IdeaProjects/JavaSE");
            File f3 = new File(dir,"hello.java");
            System.out.println(f3);
        }
}
5.1.2 文件和文件夹的常用方法
常用方描述
boolean exists()用来描述指定的路径下到底有没有文件(夹)存在。
boolean isFile()判断指定路径的内容是不是一个文件
boolean isDirectory()判断指定路径的内容是不是一个文件夹
boolean mkdir()在指定的路径创建文件夹,返回值代表创建成功还是失败
boolean mkdirs()在指定的路径创建文件夹,可以创建多级目录
boolean createNewFile()在指定的路径创建一个空文件,会有一个IOException
boolean isHidden()判断一个文件是否是隐藏的
 public static void main(String[] args) throws IOException {
                // 对文件或者文件加进行操作。
                File file = new File("/Users/IdeaProjects/JavaSE/file.txt");
                //获取文件的绝对路径,即全路径
                String absPath = file.getAbsolutePath();
                //File中封装的路径是什么获取到的就是什么。
                String path = file.getPath();
                //获取文件名称
                String filename = file.getName();
                //获取文件大小
                long size = file.length();

                System.out.println("absPath="+absPath);
                System.out.println("path="+path);
                System.out.println("filename="+filename);
                System.out.println("size="+size);

                // 创建文件,如果文件不存在,创建 true 如果文件存在,则不创建 false。 
                // 如果路径错误,IOException。
                boolean file1 = file.createNewFile();
                System.out.println("file1=" + file1);
                //-----------删除文件操作-------注意:不去回收站。慎用------
                boolean flag = file.delete();
                System.out.println("flag="+flag);

                //-----------需要判断文件是否存在------------
                boolean falg1 = file.exists();
                System.out.println("falg1="+falg1);

                //-----------对目录操作 创建,删除,判断------------
                File dir = new File("/Users/IdeaProjects/JavaSE/");
                //mkdir()创建单个目录。//dir.mkdirs();创建多级目录
                boolean flag2 = dir.mkdir();
                System.out.println("flag2="+flag2);
                //删除目录时,如果目录中有内容,无法直接删除。
                boolean flag3 = dir.delete();
                //只有将目录中的内容都删除后,保证该目录为空,这个目录才可以删除。
                System.out.println("flag3=" + flag3);

                //-----------判断文件,目录------------
                File file3 = new File("/Users/IdeaProjects/JavaSE/");
                 // 要判断是否是文件还是目录,必须先判断存在。
                System.out.println(file3.isFile());
                System.out.println(file3.isDirectory());

                //-----------目录遍历------------
                File dir1 = new File("/Users/IdeaProjects");
                //获取的是目录下的当前的文件以及文件夹的名称。
                String[] names = dir.list();
                for(String name : names){
                    System.out.println(name);
                }
                //获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
                File[] files = dir.listFiles();
                for(File file4 : files){
                    System.out.println(file4);
                }
            }


5.1.3 文件过滤器

实现自己的文件过滤器

public class FileDemo{
	public static void main(String[] args) {
		//获取扩展名为.java所有文件
		//创建File对象
		File file = new File("/Users/IdeaProjects");
		//获取指定目录下的文件夹
		File[] files = file.listFiles(new FileFileterByDir());
		//遍历获取到的所有符合条件的文件
		for (File f : files) {
			System.out.println(f);
		}
	}
}
自定义类继承FileFilter过滤器接口
//文件过滤器
class FileFileterByDir implements FileFilter{
	public boolean accept(File pathname) {
		return pathname.isDirectory();
	}
}

5.2 流的分类

分类:

方向:输入流和输出流

数据单元:字节流和字符流

InputStream: 字节输入流的超类

OutputStream: 字节输出流的超类

Reader: 字符输入流

Writer: 字符输出流

无论是使用什么流,在使用结束之后,一定要记得关闭这个流。

5.3 字节流

InputStream:

int read(byte[] arr):

参数:从流中读取数据,需要使用到一个字节数组。read方法会将读取到的数据填充到这个字节数组中。所以,读取完成后,我们直接从这个字节数组中取数据即可。

返回值:每次读取数据后,返回这一次读取到了多少个字节的数据。如果这个方法返回值为-1,说明本次没有读取到任何数据,读取完成。


 class FileInputStreamDemo {
     public static void main(String[] args) throws Exception {// 先声明
         InputStream is = null;
         try {
             // 实例化一个流
             is = new FileInputStream(new File("/Users/IdeaProjects/JavaSE/src/kaikeba/com/ArraysDemo.java"));
             // InputStream: 字节输入流,数据是以字节为单位
             // 从管道中读取数据:
             // 实例化一个数组,用来存储每次读取到的数据
             byte[] contents = new byte[100];
             // 用来记录每次读取到了多少数据
             int length = 0;
             // 循环读取,将每次读取到的数据长度给length赋值,并判断是否为-1
             while ((length = is.read(contents)) != -1) {
                 // 通过一个字节数组实例化一个字符串
                 String str = new String(contents, 0, length);
                 System.out.print(str);
             }

         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } finally {
             // 判断是否为空,因为如果最开始实例化的时候,文件不存在,则is实例化失败,依然为null
             // 此时,如果is是null,那么再去关闭的时候,就会出现NullPointerException
             if (is != null) {
                 try {
                     is.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }
 }

outputStream:操作的数据都是字节,定义了输出字节流的基本共性功能方法。

OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。

FileOutputStream类,即文件输出流,是用于将数据写入 File的输出流。

public class FileOutputStreamDemo2 {
    public static void main(String[] args) throws Exception {
        File file = new File("myfile.txt");
        FileOutputStream fos = new FileOutputStream(file, true);
        String str = "\r\n"+"kaikeba.com";
        fos.write(str.getBytes());
        fos.close();
    }
}

5.4 字符流

Reader:字符输入流

Writer:字符输出流

写操作

	public static void main(String[] args) throws IOException {
		//1.创建FileWriter的对象并关联对应的文件
		//注意点:
		//一:如果只写文件的名字,不写具体路径,默认路径是当前的工程
		//二:对于关联的文件,如果之前不存在,程序会自动创建一个,如果存在,会将原来的内容覆盖
		//三:可以自己指定路径,但是必须保证路径是真实存在的,否则报异常---FileNotFountException(系统找不到指定的路径。)
		FileWriter fileWriter = new FileWriter("fileWrite.txt");
		//调用写入方法
		//注意点四:在执行write方法时,数据被临时放到了流对象的内部数组中,这个数组是一个字节数组,会默认去查编码表
		fileWriter.write("晨晨");
		//刷新---将临时数组中的数据放入磁盘
		//fileWriter.flush();
		//4.关闭流--两个功能:a:关闭流  b:刷新
		//第五个注意点:流对象使用完后必须关闭
		fileWriter.close();
		//第六个注意点:当流对象关闭之后,不能再进行操作,否则会报异常:Stream closed
		//fileWriter.write("haha");
	}

读操作

	public static void main(String[] args) throws IOException {
		//1.创建文件读入流
		FileReader fileReader = new FileReader("/Users/IdeaProjects/JavaSE/src/kaikeba/com/ArraysDemo.java");
		//开始读操作
		/*
		 * read():一个字符一个字符的读,每次读出一个字符
		 */
		//a:将当前的字符读出    b:将当前的指针后移一位
		int  value;
		while ((value = fileReader.read()) != -1) {
			System.out.println((char)value);
		}
		
		fileReader.close();
	}
	public static void main(String[] args) throws IOException {
		//1.创建文件读入流
		FileReader fileReader = new FileReader("/Users/liyunxia/IdeaProjects/JavaSE/src/kaikeba/com/ArraysDemo.java");
		//开始读操作
		/*
		 * read(数组):一次可以读出多个字符   ,数组的作用:每次会将读出的字符临时放到这个数组中
		 */
		/* 数组是临时存放数据的地方,我们会将读到的字符放到临时数组中,数组的大小决定了我们一次可以读到的字符个数.
		 * 一般这个数组的大小<=1kB
		 * 返回值代表本次读到的真实的字符个数,如果返回值是-1代表读完了.
		 */
		char[] cbuf = new char[2];
		int num ;
		while ((num = fileReader.read(cbuf)) != -1) {
			//System.out.println(new String(cbuf)+"    num:"+num);
			System.out.println(new String(cbuf,0,num)+"    num:"+num);
		}
		fileReader.close();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我,Zack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值