前言
文件操作在java程序中可以说是一个比较重要的点,如果没有这个基础的话,后期的Java学习可能会比较艰难,但是文件操作的话,它的点并不多,理解了以后就比较简单,下面我将从基本的字节流和字符流开始,为大家讲解java中是如何操作文件的。
字节流与字符流
1.字节流:字节流读取的时候,读到一个字节就返回一个字节;主要用于读取图片,MP3,AVI视频文件。
2.字符流:字符流使用了字节流读到一个或多个字节,如读取中文时,就会一次读取2个字节。只要是处理纯文本数据,就要优先考虑使用字符流。
字节流和字符流区别
字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
字节流默认不使用缓冲区;字符流使用缓冲区。
字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
创建文件
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
//判断该文件是否存在
if (file.exists() == false) {
//不存在就创建
// 处理异常的方法
// 1. throws IOException
file.createNewFile();
}
}
}
当程序在执行完毕的时候,会在工程目录下创建一个名字为:1.txt 文档;,这就是java中创建文件的一种方法,在java中有三种方法可以创建文件,方法大同小异,在这里就不展开讲了。
在使用文件操作的一些方法时可能会提示异常,这里有两种解决方法
1.给调用层处理:
public static void main(String[] args) throws IOException
- 用try捕获异常:
try {
file.createNewFile();
}catch (IOException e){
System.out.println("IO异常了");
}
向文件写入数据--字节流的方式
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
//判断该文件是否存在
if (file.exists() == false) {
//不存在就创建
// 处理异常的方法
// 1. throws IOException
file.createNewFile();
}
// 向文件写入数据--字节流
// 1.创建文件输出流对象
FileOutputStream fos = new FileOutputStream(file);
// 2.调用Write方法写入
byte[] text = {'1','2','3','4'};
fos.write(text);
// 3.操作完毕要关闭对象
fos.close();
}
}
程序执行完毕以后会在1.txt文档中保存byte数组中的几个数
注意:在对文件操作结束以后要调用close方法将文件关闭,否则会浪费系统资源
向文件写入数据--字符流的方式
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
//判断该文件是否存在
if (file.exists() == false) {
//不存在就创建
// 处理异常的方法
// 1. throws IOException
file.createNewFile();
}
// 向文件写入数据--字符流
// 1.创建对象
FileWriter fw = new FileWriter(file);
char[] nane = {'安','卓','开','发'};
fw.write(nane);
fw.close();
}
}
向文件写入数据--字符串的方式
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
//判断该文件是否存在
if (file.exists() == false) {
//不存在就创建
// 处理异常的方法
// 1. throws IOException
file.createNewFile();
}
// 向文件写入数据--字符串的方式
// 1.创建文件输出流对象 使用FileWriter创建对象
FileWriter fos = new FileWriter(file);
// 2.调用Write方法写入
String text= "hello word";
fos.write(text);
// 刷新缓冲区 刷新过后才会将数据存入文件
fos.flush();
// 3.操作完毕要关闭对象
fos.close();
}
}
这里使用了FileWrite来创建对象,在FileWrite里面有一个方法:flush();就是用来刷新缓冲区,只有调用这个方法以后数据才会写入文件,否则不行
介绍了如何创建文件和怎样将数据写入文件后,接下来就是读取文件了
文件的读取--方式一:
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
// 读取文件内容
// 创建文件对象
FileInputStream fis = new FileInputStream(file);
// 创建字节数组
byte[] name = new byte[12];
// 查看字节数组到底读了多少个字节
int count = fis.read(name);
// 读取文件
fis.read(name);
//关闭文件
fis.close();
System.out.println(count);
// 转化为String类型并且打印
System.out.println(new String(name));
}
}
文件的读取--方式二:
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
// 读取文件内容
// 创建文件对象
FileInputStream fis = new FileInputStream(file);
// 创建字节数组
byte[] name = new byte[12];
// 查看字节数组到底读了多少个字节
int count = fis.read(name);
// 创建FileReader对象
FileReader fr = new FileReader(file);
char[] book = new char[4];
count = fr.read(book);
fr.close();
System.out.println(count);
System.out.println(new String(book));
}
}
向文件中写入对象
实现类
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//用数组保存文件地址
String path = "C:/Users/18168/AndroidStudioProjects/java3/Java3/src/main/java/day9/File";
//创建文件
File file = new File(path.concat("/1.txt"));
/**
* 向文件里面存一个对象
*序列化 serializable
*保存对象必须要实现serializable接口
*/
// 创建对象
Person xw = new Person();
xw.name = "小王";
xw.age = 20;
// 创建对象读取文件的数据
OutputStream os = new FileOutputStream(file);
// 创建对象接收上面读取的数据
ObjectOutputStream oos = new ObjectOutputStream(os);
// 将读取到的数据写入
oos.writeObject(xw);
//关闭文件
oos.close();
}
}
对象类--必须要实现serializable接口
public class Person implements Serializable {
//要将对象保存道文件 需要实现serializable接口
public String name;
public int age;
}
将一个文件拷贝到另外一个位置 方法一
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/**
* 将一个文件拷贝到另外一个位置
*/
// 1.原文件路径
String sourcePath = "C://Users//18168//Desktop//yz.jpg";
// 2.目标文件的路径
String desPath = "C://Users//18168//Desktop//AndroidText//yz1.jpg";
// 3.图片->用字节流
// 读取原文件
FileInputStream fis = new FileInputStream(sourcePath);
// 写入文件
FileOutputStream fos = new FileOutputStream(desPath);
byte[] in = new byte[1024];//一次读取1024KB
int count = 0;
// 方法1
while (true){
// 用读取到的数据来判断是否读取完
count = fis.read(in);
if (count!=-1){
// 说明没有读到末尾
// 将这一次读取的内容写入目标文件 原因:数组不够大
fos.write(in, 0, count);//0--从头开始写到count
}else {
break;
}
}
}
}
由于有些文件过大,定义存储的数组时不知道该定义多大,所以在程序中加入了if判断语句,判断是否读完,同时数组存满一次就写入一次
将一个文件拷贝到另外一个位置 方法二
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/**
* 将一个文件拷贝到另外一个位置
*/
// 1.原文件路径
String sourcePath = "C://Users//18168//Desktop//yz.jpg";
// 2.目标文件的路径
String desPath = "C://Users//18168//Desktop//AndroidText//yz1.jpg";
// 3.图片->用字节流
// 读取原文件
FileInputStream fis = new FileInputStream(sourcePath);
// 写入文件
FileOutputStream fos = new FileOutputStream(desPath);
byte[] in = new byte[1024];//一次读取1024KB
int count = 0;
while ((count = fis.read(in)) != -1){
fos.write(in, 0, count);//0--从头开始写到count
}
fis.close();
fos.close();
}
}
将一个文件拷贝到另外一个位置 方法三
public class MyClass {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/**
* 将一个文件拷贝到另外一个位置
*/
// 方法3(快速)
long start = System.currentTimeMillis();
// 1.原文件路径
String sourcePath = "C://Users//18168//Desktop//yz.jpg";
// 2.目标文件的路径
String desPath = "C://Users//18168//Desktop//AndroidText//yz1.jpg";
// 读取数据
InputStream is = new FileInputStream(sourcePath);
BufferedInputStream bis = new BufferedInputStream(is);
// 写入数据
OutputStream os = new FileOutputStream(desPath);
BufferedOutputStream bos = new BufferedOutputStream(os);
byte[] in = new byte[1024];
int count = 0;
while ((count = bis.read(in)) != -1){
bos.write(in, 0, count);
}
// 关闭文件
bis.close();
bos.close();
// 测试时间
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
经过测试方法三是最快的方法!!
网友评论