IO流
一、文件
1.1、概念
文件是保存数据的地方,可以是word,txt,excel,mp3,mp4等等等。保存的内容可以是视频,声音等等
1.2、文件流
文件是在程序中是以流的方式来操作
流:数据在数据源(文件)和程序(内存)之间的路径
输入流:数据从数据源到程序
输出流:数据从程序到数据源
输入输出是以程序做参考
1.3、常用操作
创建文件对象
- 在执行方法前,只是在内存里创建了文件并没有跟磁盘交互,调用方法后才写入磁盘
//方法1:根据路径构建一个File对象
public void create01(){
String filePath = "f:\\Garbage\\news1.txt";
File file = new File(filePath);
try {
file.createNewFile();
System.out.println("创建1成功");
} catch (IOException e) {
e.printStackTrace();
}
}
//方式2:根据父目录文件+子路径构建
public void create02(){
File parentFile = new File("f:\\Garbage\\");
String fileName = "news2.txt";
File file = new File(parentFile, fileName);
try {
file.createNewFile();
System.out.println("创建2成功");
} catch (IOException e) {
e.printStackTrace();
}
}
//方式3:new File(String parent,String child) //根据父目录+子路径构建
@Test
public void create03(){
String parentPath = "f://Garbage//";
String fileName = "news3.txt";
File file = new File(parentPath, fileName);
try {
file.createNewFile();
System.out.println("创建3成功");
} catch (IOException e) {
e.printStackTrace();
}
}
获取文件信息
//获取文件信息
@Test
public void info(){
//创建文件对象
File file = new File("f:\\Garbage\\news1.txt");
//调用方法
System.out.println("文件名:"+file.getName());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("父目录:"+file.getParent());
System.out.println("文件大小:"+file.length());
System.out.println("是否存在:"+file.exists());
}
目录(文件夹)操作和文件删除
//判断F盘是否有文件存在,如果有则删除
@Test
public void m1(){
String filePath = "F:\\Garbage\\news1.txt";
File file = new File(filePath);
if(file.exists()){
if (file.delete()){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}else{
System.out.println("不存在该文件");
}
}
//判断目录是否存在,存在就删除否则提示不存在
//可以体会到目录也被当做文件
@Test
public void m2(){
String filePath = "F:\\Garbage\\Test";
File file = new File(filePath);
if(file.exists()){
if (file.delete()){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}else{
System.out.println("不存在该目录");
}
}
//判断目录是否存在,如果不存在创建目录
@Test
public void m3(){
String directoryPath = "F:\\Garbage\\a\\b\\c";
File file = new File(directoryPath);
if(file.exists()){
System.out.println("该目录已经存在");
}else {
if (file.mkdirs()) { //mkdir创建一级目录,mkdirs创建多级目录
System.out.println("创建成功");
} else {
System.out.println("创建失败");
}
}
}
二、IO流原理和流的分类
2.1、IO流原理
- I/O是Input/Output的缩写,用于数据传输,读写文件,网络通讯
- Java程序中,对于数据的输入/输出操作以“流”的方式进行
- java.io包下提供了各种“流”类和接口,用于获取不同种类的数据,并通过方法输入或输出数据
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存中)
- 输出output:将程序(内存)中的数据输出到磁盘、光盘等外部设备中
2.2、流的分类
-
按操作数据单位不同分为:字节流(8bit)二进制文件,字符流(按字符)文本文件
-
按数据流的流向不同分为:输入流,输出流
-
按流的角色不同分为:节点流,处理流/包装流
- Java的IO流设计40多个类,实际上非常规则,都是从四个抽象基类派生的
- 由着四个类派生出来的子类都是以父类名作为子类名后缀
三、FileInputStream/FileOutputStream
(文件字节输入/输出流)
InputStream:字节输入流
- InputStream抽象类是所有类字节输入流的超类
- InputStream常用的子类:
- FileInputStream:文件输入流
- BufferedInputStream:缓冲字节输入流(管道流)
- ObjectInputStream:对象字节输入流
3.1、FileInputStream
//读取文件
@Test
public void readFile01(){
String filePath = "f:\\Garbage\\hello.txt";
int readData = 0;
FileInputStream fileInputStream = null;
try {
//创建FileInputStream对象用来读取hello文件
fileInputStream = new FileInputStream(filePath);
//read():从该输入流读取一个字节如果没有输入可用,方法停止
//如果返回-1读取完毕
while((readData=fileInputStream.read()) != -1){
System.out.print((char) readData);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流释放资源
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//使用read(byte[] b)读取
@Test
public void readFile02(){
String filePath = "f:\\Garbage\\hello.txt";
//字节数组
byte[] buffer =new byte[8];
int readLength = 0;
FileInputStream fileInputStream = null;
try {
//创建FileInputStream对象用来读取hello文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取最多b.length字节到字节数组。此方法将阻塞,直到某些输入可以可用
//如果返回-1读取完毕
//如果读取正常,返回实际读取字节数
while((readLength=fileInputStream.read(buffer)) != -1){
System.out.print(new String(buffer,0, readLength));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流释放资源
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.2、FileOutputStream
注意:
在使用write(byte[] b)时,若byte[] b = new byte[1024],当有1029个文件,第一次输出1024,第二次仍是1024容易数据错乱
推荐使用write(byte[] b,int off,int len)方法
// 将数据写入文件中,如果文件不存在就创建
@Test
public void writeFile(){
//创建FileoutputStream对象
String filePath = "F:\\Garbage\\a.txt";
FileOutputStream fileOutputStream = null;
try {
//初始化fileOutputStream对象
/*
fileOutputStream = new FileOutputStream(filePath); //写入内容时会覆盖原来的内容
fileOutputStream = new FileOutputStream(filePath,true); //则变成追加而不是覆盖
*/
fileOutputStream = new FileOutputStream(filePath,true); //写入内容时会覆盖原来的内容
//1.写入一个字节
// fileOutputStream.write('H');
//2.写入字符串
//str.getByte()可以把字符串转成字节数
String str = "helloworld2";
fileOutputStream.write(str.getBytes(),0,str.length());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.3、文件复制
通过输入输出流实现文件复制
public static void main(String[] args) {
//1.将文件读入程序
//2.将读取的文件数据写入到指定的位置
String srcFilePath = "C:\\Users\\Administrator\\Pictures\\Saved Pictures\\壁纸 (1).jpg";
String destFilePath = "F:\\Garbage\\picture.jpg";
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(destFilePath);
//定义一个字节数组提高效率
byte[] buffer = new byte[1024];
int readLen = 0;
while((readLen = fileInputStream.read(buffer)) != -1){
//读取到之后就输出出去,通过 FileOutputStream
//边读边写
fileOutputStream.write(buffer,0,readLen); //一定要使用这个方法,否则容易数据错乱
//在使用write(byte[] b)时,如果有1029个文件,第一次输出1024,第二次仍是1024容易数据错乱
}
System.out.println("拷贝成功");
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileOutputStream != null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四、FileReader/FileWriter(文件字符输入/输出流)
-
FileReader和FileWriter介绍
FileReader和FIleWriter是字符流,及通过字符来操作io
FileReader
相关方法:
- new FileReader(File/String)
- read():每次读取单个字符,如果到文件末尾返回-1
- read(char[]):批量读取字符到数组,返回读到的字符数,如果到文件末尾返回-1
相关API:
- new String(char []):将char[]转换为String
- new String(char[],int off,int len):将char[]的指定部分转换为String
@Test
public void Read01() {
String filePath = "F:\\Garbage\\story.txt";
FileReader fileReader = null;
int data = 0;
try {
//初始化FileReader对象
fileReader = new FileReader(filePath);
//利用循环 使用read单个字符读取
while ((data = fileReader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void Read02() {
String filePath = "F:\\Garbage\\story.txt";
FileReader fileReader = null;
int len = 0;
char[] buffer = new char[1024];
try {
//初始化FileReader对象
fileReader = new FileReader(filePath);
//利用循环 使用read(char [])读取字符数组,返回时机读取到的字符数
while ((len = fileReader.read(buffer)) != -1) {
System.out.println(new String(buffer,0,len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileWriter
相关方法:
- new FileWriter(File/String):覆盖模式,相当于流的指针在首端
- new FileWriter(File/String , true):追加模式,相当于流的指针在末端
- write(int):写入单个字符
- write(char []):写入指定字符数组
- write(char [],int off,int len):写入字符数组指定部分
- write(String):写入字符串
- writer(String,int off,int len):写入字符串指定部分
相关API:
- String类:toCharArray:将String转化为char[]
注意:
FileWriter使用后,必须要关闭(close)或刷新(f