目录
1.文件类
在Java中,java.io.File
类是用于表示文件系统中的文件和目录路径名的实用工具类。这个类提供了创建、删除、移动、重命名以及查询文件和目录的方法。但是需要注意的是,java.io.File
类并不支持文件锁定,而且它所提供的功能是基于文件系统的底层操作,并不涉及文件的读写操作。若需要进行文件的读写操作,应使用 java.io
包中的其他类,如 FileInputStream
、FileOutputStream
等。
其中包含了一些方法,直接看实例。
package day12;
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) {
//绝对路径
File file = new File("C:\\Users\\34569\\Desktop\\a.txt");
//相对路径
File file1 = new File("pro01/src/day12/b.txt");
//可读可写
System.out.println(file.canRead());
System.out.println(file.canWrite());
//判断文件是否隐藏
System.out.println(file.isHidden());
//判断file类型:文件 | 目录
System.out.println(file.isFile());
System.out.println(file.isDirectory());
//判断是否为绝对路径
System.out.println(file.isAbsolute());
//判断文件或目录是否存在
System.out.println(file.exists());
//文件或目录的创建
File file2 = new File("temp");
if (!file2.exists()){
//创建对应的子目录(基于父目录存在)
file2.mkdir();
}
//File file3 = new File("a/b/c");
//目录的创建(如果父级目录不存在,则父目录不存在)
//file3.mkdirs();
//创建临时文件
//File.createTempFile("AAA",".java",file2);
//删除文件或目录
//file.delete();
System.out.println("文件大小:"+file1.length());
System.out.println("最后修改时间"+file1.lastModified());
System.out.println("文件名:"+file1.getName());
String fileName=file1.getName();
System.out.println("格式:"+fileName.substring(fileName.lastIndexOf('.')));
System.out.println("路径:"+file1.getPath());
System.out.println("绝对路径:"+file1.getAbsoluteFile());
System.out.println("父目录:"+file1.getParentFile());
System.out.println("分区大小:"+file1.getTotalSpace());
System.out.println("空闲大小:"+file1.getFreeSpace());
}
}
2.FileInputStream
作用:用于读取文件的字节数据(字节输入流)。
实例运用:
package day12;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInput {
public static void main(String[] args) throws IOException {
//可读
FileInputStream fil= new FileInputStream("pro01/src/day12/b.txt");
//读取一个字符
//System.out.println((char)fil.read());
/*//循环读取,一次读取10个字节
int count = 0;
byte by[] = new byte[10];
while ((count = fil.read(by)) != -1) {
System.out.print(new String(by, 0, count));
}
System.out.println((char) fil.read());*/
//读取三个字节的数据为字节数组。
byte by[]=new byte[3];
fil.read(by);
System.out.println(new String(by));
//实现关流操作
fil.close();
}
}
3.FileOutputStream
作用:向文件中写人字节数据(字节输出流)。
实例运用:
package day12;
import javax.lang.model.element.NestingKind;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Fileoutput {
public static void main(String[] args) throws IOException {
//可写,true用于追加写入
FileOutputStream fil = new FileOutputStream("pro01/src/day12/c.txt",true);
//写入信息
String str="fhw\n";
//将字符串转换为字节数组
byte by[]=str.getBytes();
fil.write(by);
fil.close();
}
}
4.FileReader
作用:FileReader类创建了一个可以读取文件内容的Reader类(字符输入流)。
实例运用:
package day13;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReader_Text {
public static void main(String[] args) throws IOException {
//字符流
FileReader file = new FileReader("pro01/src/day13/readme.txt");
//一次读取一个
/*System.out.println((char)file.read());
System.out.println((char)file.read());
System.out.println((char)file.read());*/
//一次读取一个,循环读取
/* int ch=0;
while ((ch=file.read())!=-1){
System.out.print((char) ch);
}*/
//一次读取10个,循环读取
char chs[]=new char[10];
int len=0;
while ((len= file.read(chs))!=-1){
System.out.print(new String(chs,0,len));
}
file.close();
}
}
5.FileWriter
作用: FileWriter 创建一个可以写文件的Writer类(字符输出流)
实例运用:
package day13;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class FileWrite_Text {
public static void main(String[] args) throws IOException {
//字符流(输出流,如果文件不存在,将自动创建),如需追加数据,则在后面添加true
FileWriter file = new FileWriter("pro01/src/day13/hello.txt",true);
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要写入的数据:");
String str=scanner.nextLine();
file.write(str);
//刷流,内存->刷新->键盘
file.flush();
//file.close();
}
}
6.BufferedInputStream
缓冲字节输入流:BufferedInputStream。BufferedInputStream为另一个输入流添加一些功能,即缓冲输入以及支持`mark` 和`reset` 方法的能力。
实例运用:
package day13;
import java.io.*;
public class Buf_InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("pro01/src/day13/dk.txt");
BufferedInputStream bos = new BufferedInputStream(fis);
System.out.println((char) bos.read());
//做一个标记
bos.mark(0);
System.out.println((char) bos.read());
System.out.println((char) bos.read());
//是否支持mark()和reset()
System.out.println(bos.markSupported());
System.out.println("----------");
//回溯
bos.reset();
System.out.println((char) bos.read());
//跳过两个字符
bos.skip(2);
System.out.println((char) bos.read());
bos.close();
fis.close();
}
}
注:BufferedOutputStream()无新方法,与FileOutputStream()一样
7.BufferedReader
BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 mark和 reset方法。新增了readLine()方法用于一次读取一行字符串(以‘\r’或‘\n’认为一行结束)。
BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入,BufferedWriter也有readLine()方法,void newLine() 可以换行。
实例运用,实现文件的复制和粘贴:
package day13;
import java.io.*;
public class Ts {
public static void main(String[] args) throws IOException {
File file = new File("pro01/src/day13/dk.txt");
FileReader file1 = new FileReader(file);
BufferedReader brd = new BufferedReader(file1);
File file2 = new File("pro01/src/day13/hello.txt");
FileWriter file3 = new FileWriter(file2);
BufferedWriter hdc = new BufferedWriter(file3);
//先从文件中读出数据,再将读出的数据写入另一个文件
String str;
while ((str=brd.readLine())!=null){
hdc.write(str);
}
brd.close();
hdc.close();
}
}
8.转换流
转换流InputStreamReader和OutputStreamWriter分别将InputStream字节输入流和OutputStream字节输出流 转换成BufferedReader和BufferedWriter(字符缓冲流),以便实现高效率的读写操作
举例:
FileOutputStream fileOutputStream = new FileOutputStream("example.txt");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
9.打印流
在这里简单介绍一下字节打印流和字符打印流
请看两个实例说明:
1.字节打印流
package day14;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;
public class Text_PrintStr {
public static void main(String[] args) throws FileNotFoundException {
//字节打印流,可以自动刷流
PrintStream pri = new PrintStream("pro01/src/day14/one.txt");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要输出的内容");
String str=scanner.nextLine();
pri.println(str);
//追加输入内容
pri.append("搁浅");
pri.close();
}
}
2.字符打印流
package day14;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Text_PrintWri {
public static void main(String[] args) throws IOException {
//字符打印流,不自动刷流
PrintWriter pop = new PrintWriter("pro01/src/day14/two.txt");
/*如果需要连续追加,就可以这样
FileWriter fileWriter = new FileWriter("pro01/src/day14/two.txt",true);
PrintWriter pop = new PrintWriter(fileWriter);*/
String str="大话西游";
//传统的字符流输出方法
//pop.write(str);
pop.println(str);
pop.append("主演:周星驰");
pop.flush();
}
}
10.对象流
在Java中提供了ObjectlnputStream与ObjectOutputStream这两个类用于序列化对象的操作。使用对象输出流输出序列化对象的步骤,有时也称为序列化。使用对象输入流读入对象的过程,有时也称为反序列化。
下面请看实例:
首先我们先创建一个学生类:
package day14;
//序列化接口,接口中定义了一种特定序列化规则,以及反序列化规则
import java.io.*;
public class Student implements Serializable {
//Idea 配置自动生成序列号:
private static final long serialVersionUID = -8278694685252690580L;
//如果不希望类中的属性被序列化,可以在声明属性之前加上transient关键字。
private String name;
private int age;
private char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Student() {
}
public Student(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void stduy(){
System.out.println("好好学习,天天向上");
}
public void showMe(){
System.out.println("姓名:"+this.name+",年龄:"+this.age+",性别:"+this.sex);
}
//字符流:对象toString后的对象信息存入文件
//将对象信息,转换成为某种特定规则的字符串信息,字符串信息->文件中(序列化)
//从文件读取字符串信息->解剖->对象(反序列化)
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}
接下来我们写入对象数据(序列化)
package day14;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Tx_ObjectOpStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("pro01/src/day14/object.txt");
//创建对象流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student s1 = new Student("张三",22,'男');
oos.writeObject(s1);
oos.writeObject(null);
oos.flush();
/*对象数据存储思维:
1.
写:循环写入对象数据,最后再写null对象。
读:循环读取对象数据,当读取到null时候结束。
2。
写:把所有对象数据写入到集合中(List,Set,Map),将集合对象写入。
读:读取对象将对象强转换为集合对象,循环遍历集合。*/
}
}
最后读取对象数据(反序列化)
package day14;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Tx_ObjectIpStr {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("pro01/src/day14/object.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//Student obj=(Student) ois.readObject();
//System.out.println(obj);
//循环读取
//读取到最后没有对象不是返回Null,而是直接抛异常
Object obj=null;
while ((obj=ois.readObject())!=null){
Student student=(Student) obj;
System.out.println(student);
}
}
}
11.总结
以上就是我对IO流的理解,内容较多,比较繁杂,容易混淆,大家可以通过练习,多加巩固,以达到熟练掌握的地步。