在介绍流的概念之前,我们需要知道并且明确File和IO流是什么关系。
java.io.File类:文件和目录路径名的抽象表示形式
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
File对象可以作为参数传递给流的构造函数
参考在线的jdk文档:https://blog.fondme.cn/apidoc/jdk-1.8-google/
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"); //相对路径 项目下的文件
}
}
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()//删除一个文件
目录操作相关
*/
}
}
1)根据处理数据类型的不同分为:字符流(操作文本)和字节流(操作图片音频视频等)
2)根据数据流向不同分为:输入流(InputStream)和输出流(OutputStream)
3)按流的角色的不同分为:节点流(操作File文件),处理流(处理节点流都叫处理流)
4)IO流用来处理设备之间的数据传输。
5)Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。
抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
6)Java的IO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的。
7)由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
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();
} // 关闭流
}
}
}
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);
}
}
定义文件路径时,注意:可以用“/”或者“\”。
在写入一个文件时,如果目录下有同名文件将被覆盖。
在读取文件时,必须保证该文件已存在,否则出异常。