本周人就学习文件的相关的读写操作
三、文件读写操作
(一)通过字节流来读写文件
1、创建FileReadWrite01类
package net.wek13文件读写;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 功能:利用字节流完成文件读写操作
* 作者:谯婷
* 日期:2019.5.21
*/
public class FileReadWrite01 {
public static void main(String[] args) {
//创建一个文本文件
File file = new File("love.txt");
try {
//创建文件
file.createNewFile();
System.out.println("文件[" + file.getAbsolutePath() + "]创建成功!");
//创建文件字节输出流
FileOutputStream fos = new FileOutputStream(file);//程序输出字节流,写入文件中
//往文件里写入若干字节数据(一次一个字节)
fos.write('I');
fos.write(' ');
fos.write('l');
fos.write('o');
fos.write('v');
fos.write('e');
fos.write(' ');
fos.write('y');
fos.write('o');
fos.write('u');
fos.write('!');
//往文件里写入字节数据(一次一个字节数组)
fos.write("\nDo you love me?".getBytes());
//往文件里写入字节数据(一次一个字节数组)
fos.write('\n');
fos.write("I don't love you anymore!".getBytes(), 0, 25);//从下标为0的数据开始显示,显示25个长度的字符
//提示用户文件写入成功
System.out.println("恭喜!文件写入成功!");
//创建文件字节输入流,读取文件,一个字节一个字节的读
FileInputStream fis = new FileInputStream(file);
// 方法一:-FOR循环
int length = fis.available();//获取文件字节流中数据长度
for (int i = 0; i < length; i++) {
System.out.print((char) fis.read());//read()返回的是字节数据对应的ASCII码,插入(char)强行转换成字符显示
}
System.out.println();
// 方法二:-While循环
fis = new FileInputStream(file);
int i;
while ((i = fis.read()) != -1) {
System.out.print((char) i);
}
System.out.println();
// 方法三:-While循环(逐个字节数组读取)
fis = new FileInputStream(file);
byte[] b = new byte[6];//每次读取6个字节
while (fis.read(b) != -1) {
for (int k = 0; k < b.length; k++) {
System.out.print((char) b[k]);
}
}
} catch (IOException e) {
System.out.println("文件[" + file.getAbsolutePath() + "]创建失败!");
}
System.out.println();
// 删除刚才创建的文件
boolean isFileDeleted = file.delete();
// 判断文件是否删除成功
if (isFileDeleted) {
System.out.println("文件[" + file.getAbsolutePath() + "]删除成功!");
} else {
System.out.println("文件[" + file.getAbsolutePath() + "]删除失败!");
}
}
}
思考题:如何利用文件读写操作完成文件的复制。
比如将D盘根目录的一个图片文件scenery01.jpg复制到E盘根目录,文件名改为scenery02.jpg。
创建FileCopy类,完成上述图片文件的复制工作。
package net.wek13文件读写;
import java.io.*;
/**功能:实现文件的复制
*
*/
public class FileCopy {
public static void main(String[] args) {
File file1 = new File("d:/scenery01.jpg");
File file2 = new File("e:/scenery02.jpg");
try {
FileInputStream fis= new FileInputStream(file1);
FileOutputStream fos =new FileOutputStream(file2);
byte[] b = new byte[1024];
while (fis.read(b) != -1){
fos.write(b);
}
System.out.println("文件["+file1.getAbsolutePath()+"]成功赋值到文件["+file2.getAbsolutePath()+"]");
} catch (IOException e) {
e.printStackTrace();
}
boolean isFileDeleted = file2.delete();
}
}
(二)通过字符流来读写文件
FileReader,FileWriter,BufferedReader
1、创建FileReadWrite02类
package net.wek13文件读写;
import java.io.*;
/**
* 功能:以文件字符流来实现文件读写操作
* 作者:谯婷
* 时间:2019.5.23
*/
public class FileReadWrite02 {
public static void main(String[] args) {
//创建File对象,指向文件
File file = new File("Flower.txt");
try {
//创建指定文件
file.createNewFile();
//提示用户文件创建成功
System.out.println("文件["+file.getAbsolutePath()+"]创建成功!");
//创建文件字符输出流
FileWriter fw = new FileWriter(file);
//1.逐个字符写入文件
fw.write('f');
fw.write('l');
fw.write('o');
fw.write('w');
fw.write('e');
fw.write('r');
fw.flush();
//提示用户逐个字符写入文件成功
System.out.println("逐个字符写入文件成功!");
//2.将字符串写入文件
fw.write("\nyou are so beautiful.");
//提示用户字符串写入文件成功
System.out.println("字符串写入文件成功!");
//3.将字符数组写入文件
char[] cs ={'\n','o','o','p','s',',','m','y',' ','b','a','b','y','!'};
fw.write(cs);
//提示用户字符数组写入文件成功
System.out.println("字符数组写入文件成功!");
//关闭文件字符输出流
fw.close();
//创建文件字符输入流
FileReader fr = new FileReader(file);
//1.逐个字符读取文件内容,采用while循环
int i;
while ((i = fr.read()) != -1){
System.out.print((char) i);
}
System.out.println();
//2.按字符数组来读取文件,采用while循环
fr = new FileReader(file);
char[] cf = new char[6];
while(fr.read(cf)!=-1){
for(int k = 0;k <cf.length;k++){
System.out.print(cf[k]);
}
}
System.out.println();
//3.行读取文件,采用缓冲字符输入流与while循环
BufferedReader br = new BufferedReader(new FileReader(file));
String nextLine = null;
while ((nextLine= br.readLine())!=null){
System.out.println(nextLine);
}
} catch (IOException e) {
System.err.println("文件["+file.getAbsolutePath()+"]创建失败!");
}
}
}
(三)通过随机存取文件来进行读写操作
随机存取文件,进水管与出水管是同一根水管,既可以读,也可以写,使用起来相当方便。下面我们通过案例来学习如何使用随机存取文件来进行读写操作。
1、创建RandomAccessFileDemo
package net.wek13文件读写;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
/**
* 功能:演示随机存取文件的读写操作
*
*/
public class RandomAccessFileDemo {
public static void main(String[] args) {
try {
//创建随机存取文件对象
RandomAccessFile raf = new RandomAccessFile("flower.txt","rw");
//1.逐个字节读取文件内容,采用for循环
long length = raf.length();
for (int i = 0 ;i<length;i++){
System.out.print((char) raf.read());
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
}