Bootstrap

Java文件,I/O流

File

File是一个类,File类是用于描述文件或文件夹,由JDK提供。

所以使用时只需要创建对象,用其方法 

File的构造函数

1.

File(String pathname)

参数:文件或文件夹所在位置

如:File file = new File("E:\\work");

表示E盘下,work文件夹下

2

File(URI uri)
参数:文件或文件夹所在位置
URI:统一资源标识符
URL:统一资源定位符

如:
        URI uri = URI.create("E:\\work");
		File file2 = new File(uri);

表示E盘下的work文件夹

3. 

File(String parent, String child)
参数:String parent:上级文件夹路径
      String child:目标的文件或文件夹

如:File file3 = new File("E:","work");

表示E盘下的work文件夹

4. 

 File(File parent, String child)

参数: File parent:上级文件夹
      String child:目标文件夹或文件夹

例:
    File file = new File("E:\\work");

    File file4 = new File(file, "新建文件夹.txt");
        表示:表示E盘下的work文件夹中的 新建文件夹.txt文件

注意:参数中文件夹的位置可用相对路径也可以用绝对路径

相对路径:相对于当前项目根目录的位置

绝对路径:从盘符开始写

File的属性

public static final String separator = "" + separatorChar;

separator此属性用于获取当前操作系统的路径分隔符

如:

System.out.println(File.separator);

代码里的有两个\\,是编译器自己给加上的一个,用于区分 

实际上真的可以这样写,不过没必要
	File file = new File("E:"+File.separator+"work");

File的常用方法

1.createNewFile() 创建文件

	File file = new File("E:\\work\\test1.txt");//创个绝对路径
	File file1 = new File("test2.txt");//创个相对路径
	file.createNewFile();
	file1.createNewFile();

2.mkdir() 创建一级文件夹

File file = new File("E:\\work\\新建1");
	file.mkdir();
	File file2 = new File("新建2");
	file2.mkdir();

注意:文件夹与文件不可重名

3.mkdirs() 创建多级文件夹


		File file = new File("E:\\work\\01\\02\\03");
		file.mkdirs();

4.delete() 删除文件或空文件夹

	    File file = new File("E:\\work\\新建1");
		file.delete();
		

5.exists() 判断文件或文件夹是否存在返回值为boolean

	File file = new File("E:\\work\\新建1");
		
        file.mkdir();//创建
		
		System.out.println(file.exists());
		
		file.delete();//删除
		
		System.out.println(file.exists());

 

6.length() 获取文件或文件夹字节数

File file2 = new File("E:\\work\\01");
		File file3 = new File("E:\\work\\新建文本文档.txt");
		
		System.out.println(file2.length());
		System.out.println(file3.length());

 

 给文件里写个数字,就有的变化

文件的字节数是文件中内容的大小 文件夹字节数为0

7.getAbsolutePath() 获取文件或文件夹的绝对路径,返回值为String

System.out.println(file2.getAbsolutePath());
		

 

8.getAbsoluteFile() 获取文件或文件夹的绝对路径,返回值为file型

file.getAbsoluteFile();

9.getName() 获取文件或文件夹名称

file.getName();//返回值为String

10.getParent() 获取当前文件的上级文件夹路径

file.getParent();//返回值String

11.isFile() 判断file对象对应的是否为文件

file.isFile();

12.isDirectory() 判断file对象对应的是否为文件夹

file.isDirectory();

13.listFiles() 获取当前文件夹下所有的文件与文件夹(不包含子级文件与文件夹)

例:

    	File file = new File("E:\\work");
        
        File[] files= file.listFiles();//获取目录下的所有文件文件夹
     	
     	for (File f : files) {遍历
     		
     		System.out.println(f.getAbsolutePath());获取其绝对路径
			
		}

 注意,此方法读取不到文件夹子目录的东西

练一练:写一个方法能读取文件夹下的所有的文件

public class Read {
	public static void main(String[] args) {
		File file = new File("E:\\javanew");
	    read(file);	
	}
	
	public  static void read(File file) {//传入所遍历的文件夹
		if(file.isDirectory()) {//如果是文件夹
			File[] files=file.listFiles();//获取其所有文件夹与文件
			for (File f : files) {//
				System.out.println(f.getAbsolutePath());//遍历它并打印
				read(f);//自己调自己
			}
		}else {//如果是文件
			System.out.println(file.getAbsolutePath());//直接打印
		}
		
	}

}

找一下java文件

	public  static void read(File file) {//传入所遍历的文件夹
		if(file.isDirectory()) {//如果是文件夹
			File[] files=file.listFiles();//获取其内部所有文件夹与文件
			for (File f : files) {		
				read(f);//自己调自己
			}
		}else {//java肯定是文件
			if(file.getAbsolutePath().endsWith(".java")) {//使用下String方法,是否.java结尾
				System.out.println(file.getAbsolutePath());//直接打印
			}
			
		}
		
	}

 过滤器

下边两个就是过滤器,没有参数就是全拿,有参数就是过滤一下

FileFilter:文件过滤器,需要重写accept方法,每获取一个文件都会调用一下此方法

public class Guolu {
	public static void main(String[] args) {
		File file = new File("E:\\javanew");
		File[] listFiles1 = file.listFiles(new FileFilter() {
			//比如我想要文件,不要文件夹
			@Override
			public boolean accept(File pathname) {//会把所有文件都拿出来,同样不能访问子文件夹			
				if(pathname.isFile()) {	//是否为文件			
					return true;
				}//此处就是自己定义过滤方法的,不要的返回thrue
			return false;//要的返回false就行
			}
		} );	
		
		//这样listFilses1拥有的就是过滤后的东西
	}

}

FilenameFilter:文件名称过滤器

例如:

参数:

        File dir:构造方法给出的被遍历的目录
        String name:使用listFiles方法遍历目录获取的每一个文件/文件夹的名称

		File[] listFiles2 = file.listFiles(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				if(name.endsWith(".java")) {//String name得到的是文件名
					return false;//使用名称过滤
				}
				return true;
			}
		});

I/O流

作用:将程序中的数据输出到控制台,文件,网络

            将其它地方的内容输入到程序中,总体来书就是传输数据

分类:

        流向分类:

                        输入流:给程序中输入数据

                        输出流:将程序中的数据输出到其它地方

        按传输数据的最小单位分类:

                        字节流:可传输的最小单位为字节(byte),可传输任意一种数据

                        字符流:传输的最小单位字符(char),只能传递文本类文件,如文本文档:txt.word

        按功能:

                        节点流:将数据直接读取或写入

                        过滤流:在节点流基础上增加功能

字节流

体系:

         InputStream:输入字节流的定级接口

                FileInputStream:文件输入流

                BufferedInputStream:字节缓存流(输入)

                ByteArrayInputStream:内存流(输入流)

                ObjectInputStream:对象流(输入流)

        OutputStream:输出字节流的顶级接口

                FileOutputStream:文件输出流

                BufferedOutputStream:字节缓冲流(输出流)

                ByteArrayOutputStream:内存流(输出流)

                ObjectOutputStream:对象流(输出流)

InputStream提供的方法

1字节(byte)=8位(bit) 1024字节=1K 1024k=1M 

在txt文本中 字母占 1bit 汉字占 2bit

1.int read()

        作用:一次最多读取一个字节,返回值就是读取到的数据,如果没有读取到数据返回-1

	File f1=new File("a.txt");
		f1.createNewFile();//相对路径创一个文件
		FileInputStream fis = new FileInputStream("a.txt");//
		int data01 = fis.read();//读取		
		System.out.println(data01);//
		int data02 = fis.read();//读取		
		System.out.println(data02);//
		int data03 = fis.read();//读取		
		System.out.println(data03);//
		int data04 = fis.read();//读取		
		System.out.println(data04);//
		

 

 

 一次只读一个

2.int read(byte b[])

         作用:一次读取一组字节到数组b中,最多一次可以读b数组长度个字节,返回值为读取到的字节长度,值 为-1表示结束

	byte[] b = new byte[10];
		int len = fis.read(b);
		System.out.println(len);
		for (byte c : b) {
			System.out.println(c);
		}

3.int read(byte b[], int off, int len)

        作用:一次读取一组字节到数组b中,最多可以读取len个长度的字节返回值为读取到的字节长度,值为-1 表示结束,off本次读取的字节数据在数组b中存储开始的下标

4.void close()

        作用:关流

多个流先关输出在关输入

fis.close();

例:将文件读入程序中

package io;

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

public class Test2 {
	
	public static void main(String[] args) throws IOException {
		
		FileInputStream fis = new FileInputStream("E:\\Javanew\\week2\\src\\io\\Test2.java");//将这个代码读到控制台中
		
		byte[] b=new byte[1024];//存储读取数据的数组
		
		int len = 0;//记录本次数据长度,fis.read(b)的返回值,没读取到就为-1了
		
		while ((len=fis.read(b))!=-1) {
			
			String Str =new String(b,0,len);//最后一次读取,数据不一定和数组长度一致
			                                 //则会把上一轮数组的数据取出来。而0为开始长度,len为结束长度,可排除脏数据
			System.out.println(Str);
	
		}
		
		fis.close();
		
	}

}

OutputStream提供的方法 

1.void write(int b)

        作用:一次输出一字节

        FileOutputStream fos = new FileOutputStream("b.txt");//没有就自己创建一个
		//fos.write (97);用这个得传入Acssll码值

2.void write(byte b[])

        作用:将b中的字节一次输出

FileOutputStream fos = new FileOutputStream("b.txt");//没有就自己创建一个
		//fos.write (97);用这个得传入Acssll码值
		
		byte[]b="你好,世界".getBytes();//将字符串转为byte数组
		fos.write(b);
		fos.flush();
		fos.close();

3.void write(byte b[], int off, int len)

        作用:将b中字节从off位置开始输出len个

	FileOutputStream fos = new FileOutputStream("b.txt");//没有就自己创建一个

		byte[]b="你好,世界".getBytes();//将字符串转为byte数组
		fos.write(b,0,6);
		fos.flush();
		fos.close();

4.void flush()

        作用:冲刷

5.void close()

        作用:关流

如果不关流,程序不关,则此文件一直再被操作,此对象一直持有文件的引用,会浪费内存。

文件字节流

FileInputStream

作用:将指定的文件中的数据读取到程序中

        构造函数:

              1.  FileInputStream(String name)

                        参数: name:指定的文件路径

FileInputStream fis = new FileInputStream("c.txt");

              2.  FileInputStream(File file)

                        参数: file:指定的文件

	    File file = new File("d.txt");
		FileInputStream fis1 = new FileInputStream(file);

FileOutputStream

作用:将程序中的数据传递到指定的文件中

        构造函数:

                         FileOutputStream(File file)

                                参数:

                                         file:指定的文件

                        FileOutputStream(String name)

                                参数:

                                         name:指定的文件路径

                        FileOutputStream(File file,boolean append)

                                参数:

                                        file:指定的文件

                                        append:是否追加,默认值为false

                          

                         FileOutputStream(String name,boolean append)

                                 参数:

                                         name:指定的文件路径

                                         append:是否追加,默认值为false

        

      注意:                       

                         append为false时,如果指定文件不存在,则新建一级文件夹,

                                  如果文件存在,那么删除原有文 件后,重新创建

                         append为true时,

                                  如果指定文件不存在,则新建一级文件夹,

                                  如果文件存在,在原有文件尾部写 入新内容

		FileOutputStream fis = new FileOutputStream("b.txt");//创建一个,
		byte[] b = "为世界上所有的美好而战".getBytes();//将字符转为byte数组
		fis.write(b);//写入
		fis.flush();//冲刷
		fis.close();//关闭
				
		File file = new File("b.txt");//读取此文件
		FileInputStream fis1 = new FileInputStream(file);
		byte[] c = new byte[1024];//创建存储的byte数组
		int len = 0;//读取的长度
		while((len=fis1.read(c))!=-1){
            String str=new String(c,0,len);
            sout(str)
        }

        fis1.close();
		System.out.println(len);
		System.out.println(new String(c));	//将byte数组转为字符串,打印到操作台上

 

;