Java基础之输入/输出流,File类

流:

        流的概念:
                流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流 I/O(Input/Output)流提供类一条通道程序,可以使用这条通道把源中的字节序列送到目的地;

        输入流:读字符或字节
                InputStream类:是字节输入流的抽象类,是所有字节输入流的父类;
                Reader类:是字符输入流的抽象类,所有字符输入流的实现都是他的子类;

        输出流:写字符或字节
                OutputStream类:是多有字节输出流的抽象类,此抽象类是所有字节流的所有类的超类;

                Writer类:是字符输出流的抽象类,所有字符输出类的实现都是他的子类;


File类:

        表示文件或者目录的路径的抽象表现形式,IO流就是对文件进行操作的;

        创建文件:
        举例:

public class FileDemo {

	public static void main(String[] args) {
		
		//表示:e盘下的demo文件夹中的a.txt文件
		//E:\\dmeo\\a.txt
		
		//public File(String pathname):表示pathname的抽象路径表现的形式
		File file = new File("E:\\demo\\a.txt") ;
		System.out.println(file);
		
		//public File(String parent,String child)
		File file2 = new File("E:\\demo","a.txt");
		System.out.println(file2);
		
		//3.public File(File parent, String child)
		File file3 = new File("E:\\demo") ;
		File file4 = new File(file3, "a.txt") ;
		System.out.println(file4);
		
		//三种方式都可以使用(表示文件/目录的路径的抽象形式),根据具体的要求(第一种方式最常用的)
		
	}
}
        跟创建相关的功能:
        public boolean createNewFile():创建文件,当文件不存在的时候,创建此抽象路径下的文件;
                注意:检查文件是否存在,若不存在则创建该文件,如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false ;
        public boolean mkdir():创建一个文件夹,如果文件夹存在,不创建;

        public boolean mkdirs():创建文件夹,如果父目录不存在,会创建此目录;

        举例:

public class FileDemo2 {
	
	public static void main(String[] args) throws IOException {
		
		//E盘下创建demo文件夹
		File file = new File("e:\\demo") ;
		File file6 = new File("e:\\test") ;
		System.out.println("mkdir:"+file.mkdir());
		//System.out.println("mkdir:"+file6.mkdir());
		
		System.out.println("------------------------");
		
		//public boolean createNewFile():创建文件,当文件不存在的时候,创建此抽象路径下的文件
		//本身方法异常:IOException
		File file2 = new File("e:\\demo\\a.txt") ;
		System.out.println("createNewfile:"+file2.createNewFile());
		
		///java.io.IOException: 系统找不到指定的路径。 
		File file3 = new File("e:\\test\\b.txt") ;
		System.out.println("createNewFile:"+file3.createNewFile());
		//创建文件的前提:文件夹一定要存在,如果不存在,IOException
		
		//public boolean mkdirs():创建文件夹,如果父目录不存在,会创建此目录
		//在E盘下创建E:\\aaa\\bbb\\ccc
		File file4 = new File("e:\\aaa") ;
		System.out.println("mkdir:"+file.mkdir());
		
		File file5 = new File("E:\\aaa\\bbb\\ccc") ;
		System.out.println("mkdirs:"+file5.mkdirs());
	}
}
        删除功能:

                public boolean delete():删除文件或者文件夹(目录不能是空的) ,逐一删除文件或者目录的;

        举例:

public class FileDemo3 {

	public static void main(String[] args) throws IOException {
		
		//创建File对象	
		File file = new File("e:\\demo\\a.txt") ;
		System.out.println("delete :" +file.delete());
		File file2 = new File("e:\\demo") ;
		System.out.println("delete:"+file2.delete());
		
		System.out.println("----------------------------");
		File file3 = new File("a.txt") ;
		System.out.println("createNewFile():"+file3.createNewFile());
		
		System.out.println("-----------------------------");
		File file4 = new File("aaa\\bbb\\ccc\\ddd") ;
		System.out.println("mkdirs():"+file4.mkdirs());
		
		//需求:删除aaa\\bbb\\ccc\\ddd
		//File(File parent,String Child)
		File file5 = new File("aaa\\bbb\\ccc\\ddd") ;
		System.out.println(file5.delete());
		
		File file6 = new File("aaa\\bbb\\ccc") ;
		System.out.println(file6.delete());
	}
}
        File 的重命名功能:
public boolean renameTo(File dest):重新命名此抽象路径名表示的文件;

如果路径名一致的情况,那么只是重命名,如果两次路径名称不一致,那么不只是重命名,并且剪切;

        举例:

public class FileDemo {
	
	public static void main(String[] args) {
		//表示当前项目下的高圆圆.jpg这个文件
		File file = new File("高圆圆.jpg") ;
		File newFile =new File("杨桃.jpg") ;
		System.out.println("renameTo():"+file.renameTo(newFile));
		System.out.println("-------------------------");

		File file2 = new File("杨桃.jpg") ;
		File file3 = new File("e:\\高圆圆.jpg") ;
		System.out.println("renameTo():"+file2.renameTo(file3));

	}
}
        File类的判断功能:
public boolean isDirectory():判断是否是文件夹(目录);
  public boolean isFile():判断是否是文件;
  public boolean canRead():是否可读;
  public boolean canWriter():是否可写;
  public boolean exists():测试此抽象路径名表示的文件或目录是否存在;

                public boolean isHidden():是否是隐藏文件;

        举例:

public class FileDemo2 {

        @Test
        public void demo() { //测试环境

                //表示一个当前项目下的a.txt
                File file  = new File("a.txt") ;
                //public boolean isDirectory():判断是否是文件夹(目录)
                System.out.println("isDirectory:"+file.isDirectory());

                //public boolean isFile() :判断是否是文件
                System.out.println("isFile:"+file.isFile());

                //public boolean canRead(): 是否可读
                System.out.println("canRead:"+file.canRead());

                //public boolean canWriter():是否可写
                System.out.println("canWriter:"+file.canWrite());

                //public boolean exists():测试此抽象路径名表示的文件或目录是否存在
                System.out.println("exites:"+file.exists());

                //public boolean isHidden():是否是隐藏
                System.out.println("isHidden:"+file.isHidden());
        }
}
        File类的获取功能:
                public String getAbsolutePath():获取抽象文件的绝对路径;
public String getPath():获取相对路径的字符串;
  public String getName():返回由此抽象路径名表示的文件或目录的名称;
  public long length():返回由此抽象路径名表示的文件的长度;

  public long lastModified():文件最后一次被修改的时间(时间毫秒值);

        举例:

public class FileDemo3 {
	
	@Test
	public void demo() {
		//表示一个当前项目下的a.txt
		File file  = new File("a.txt") ;
		
		//public String getAbsolutePath():获取抽象文件的绝对路径
		System.out.println(file.getAbsolutePath());//F:\eclipse-workspace\day16\a.txt
		
		//public String getPath():获取相对路径的字符串
		System.out.println(file.getPath());//a.txt
		
		//public String getName()返回由此抽象路径名表示的文件或目录的名称
		System.out.println(file.getName());
		
		//public long length()返回由此抽象路径名表示的文件的长度。
		System.out.println(file.length());
		
		//public long lastModified():文件最后一次被修改的时间(时间毫秒值)
		System.out.println(file.lastModified());//1526183014044
		
		//知道了时间毫秒值,将之转换成我们知道的时间形式
		Date d = new Date(1526183014044L) ;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String str = sdf.format(d) ;
		System.out.println(str);
		
	}
}
        File的高级功能:
                public String[] list():获取当前某个路径下的所有的文件夹以及文件名称的字符串数组;

                public File[] listFiles():获取当前某个路径下所有的文件夹以及文件的File数组;

        举例:

public class FileDemo {
	
	public static void main(String[] args) {
		
		//表示e盘
		File file = new File("e:\\") ;
		
		//方式1::
		String[] list = file.list() ;
		for(String s:list) {
			System.out.println(s);
		}
		System.out.println("--------------------------");
		
		//方式2:
		File[] fileArray = file.listFiles() ;
		//防止他出现空指针异常
		if(fileArray !=null) {
			//遍历
			for(File f:fileArray) {
				System.out.println(f.getName());
			}
		}
	}
}
        综合练习:
package org.westos.f;

import java.io.File;

/**
 *	判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称
 *
 *		e盘下:图片文件 
 *		思路:
 *			1)使用File对象表示e盘的根目录
 *			2)File[] listFiles() ;String[] list() 	获取当前盘符下所有的文件以及文件夹的File数组
 *			3)对File数组对象进行非空判断,判断他是否为null,不是null,遍历
 *			4)如果他是文件,并还有满足是否以.jpg结尾
 *					满足就可以进行输出文件名称
 *
 */
public class FileTest2 {
	
	public static void main(String[] args) {
		//封装e盘根目录
		File file = new File("e:\\") ;
		
		//获取当前盘下所有的文件夹以及文件的File数组
		File[] fileArray = file.listFiles() ;
		//非空判断
		if(fileArray!=null) {
			//遍历
			for(File f :fileArray) {
				//将每一个表示的文件/文件夹对象遍历出来
				//判断是否是文件
				if(f.isFile()) {
					//满足文件
					//并且以.jpg结尾的
					if(f.getName().endsWith(".jpg")) {
						//满足就输出
						System.out.println(f.getName());
					}
				}
			}
		}
	}
}

        使用匿名内部类的方式完成上述例题:

        举例:

package org.westos.f;


import java.io.File;
import java.io.FilenameFilter;


/**
 * 
 *    断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称
 *
 *        使用方式:A:封装e盘,获取所有的文件以及文件夹的File数组(文件以及文件及的名称数组)
 *                    遍历的时候进行一系列判断进行条件过滤,麻烦
 *                B:当前获取到的时候就已经拿到.jpg文件等等....	
 *
 *
 *        FilenameFilter:一个接口:  文件名称过滤器
 *            boolean accept(File dir, String name)测试指定文件是否应该包含在某一文件列表中。
 *                dir - 被找到的文件所在的目录;
 *                name - 文件的名称;
 *        文件是否包含在文件列表中,取决于返回值,true;false表示不包含
 */

public class FileTest3 {

        public static void main(String[] args) {

                //封装e盘
                File src = new File("e:\\");//表现形式

                //采用文件名称过滤器:匿名内部类的方式
                String[] strArray = src.list(new FilenameFilter() {

                        @Override
                        public boolean accept(File dir, String name) {
                                //return false;

                                //首先封装File对象
                                /*File file = new File(dir, name) ;
                                //判断是否文件
                                boolean flag = file.isFile() ;
                                boolean flag2 = name.endsWith(".jpg") ;

                                return flag && flag2 ;*/

                                //一步走
                                return new File(dir, name).isFile() && name.endsWith(".jpg") ;
                        }
                }) ;

                    //遍历字符串数组
                    for(String s: strArray) {
                            System.out.println(s);
                    }
        }
}


字节输入流OutputStream:

        举例:
public class FileOutputStreamDemo {
	
	public static void main(String[] args) throws Exception {
		//1)创建一个字节输出流对象
		//OutputStream out = new OutputStream() ;
		//FileOutputStream(String name) 
		//OutputStream out = new FileOutputStream("fos.txt") ; //抽象类多态
		
		//创建对象做了几件事情
		/**
		 * 1)构造了输出流对象 (系统创建对象)
		 * 2)指向了当前项目下输出fos.txt
		 */
		FileOutputStream fos = new FileOutputStream("fos.txt") ; //FileNotFoundException
		
		//写数据
		// 使用流对象给文件中写入数据
		fos.write("hello".getBytes());
		
		//关闭资源
		/**
		 * 1)将文件和流对象不建立关系了 (fos对象不指向fos.txt)
		 * 2)及时释放掉流对象所占用的内存空间
		 */
		fos.close(); 
		/**
		 * 如果关闭流对象了,那么就不能对流对象进行操作了
		 */
		//fos.write("java".getBytes());//java.io.IOException: Stream Closed :流已经关闭了
		
	}
}
        关于字节输出流写数据的方法:
                public void write(int b):一次写一个字节;
                public void write(byte[] b):一次写一个字节数组;

                public void write(byte[] b, int off,int len):一次写一部分字节数组;

        举例:

public class FileOutputStreamDemo2 {

	public static void main(String[] args) throws Exception {
		
		//构造一个字节数出流对象
		FileOutputStream fos = new FileOutputStream("fos2.txt") ;
		
		//写数据
		//一次一个字节
		fos.write(97);
		fos.write(98);
		
		// public void write(int b):
		//public void write(byte[] b) :一次写一个字节数组
		byte[] bys = {97,98,99,100,101} ;
		fos.write(bys);
		
		//public void write(byte[] b, int off,int len):一次写一部分字节数组
		fos.write(bys, 0, 2);
		
		//关闭资源
		fos.close(); 
	}
}
        问题:如何末尾追加数据呢;

                public FileOutputStream(File file, boolean append):指定为true,末尾追加数据;

        举例:

public class FileOutputStreamDemo {

	public static void main(String[] args) throws Exception {
		
		//1)创建字节文件输出流对象:FileOutputStream
		//FileOutputStream fos = new FileOutputStream("fos3.txt") ;
		FileOutputStream fos = new FileOutputStream("fos3.txt",true) ;
		
		//2)写数据
		for(int x = 0 ; x < 10 ; x ++) {
			fos.write(("hello"+x).getBytes());
			//写入换行符号
			fos.write(("\r\n").getBytes());  // editplus工具
		}
		
		//3)释放资源
		fos.close(); 
	}
}

字节输出流InputStream:

        关于字节输入流读数据的方法:
                public abstract int read():一次读取一个字节;
public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数);
public class FileInputStreamDemo {
	
	@Test
	public void demo() throws Exception{
		
                FileInputStream fis  = new FileInputStream("fis.txt") ;

		//最终版代码  
		int by = 0 ;
		while((by=fis.read())!=-1) {
			System.out.print((char)by);
		}
		
		//释放资源
		fis.close();

	}
}

复制文本文件:

        两个文件在同一个文件夹内:
        举例:
public class CopyFileDemo{
	
	public static void main(String[] args) throws Exception {
		
		//封装目的地文件和源文件
		FileInputStream fis = new FileInputStream("a.txt") ;
		FileOutputStream fos = new FileOutputStream("b.txt") ;
		
		//进行读写操作
		//一次读取一个字节
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//第一个字节,写个一个字节
			fos.write(by);
		}
		System.out.println("------");
		
		//一次读取一个字节数组
		
		//释放资源
		fis.close(); 
		fos.close();
	}
}
        两个文件在不同的文件:
        举例:
public class CopyFileDemo2 {
	
	public static void main(String[] args) throws Exception {
		
		//封装目的地文件和源文件
		FileInputStream fis = new FileInputStream("c:\\a.txt") ;
		FileOutputStream fos = new FileOutputStream("d:\\b.txt") ;
		
		//读写操作
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//不断写数据
			fos.write(by); 
		}
		
		//释放资源
		fos.close(); 
		fis.close();
	}
}
        两个文件文图片为.jpg:
        举例:
public class CopyImageDemo {

	public static void main(String[] args) throws Exception {
		
		//封装源文件和目的地文件
		FileInputStream fis = new FileInputStream("高圆圆.jpg")	 ;
		FileOutputStream fos = new FileOutputStream("mm.jpg") ;
		
		//读写操作
		//一次读取字节数组
		byte[] bys = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bys))!=-1) {
			//写数据
			fos.write(bys, 0, len);
		}
		
		//释放资源
		fis.close(); 
		fos.close();
		
	}
}




阅读更多

扫码向博主提问

Future_LL

非学,无以致疑;非问,无以广识
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页