目的
学习操作Java文件,实现对其写入与输出数据,掌握其相关操作
File文件操作
文件操作无外乎就是读和写,但是这里面的方法方式又有很多种。主要是从文件格式,文件的存储介质方面来看的。文件是一种持久存储的方式,要查找一个文件,就要找到其相对应的路径,而路径又分为相对路径和绝对路径,绝对路径就是指文件的完整路径,相对路径是部分路径(当前路径下的子路径)
Java文件的写入与输出,可以用流这个概念来表示;而流的方向是参考自己的内存空间,输出流是从内存空间将数据写到外部设备(磁盘\硬盘\光盘),而输入流是将外部数据写到内存中;其实流也是统一管理数据的写入和读取,输出流是开发者只需要将内存里面的数据写到流里面,而输入流是从流里面读取数据
而流也分为两种——字符流和字节流
字节流,顾名思义,是以字节为单位进行IO操作;而它最大的两个父类是InputStream和OutputStream,这两者都是抽象类,需要通过多态,初始化具体实现的子类来进行读写操作;实际操作的子类为
FileOutputStream/FileInputStream
ObjectOutputStream/ObjectInputStream
字符流,顾名思义,是以字符为单位进行IO操作的,而一个字符为两个字节;其最大的两个父类为Writer和Reader这两个抽象类,多通过FileWriter/FileReader这两个具体实现的子类来进行操作
如果是音频、图片、歌曲,就使用字节流;如果是文本的,使用字符流
注意:I/O对象不属于对象,需要自己关闭
具体操作
创建文件
// 创建文件 完整路径
String path = "E:/JavaCourse/day1/src/main/java/day9";
// path/1.txt
File file = new File(path.concat("/1.txt"));
//判断是否存在
if (file.exists() == false){
//不存在就创建
file.createNewFile();
}
向文件中写入字节流
// 向文件写入数据
// 1.创建文件输出对象
FileOutputStream fos = new FileOutputStream(file);
// 2.调用write方法写入
byte[] text = {'1','2','3','4'};
fos.write(text);
// 3.操作完毕需要关闭stream对象
fos.close();
读取字节流
//读取内容
FileInputStream fis = new FileInputStream(file);
byte[] name = new byte[12];
int count = fis.read(name);
fis.close();
System.out.println(count+" "+new String(name));
向文件中写入字符流
// 向文件写入数据-字符流
FileWriter fw = new FileWriter(file);
char[] name = {'安','卓','开','发'};
fw.write(name);
fw.close();
读取字符流
FileReader fr = new FileReader(file);
char[] book = new char[4];
count = fr.read(book);
fr.close();
System.out.println(count+""+new String(book));
文件中保存对象
向文件里面存一个对象,保存对象必须实现序列化即Serializable接口;如果对象内部还有属性变量是其他类的对象,这个类也必须实现接口
import java.io.Serializable;
public class Person implements Serializable {
public String name;
public int age;
public Dog dog;
}
class Dog implements Serializable{
public String name;
}
Dog wc = new Dog();
wc.name = "旺财";
Person xw = new Person();
xw.name = "小王";
xw.age = 20;
xw.dog = wc;
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(xw);
oos.close();
从文件中读取对象
// 从文件里面读取一个对象
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Person xw = (Person) ois.readObject();
ois.close();
System.out.println(xw.name+" "+xw.age+" "+xw.dog.name);
将一个文件拷贝到另一个位置
// 1.源文件的路径
String sourcePath = "C:\\Users\\管理员\\Desktop\\1.png";
// 2.目标文件的路径
String desPath = "E:\\JavaCourse\\day1\\src\\main\\java\\day9\\1.png";
// 3.图片、视频、音频 字节
FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(desPath);
byte[] in = new byte[1024];
while(true) {
int count = fis.read(in);
if (count != -1){
// 读取到内容了
// 将这一次读取的内容写入目标文件
fos.write(in,0,count);
}else{
break;
}
}
fis.close();
fos.close();
使用BufferedInputStream和BufferedOutputStream提高读写的速度
long start = System.currentTimeMillis();
String sourcePath = "C:\\Users\\管理员\\Desktop\\1.png";
String desPath = "E:\\JavaCourse\\day1\\src\\main\\java\\day9\\1.png";
// 输入流
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);
密码解锁demo
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOperation {
//文件的路径
public static final String PATH = "E:\\JavaCourse\\day1\\src\\main\\java\\Secert\\pas.txt";
//保存密码
String password;
//单例
public static final FileOperation instance = new FileOperation();
//私有化构造方法
private FileOperation(){
try {
load();
}catch (IOException e){
System.out.println("io异常");
}
}
//加载密码
public void load() throws IOException {
FileInputStream fis = new FileInputStream(PATH);
byte[] pwd = new byte[4];
int count = fis.read(pwd);
if (count == -1){
password = null;
}else{
password = new String(pwd);
}
fis.close();
}
//将密码保存到文件中
public void save(String password){
try {
FileOutputStream fos = new FileOutputStream(PATH);
fos.write(password.getBytes());
fos.close();
}catch (IOException e){
System.out.println("io异常");
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Secert {
public static void main(String[] args) throws IOException {
boolean logined = false;
// 判断是否登录
String password = FileOperation.instance.password;
if (password.length() > 0){
logined = true;
}
//提示用户操作
String alert;
if (logined){
alert = "请输入密码:";
}else{
alert = "请设置密码:";
}
System.out.println(alert);
String firt = null;
int wrongTime = 3;
while (wrongTime > 0) {
//接收用户输入
Scanner scanner = new Scanner(System.in);
String inputPassword = scanner.next();
//判断操作
if (logined) {
//已经登陆过 直接比较
if (password.equals(inputPassword)) {
System.out.println("解锁成功");
break;
} else {
System.out.println("解锁失败");
wrongTime--;
}
}else{
//没有登录过 设置密码
//判断是设置密码的第一次还是第二次
if (firt == null){
//第一次 保存第一次输入的密码
firt = inputPassword;
System.out.println("请确认密码:");
}else{
//第二次 比较两次输入的密码是否相同
if (firt.equals(inputPassword)){
System.out.println("设置密码成功");
//保存设置的密码
FileOperation.instance.save(firt);
break;
}else{
System.out.println("密码不一致");
firt = null;
wrongTime--;
}
}
}
scanner.nextLine();
}
}
}
心得体会
对于新学习的东西,还是十分不熟悉,要多谢谢,才能熟练掌握