Java IO流(FileInputStream,FileOutputStream及File)讲解

File类的使用

在介绍流的概念之前,我们需要知道并且明确File和IO流是什么关系。
java.io.File类:文件和目录路径名的抽象表示形式
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
File对象可以作为参数传递给流的构造函数

File的构造函数

参考在线的jdk文档:https://blog.fondme.cn/apidoc/jdk-1.8-google/
在这里插入图片描述

file常用的构造方法

public File(String pathname)
以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
public File(String parent,String child)
以parent为父路径,child为子路径创建File对象。

package com.ghl.io;

import java.io.File;

import org.junit.Test;

public class FileDemo {
@Test
	public void fileTest() {
		/*
		 * 路径:
		 * 绝对路径:包括盘符在内的完整文件路径
		 * 相对路径:在当前文件目录下的文件路径
		 * File中的方法仅涉及到文件的创建,删除,重命名等等,只要设计文件内容的File无能为力,只能由IO流来完成
		 * 凡是与输入、输出相关的类,接口java.util.io包下
		 * File类的对象常作为IO流的具体类的构造器的形参
		 */
	File file=new File("D:\\hello.txt");  //绝对路径  本地磁盘
	File file1=new File("hello.txt");  //相对路径  项目下的文件
	}
}

File常用的方法

	package com.ghl.io;

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

import org.junit.Test;

public class FileDemo {
@Test
	public void fileTest() throws IOException {
	
	//file文件既可以是文件也可以是目录
	File file=new File("D:\\hello.txt");  //绝对路径  本地磁盘
	File file1=new File("hello.txt");  //相对路径  项目下的文件.
	File file2=new File("D:\\io");//目录
	System.out.println(file.getName());//获取文件名
	System.out.println(file.getPath());//获取文件路径
	System.out.println(file.getAbsolutePath());//返回的是一个字符串,这个字符串就是当前File对象的绝对路径名的字符串形式
	System.out.println(file.getAbsoluteFile());//返回的是一个File类对象,这个File对象表示是当前File对象的绝对路径名形式
	System.out.println(file.getParent());//获得当前文件的父级文件目录
	//文件检测的相关方法
	System.out.println(file.exists());//判断文件是否存在
	System.out.println(file.canWrite());//文件是否能写
	System.out.println(file.canRead());//文件是否能读
	System.out.println(file.isDirectory());//当前文件是否是一个目录
	System.out.println(file.isFile());//当前文件是否是一个文件
	//获取常规文件信息
	System.out.println(file.lastModified());//获取文件最后修改时间
	System.out.println(file.length());//获取文件长度
	//文件操作相关
	System.out.println(file.createNewFile()); //创建一个新的文件
	System.out.println(file.delete());//删除一个文件
	//目录操作相关
	//mkDir() 创建一个文件目录,只有在上层文件存在的情况下才能创建
	if(!file.exists()){//如果文件不存在就创建
		file.mkdir();
	}
	
	//mkDirs() 创建一个文件目录,若上层文件目录不存在,一并创建
	if(!file.exists()){//如果文件不存在就创建
		file.mkdirs();
	}
	
	/*
		
		文件操作相关
		createNewFile() 
		delete()//删除一个文件
		目录操作相关
	
	 */
	}
}

IO流概述

1)根据处理数据类型的不同分为:字符流(操作文本)和字节流(操作图片音频视频等)
2)根据数据流向不同分为:输入流(InputStream)和输出流(OutputStream)
3)按流的角色的不同分为:节点流(操作File文件),处理流(处理节点流都叫处理流)
4)IO流用来处理设备之间的数据传输。
5)Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。
抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
6)Java的IO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的。
7)由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

IO流体系

在这里插入图片描述

首先介绍一下节点流(直接作用于文件上,也就是说对文件操作的都叫节点流)

FileInputStream输入流

1)节点流也叫文件流:FileInputStream,FileOutputStream,FileReader,FileWriter
2)FileInputStream读取的两种方法:逐字节读;以字节数组读取(最常用)两种方式;
3)FileInputStream的操作步骤:(采用字节数组的方式输出)
3.1)第一步:创建文件对象,指定要读取的文件路径(要读的文件一定要存在) File file = new File(“hello.txt”)
3.2)第二步:创建一个文件输入流对象 用来获取第一步文件的输入流 FileInputStream fis = new FileInputStream(file);
3.3)第三步:读取到的数据要写入到的数组 byte[] b = new byte[1024]; 长度可自己指定 开发常用1024
3.4)第四步:遍历数组
4)文件读取的一个建议:建议对流的操作都要用try-catch 不要用Throws 因为throws在执行过程中一旦出现异常,流的关闭将不再执行,资源就会继续消耗
5)FileInputStream读文件流的Read方法图解(Jdk1.8官方文档:https://blog.fondme.cn/apidoc/jdk-1.8-google/)
在这里插入图片描述

代码解释

package com.ghl.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.concurrent.SynchronousQueue;
import org.junit.Test;
public class FileInputStreamDemo {
	@Test
	//建议对流的操作都要用try-catch   不要用Throws 因为throws在执行过程中一旦出现异常,流的关闭将不再执行,资源就会继续消耗
	public void TestInputStream1() {
		//第一步:需要有一个File类的对象
		File file = new File("hello.txt");// hello.txt是我在当前项目下建的一个文本文件 用于操作
		//创建一个文件输入流对象 用来获取第一步文件的输入流
		FileInputStream fis = null; 
		try {
			fis = new FileInputStream(file);//需要把定义好的文件当参数传给输入流
			byte[] b = new byte[5]; // 读取到的数据要写入到的数组
			int len;//每次读入到byte字节中的长度  
			while ((len = fis.read(b)) != -1) {//调用FileInputStream的方法 其中有个read()方法,实现file文件的读取 当执行到文件结尾时,返回-1
				// 第一种遍历方式
				for (int i = 0; i < len; i++) {
					System.out.print((char) b[i]);//输出结果:abcdefg
				}
				// 第二种遍历方式 也可以拿到文件流中的内容,并输出到控制台
			/*	String str = new String(b, 0, len);//将字节数组转换成字符串输出
				System.out.println(str);*/
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					//必须要关闭相应的流,如果不关闭,资源会继续消耗
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} // 关闭流
		}
	}
}

FileOutputStream输出流

1) 创建FileOutputStream实例时候,如果相应的文件并不存在,将会自动创建新的空的文件。跟FileInputStream是对应的
2)OutputStream和其子类FileOutputStream的常用方法
⑴、类名.write(int c);
将指定字节写入此文件输出流。
⑵、类名.write(btye[]b);
将 b.length 个字节从指定 byte 数组写入此文件输出流中。
⑶、类名.write(byte[] b, int off, int len);

代码解释

package com.ghl.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.junit.Test;

public class FileOutputStreamDemo {
@Test
	public void testFileOutputStream() {
	  try {
		  //创建输入流对象,
          FileInputStream   in=new FileInputStream("hello.txt");
          //创建输出流对象
          FileOutputStream  out=new FileOutputStream("hello1.txt");
          
          byte[]b=new byte[12];
          int len=0;
          while((len=in.read(b))!=-1){
              out.write(b, 0, len);
          }
          
          in.close();
          out.close();
      } catch (Exception e) {
          
          e.printStackTrace();
      }
	}
}

自定义文件的复制工具类

package com.ghl.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.junit.Test;

public class FileOutputStreamDemo {
	
	//文件的复制工具类
	public static void copeFile(String src,String desc) {
		//src:代表输入流地址
		//desc:代表输出流地址
		  try {
			  //创建输入流对象,
	          FileInputStream   in=new FileInputStream(src);
	          //创建输出流对象
	          FileOutputStream  out=new FileOutputStream(desc);
	          
	          byte[]b=new byte[12];
	          int len=0;
	          while((len=in.read(b))!=-1){
	              out.write(b, 0, len);
	          }
	       
	          in.close();
	          out.close();
	      } catch (Exception e) {
	          
	          e.printStackTrace();
	      }
	}
	
	@Test
	public void demo() {
		String src="hello.txt";
		String desc="hello2.txt";
		this.copeFile(src, desc);
	}

}

注意

定义文件路径时,注意:可以用“/”或者“\”。

在写入一个文件时,如果目录下有同名文件将被覆盖。

在读取文件时,必须保证该文件已存在,否则出异常。

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值