一、 File类
File类是java.io包中很重要的一个类
● File类的对象可以表示文件,还可以表示目录,在程序中一个File类对象可以代
表一个文件或目录;
● File对象可以对文件或目录的属性进行操作,如:文件名、最后修改日期、文件
大小等;
● File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作
● 构造方法
File(String pathName); //指定文件(或目录)名和路径创建文件对象
● 常用方法
boolean exists() //判断文件是否存在
boolean isFile() //判断是否为文件
boolean isDirectory() //判断是否为目录String getName() //获得文件的名称
long length() //获得文件的长度
boolean createNewFile()throws IOException//创建新文件,有可能要抛出IOException异常,必须捕捉
boolean delete() //删除文件
public String[]list() //将目录下子文件及文件名返回到String数组中
public File[] listFiles() //将目录下子目录及文件的实例返回到File数组中
import javax.xml.transform.Source;
import java.io.File;
import java.util.Date;
/*
File类 的对象既可以表示文件,也可以表示文件夹
*/
public class Demo1 {
public static void main(String[] args) {
File f1 = new File("D:/JAVA/file/demo.txt");
System.out.println(f1.canRead());//是否可读
System.out.println(f1.canWrite());//是否可写入
//判断文件是否存在
System.out.println(f1.exists());
//获取文件绝对地址
System.out.println(f1.getAbsolutePath());
System.out.println(f1.getName());//获取文件名
System.out.println(f1.getParent());//文件的上一级地址
System.out.println(f1.isDirectory());//是否是文件夹
System.out.println(f1.isFile());//是否是普通文件
//最后一次改写时间
System.out.println(f1.lastModified());//返回的是长整型
System.out.println(new Date(1710639257338L));//转为时间值
System.out.println(f1.length());//文件的长度
System.out.println(f1.isHidden());//是否为隐藏文件
}
}
import java.io.File;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
File f1 = new File("D:/JAVA/file/a.txt");
// if(!f1.exists()){
// try {
// f1.createNewFile();
// } catch (IOException e) {//当上面代码有问题时,会运行下面这段
// e.printStackTrace();
// }
//创建文件(当所访问的路径上无文件)
if(!f1.exists()) {
System.out.println(f1.createNewFile());
}
//删除文件
System.out.println(f1.delete());
File file = new File("D:/JAVA/file/download");
//创建单级文件文件夹
System.out.println(file.mkdir());
//创建多级文件文件夹
File file1 = new File("D:/JAVA/file/a/b");
System.out.println(file.mkdirs());
//删除一个文件夹时。文件夹必须为空
file1.delete();
//展示文件
file=new File("D:/JAVA/file");
File[] files = file.listFiles();
for(File f:files){
System.out.println(f);
}
}
}
二、 输入及输出的概念
输入输出(I/O): 把电脑硬盘上的数据读到程序中,称为输入,即input,进行数据的read 操作从程序往外部设备写数据,称为输出,即output,进行数据的write操作
三、 字节流与字符流
Java中把用于对文件输入和输出的类 称为流 ,有一些类是以字节为读取单位的,有一些是以字符为单位读取数据的
● 字节流
字节流读取时以字节为单位,可以读取任意文件(.mp3、.jpg等)
跳转:五、 字节流
● 字符流
字符流读取时只能读取文本文件
跳转:六、 字符流
四、 输入流与输出流
流按着数据的传输方向分为:
● 输入流:往程序中读叫输入流。
● 输出流:从程序中往外写叫输出流。
● InputStream和OutputStream的子类都是字节流,可以读写二进制文件,主要处理音频、图片、歌曲、字节流,处理单元 为1个字节。
● Reader和Writer的子类都是字符流,主要处理字符或字符串,字符流处理单元为1个字符。 字节流将读取到的字节数据,去指定的编码表中获取对应文字字符。
五、 字节流
字节流中常用类:
字节输入流 FileInputStream 类
字节输出流 FileOutputStream 类
● 字节输入流
●基本方法 —— InputStream
一、读取一个字节并以整数的形式返回(0~255),如果返回-1,表示已到输入流的末尾。
int read() throws IOException
二、读取一系列字节并存储到一个数组buffer, 返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
int read(byte[] buffer) throws IOException
关闭流释放内存资源
void close() throws IOException
● 字节输出流
● 基本方法 —— OutputStream
一、向输出流中写入一个字节数据,该字节数据为参数b的低8位
void write(int b) throws IOException
二、将一个字节类型的数组中的从指定位置(off)开始的 len 个字节写入到输出流
void write(byte[] b, int off, int len) throws IOException
关闭流释放内存资源
void close() throws IOException
● 具体实现
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class InputStream {
public static void main(String[] args) throws IOException {
//输入-从硬盘上把文件读入到程序
/*
输入代码
*/
FileInputStream inputStream = new FileInputStream("D:/JAVA/file/streamDemo.txt");
// System.out.println(inputStream.read());//97
// System.out.println(inputStream.read());//98
// System.out.println(inputStream.read());//99
// System.out.println(inputStream.read());//100
// System.out.println(inputStream.read());//-1
//每次读取,当读取的不为-1时返回
/*
输出代码
*/
FileOutputStream outputStream = new FileOutputStream("D:/JAVA/file/outDemo.txt");
int b = 0;
while((b = inputStream.read())!=-1){
System.out.println(b);
outputStream.write(b);
}
//注意读取后要销毁管道
inputStream.close();
outputStream.close();
}
}
但,一次只读入一个字节过于慢,在 read()方法中,有一个
public int read(byte b[]) //返回值是一个int类型的
传入一个byte数组,读取byte数组长度的字符存在byte数组里,返回值表示在byte数组中存入了 int 个字符,
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class InputStream2 {
public static void main(String[] args) throws IOException {
//输入流
FileInputStream inputStream = new FileInputStream("D:/JAVA/file/streamDemo.txt");
FileOutputStream outputStream = new FileOutputStream("D:/JAVA/file/outDemo.txt");
byte[] bytes = new byte[10];
//read(bytes); 一次读byte数组长度个字符
//size 表示每次实际往数组中装入的元素个数
int size = 0;
//一次向外写出byte长度个字节内容,并从指定位置开始,写 size(有效范围)个字节
while((size = inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,size);
}
inputStream.close();
outputStream.close();
}
}
六、 字符流
字符流中常用类
字符输入流 FileReader类
字符输出流 FileWriter类
Reader和Writer的子类都是字符流,主要处理字符或字符串,字符流处理单元为1个字符。 字节流将读取到的字节数据,去指定的编码表中获取对应文字字符。
● Reader 的基本方法
读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。
int read() throws IOException
读取一系列字符并存储到一个数组buffer, 返回实际读取的字符数,如果读取前已到输入流的末尾返回-1
int read( char[] cbuf) throws IOException
关闭
void close() throws IOException
● Writer 的基本方法
向输出流中写入一个字符数据,该字节数据为参数b的16位
void write(int c) throws IOException
一个字符类型的数组中的数据写入输出流
void write( char[] cbuf) throws IOException
将一个字符类型的数组中的从指定位置(off set)开始的 length个字符写入到输出流
void write( char[] cbuf, int off set, int length) throws IOException
关闭
void close() throws IOException
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharDemo {
/*
字符流只能读取字符(文本文件)
会将独到的字符结合编码表转换为一个字符编码
*/
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("D:/JAVA/file/charDemo.txt");
FileWriter writer = new FileWriter("D:/JAVA/file/charOutDemo.txt");
int c = 0;
while((c=reader.read())!=-1){
System.out.println(c);
writer.write(c);
}
char[] chars = new char[2];
int size = 0;
while((size = reader.read(chars))!=-1){
writer.write(chars,0,size);
}
reader.close();
writer.close();
}
}
七、 节点流与处理流
根据封装类型不同流又分为:节点流 和 处理流
● 节点流:
如果流封装的是某种特定的数据源,如文件、字符串、字符串数组等,则称为节点流。
● 处理流:
如果流封装的是其它流对象,称为处理流。 处理流提供了缓冲功能,提高读写效率,同时增加了一些新的方法(BufferedInputStream(缓存字节输入流)、DataInputStream(数据输入字节流)等)
● 节点流中常用类
字节输入流 FileInputStream
字节输出流 FileOutputStream
字符输入流 FileReader
字符输出流 FileWriter
● 处理流中常用类
缓冲字节输出流 BufferedOutputStream
缓冲字节输入流 BufferedInputStream
缓冲字符输入流 BufferedReader
缓冲字符输出流 BufferedWriter
字节处理流:
import java.io.*;
public class BufferInputStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream inputStream = new FileInputStream("D:/JAVA/file/streamDemo.txt");
BufferedInputStream bufferInputStream = new BufferedInputStream(inputStream);
FileOutputStream outputStream = new FileOutputStream("D:/JAVA/file/outDemo.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
byte[] bytes = new byte[10];
int size = 0;
while ((size = bufferInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,size);
}
bufferInputStream.close();
bufferedOutputStream.close();
}
}
字符处理流:
import sun.font.TrueTypeFont;
import java.io.*;
public class Demo1 {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("D:/JAVA/file/charDemo.txt");
FileWriter writer = new FileWriter("D:/JAVA/file/charOutDemo.txt",true);
//当append为true时,会在源文件之后续写,而不是直接覆盖
BufferedReader bufferedReader = new BufferedReader(reader);
BufferedWriter bufferedWriter = new BufferedWriter(writer);
//一次读一行
String line = null;
while((line=bufferedReader.readLine())!=null){
//System.out.println(line);
bufferedWriter.write(line);
bufferedWriter.newLine();//插入一个换行符
}
bufferedReader.close();
bufferedWriter.flush();
bufferedReader.close();
}
}
八、 对象输入输出流--对象序列化
把Java中的对象输出到文件中,从文件中把对象输入到程序中
为什么要把对象输出到文件中?
数据存储在对象中,对象实在内存中存储,一旦程序运行结束,对象就会销毁
有时需要将对象的信息长久保存,就需要将对象输出到文件中,长久保存
把对象输出到文件的过程称为对象的序列化,再把对象从文件输出到程序的过程称为对象的反序列化(反序列化时会创建一个新的对象,所以反序列化也是创建对象的一种方式)
● 对象的输入输出流 :
主要的作用是用于写入对象信息与读取对象信息。 对象信息一旦写到文件上那么对象的信息就可以做到持久化了.
对象的输出流:ObjectOutputStream
对象的输入流:ObjectInputStream
● 在ObjectInputStream 中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。