JAVA基础之文件与IO流

基本概念

文件:计算机上的文件分为两种,文本文件与二进制文件,文本文件是可以用记事本打开的文件,二进制文件是不可以用记事本直接打开的文件,比如多媒体文件等。

内存与硬盘:文件存储在硬盘中,硬盘可实现文件的持久化保存,当要对文件进行操作时,要先将硬盘中的文件读到内存中进行操作,操作后再将数据保存到硬盘中,将硬盘中的文件读入到内存需要使用输入流,将内存中的数据保存到硬盘需要用到输出流,这里的输入输出是相对于内存的描述。

文件的基本操作

指定文件

指定文件对象-通过目录 
File f = new File("F:\\test\\ss.txt");

目录结构
在这里插入图片描述

文件判断

判断文件是否存在
	System.out.println("文件是否存在"+f.exists());
判断文件是否是个目录
	System.out.println("文件是目录?"+f.isDirectory());
判断文件是否是File(非目录)
	System.out.println("文件是文件?"+f.isFile());

输出
在这里插入图片描述

创建, 删除,重命名,移动(剪切)

创建文件夹
		f.mkdir()	;	//只能创建一级目录
		f.mkdirs()	;	//可创建多级目录
创建文件
		f.createNewFile();	 //创建文件
删除文件
	    f.delete();
改名
		f.renameTo(new File("abc.txt"));	
移动
		f.renameTo(new File(""D:\\test\\ss.txt"));	 //路径不同,可实现移动

获得相关文件信息

常用的方法
f.getAbsolutePath();	//获得绝对路径
f.getPath();			//获得相对路径
f.getName()	;			//获得文件名
f.getParent();			//获得父目录
f.length()	;			//获得文件大小

获取文件夹下的文件

		String[] str = f.list();  		//获取文件夹下所有文件名(包含文件夹)
		for (String string : str) {
			System.out.println(string);
		}

		System.out.println("---------------------------");

		File[] files = f.listFiles();		//获取文件夹下所有文件(包含文件夹)
		for (File file : files) {
			System.out.println(file.getAbsolutePath());
		}

目录结构:abc为空,bbb不为空
在这里插入图片描述
输出结果:
在这里插入图片描述

 

IO流

在这里插入图片描述 
 

字节输入流 — FileInputStream

FileInputStream .read()读取一个字节 ;
FileInputStream .read(byte[])用字节数组保存读取到的数据,返回读取到的字节数 ;


	简单实现,通过一个4字节数组,往复读取文本文件并显示出来。
	
	public void InputStreamTest() {
		FileInputStream input = null;
		try {
			 input = new FileInputStream("StreamTest");
			 byte[] data = new byte[4];
			 int length = -1;
			 while ((length = input.read(data))!=-1) {
				 System.out.print(new String(data,0,length));
			}
			 
			
		} catch (Exception e) {
		}finally {
				try {
					if (input!=null) {
						input.close(); //关闭输入流 
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
		}
	}

 

字节输出流 — FileOutputStream

FileInputStream .write()写入一个字节 ;
FileInputStream .write(byte[]) 将字节数组写入

简单示例:
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileOutputStream output = null;
		try {
			 output  = new FileOutputStream("StreamTest");
			 output.write("123456dddd".getBytes(),0,6);		//字节数组写
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			try {							//关闭输出流
				if (output!=null) {
					output.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

两次运行-输出:
在这里插入图片描述
 
 
output = new FileOutputStream("StreamTest",true); //true 追加写入,默认覆盖

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileOutputStream output = null;
		try {
			 output  = new FileOutputStream("StreamTest",true);
			 //true 追加写入,默认覆盖
			 
			 output.write("123456dddd".getBytes(),0,6);		//字节数组写
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			try {							//关闭输出流
				if (output!=null) {
					output.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

两次运行-输出:
在这里插入图片描述
 
 
 
 

缓冲字节流 BufferedOutputStream / BufferedInputStream

缓冲区流是一种包装流,对基本流进行包装管理。为其加入缓冲区,减少不必要的IO操作,增加效率。

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedOutputStream bfoutput = null;
		try {
			bfoutput = new BufferedOutputStream(new FileOutputStream("StreamTest"));
			写入操作与 FileOutputStream 相同
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				bfoutput.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

缓冲区满了,或者关闭流的时候才会将缓冲区中内容写入硬盘。
主动写入可使用 : bfoutput.flush();

缓冲输入流一次读取一个缓冲区的数据,程序读取数据时将从缓冲区提供给程序。
 
 
 
 

基本字符流:OutputStreamWriter / InputStreamReader

OutputStreamWriter 和 InputStreamReader 也是包装流。

 
OutputStreamWriter 和 InputStreamReader 自带缓冲区
OutputStreamWriter 的写方法:
在这里插入图片描述

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OutputStreamWriter writer  = null;
		try {
			writer = new OutputStreamWriter(new FileOutputStream("StreamTest"),"UTF-8");
			可以指定编码格式
			writer.write("你好中国");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				writer.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

InputStreamReader 类似
InputStreamReader 的读方法:
在这里插入图片描述

	public static void main(String[] args) throws Exception {
		InputStreamReader reader = new InputStreamReader(new FileInputStream("StreamTest"),"GBK");
		char[] data = new char[1024];
		reader.read(data);
		System.out.println(data);
	}

 
 
 
 

简化字符流:FileWriter / FileReader

FileWriter / FileReader 是 OutputStreamWriter / InputStreamReader 的简化,是基本流,可以直接使用文件路径初始化。

实际上只是重写了OutputStreamWriter / InputStreamReader 的构造方法,内部实现了字节流的创建和包装。

但是FileWriter / FileReader 无法指定编码方式,会按照默认GBK方式读写

	public static void main(String[] args) throws Exception {
		FileReader reader = new FileReader("SteamText");
		FileWriter writer = new FileWriter("SteamText");
	}

 
 
 
 

缓冲字符流 BufferedWriter / BufferedReader

虽然OutputStreamWriter 和 InputStreamReader 自带缓冲区,但是缓冲区不可改变大小。

缓冲字符流 BufferedWriter / BufferedReader是对字符流进行包装。

	public static void main(String[] args) throws Exception {
		BufferedReader reader = new BufferedReader(new FileReader("SteamText"));
		BufferedWriter writer = new BufferedWriter(new FileWriter("SteamText"));
		
		reader.readLine();可以读取一行
	}

 
 

流的总结

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值