一.文件
1.文件概念
文件是保存数据的地方,可以保存图片、视频、声音等。文件在程序中是以流的形式来操作的。
2.文件流
1)流
概念:数据从数据源(文件)和程序(内存)之间经历的路径。
2)输入流
概念:数据从数据源(文件)到程序(内存)的路径。
3)输出流
概念:数据从程序(内存)到数据源(文件)的路径。
3.常用的文件操作
1)创建文件对象相关构造器和方法
new File(String pathname):根据路径构建一个File对象
new File(File parent,String child):根据父目录文件+子路径构建
new File(String parent,String child):根据父目录+子路径构建
createNewFile:创建新文件
package com.syx.file;
import org.junit.Test;
import javax.annotation.processing.SupportedAnnotationTypes;
import java.io.File;
public class File01 {
public static void main(String[] args) {
}
//第一种创建文件的方法
@Test
public void created01(){
String filePath="e:\\news1.txt";
File file=new File(filePath);
}
//第二种创建文件的方法
@Test
public void created02() {
File parentFile = new File("e:\\");
String fileName = "news2.txt";
File file = new File(parentFile, fileName);
}
//第三种创建文件的方式
@Test
public void created03(){
String parentPath="e:\\";
String fileName="new3.txt";
File file = new File(parentPath,fileName);
}
}
2)获取文件的相关信息
getName(文件名字) getAbsolutePath(文件绝对路径)
getParent(文件父级目录) length(文件字节大小)
exists(文件是否存在) isFile(是不是一个文件) isDirectory(是不是一个目录)
4.目录操作和文件的删除
mkdir:创建一级目录
mkdirs:创建多级目录
delete:删除空白目录或文件
二.IO流
1.原理
1)用于处理数据的传输,如读写文件,网络通讯等。。。
2)Java.io包提供了各种流类和接口,用以获取不同类的数据,并通过方法输入或输出数据
3)输入input:读取外部数据到程序中
4)输出output:将程序数据输出到磁盘,光盘等存储设备中
2.流的分类
1)按照操作数据单位不同分为:字节流二进制文件,字符流文本文件
2)按照数据流的流向不同分为:输入流,输出流
3)按照流的角色的不同分为:节点流,处理流/包装流
三.IO流体系图和常用IO流的介绍
1.体系图
2.FileInputStream和FileOutputStream
FileInputStream主要作用于读取文件,将文件信息读到内存中
常用的构造方法有:FileInputStream(File file):将参数传入一个File类型的对象
FileInputStream(String name):将参数传入文件的路径
package com.syx.inputstream_;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream_ {
public static void main(String[] args) {
}
@Test
public void readFile01() {
String filePath = "d:\\hello.txt";
int readData = 0;
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(filePath);
while ((readData = fileInputStream.read()) != -1) {
System.out.println((char) readData);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
}
FileOutputStream主要作用是将数据写入到输出流file或一个flieDescriptor中
常用的构造方法:FileOutputStream(File file):将参数输出流以写入由指定的File对象表示的文件
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
3.FileReader和FileWriter
1)FileReader
常用方法:new FileReader(File/String)
read:每次读取单个字符,返回该字符,如果到文件末尾返回-1
read(char[ ]):批量读取多个字符到数组,返回读取到的字符数,
如果到文件尾返回-1
new String(char[ ]):将char[ ]转换成String
new String(char[ ],off,len):将char[ ]的制定部分转换成String
概念:FileReader允许web应用程序异步存储在用户的计算机上的文件的内容,使用File或Blob对象指定要读取的文件或者数据
2)FileWriter
常用方法:new FileWriter(File/String)
new FileWriter(File/String,true)
writer(int):写入单个字符
writer(char[]):写入指定字符
writer(char[],off,len):写入指定数组的指定部分
writer(string):写入整个字符串
writer(string,off,len):写入字符串的指定部分
概念:用来写入字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可以接受的。
注意:FileWriter使用后,必须关闭或者刷新,否则无法写入指定文件
4.节点流和处理流
1)节点流
概念:可以从一个特定的数据源读写数据,如FileReader,FileWriter
2)处理流
概念:处理流是连接在已经存在的流之上,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader
好处:性能提升:主要以增加缓冲的方式来提高输入输出的效率
操作便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批数据,使用更加灵活
5.处理流——BufferedReader和BufferedReader
1)概念:BufferedReader是将字节流放到字符流缓冲区之中,使用这个流不需要自定义char数组。BufferedWriter是自带缓冲的字符输出流。
2)BufferedReader方法:read()读取一个或多个字节,返回一个字符,当读到文件尾时返回-1
fill()从底层输入流中填充字符到缓冲区中
readerLine()读一行文字并返回该行字符,若读到文件尾返回null
flush()刷新
close()关闭资源释放链接
BufferedWirter方法:writer.writer(char)写入一个字符
writer.writer(char[],0,len)写入一组字符
writer.writer(string)写一行
writer.newLine();写换行
6.处理流——BufferedInputStream和BufferedOutputStream
1)BufferedInputStream
概念:BufferedInputStream是字节流,在创建时会创建一个内部缓冲区数组,当从流中读取或者跳过字节时,内部缓冲区将根据需要 从所包含的输入流中重新填充,一次有多个字节
构造方法:BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
方法:int available()返回从该输入流中可以读取的字节数的估计值
void close()关闭此输入流并释放与流相关的任何系统资源
void mark(int readlimit)
boolean markSupperted()测试这个输入流是否支持mark和reset方法
int read()
int read(byte[] b,int off,int len)将字节输入流中的字节读入指定的字节数组
2)BufferedOutputStream
概念:字节缓冲输出流,提供缓冲功能,在创建对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写提高系统效率
构造方法:BufferedOutputStream(InputStream in)
BufferedOutputStream(OnputStream out)
方法:void close()关闭此输入流并释放与流相关的任何系统资源
void flush()刷新
void write(byte[] b)将b.length字节从指定的字节数组写入此输入流
7.对象流介绍及对象流——ObjectInputStream和ObjectOutputStream
1)对象流介绍
功能:提供了对基本类型或者对象类型的的序列化和反序列化的方法
2)序列化和反序列化
序列化就是在保存数据时,保存数据的值和数据类型
反序列化就是在恢复数据时,回复的数据的的值和数据类型
必须让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable接口或者Externalizable接口
3)ObjectInputStream
概念:反序列化流,将之前使用的ObjectOutputStream序列化的原始数据恢复为对象,以流的方式读取对象
构造方法:ObjectInputStream(InputStream in)
方法:public final Object readObject()
4)ObjectOutputStream
概念:对象的序列化流,作用是把对象转成字节数据输出到文件中保存,对象的输出过程称为序列化,可实现对象的持久存储
构造方法:protected ObjectOutStream()
ObjectOutputStream(OutputStream out)
方法:void close() 关闭流
void defaultWriteObject() 将当前类的非静态和非瞬态字段写入此流
void flush() 刷新该流的缓冲
void reset() 重置将丢弃已写入流中的所有对象的状态
void write(byte[] buf) 写入一个 byte 数组
void write(byte[] buf, int off, int len) 写入字节的子数组
void write(int val) 写入一个字节
void writeBoolean(boolean val) 写入一个 boolean 值
void writeByte(int val) 写入一个 8 位字节
8.标准输入输出流
类型 | 默认设备 | |
System.in标准输入 | InputStream | 键盘 |
System.out标准输出 | PrintStream | 显示器 |
9.转换流介绍及转换流——InputStreamReader和OutputStreamWriter
1)转换流介绍
作用:提供了在字节流和字符流之间的转换,字节流中的字符都是字符时,转换成字符流的操作更高效
2)InputStreamReader
概念:时Reader的子类,可以将InputStream包装成Reader
构造方法:InputStreamReader(InputStream in)创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in,String charsetName)创建止指定字符集
方法:int read()读取单个字符并返回
int read(char[] cbuf)读取多个字符
void close()关闭该流并释放与之关联的所有资源
3)OutputStreamReader
概念:是从字符流到字节流的桥接,使用指定的字符集将写入其中的字符编码为字节
构造方法:OutputStreamWriter(OutputStream out)创建使用默认字符集
OutputStreamWriter(OutputStream out,String charsetName)创建止指定字符集
方法:void write(int c)写入单个字符
void write(char[] cbuf)写入字符数组
void write(String str)写入字符串
void write(String str,int off,int len)写入字符串的一部分
10.打印流——PrintStream和PrintWriter
打印流只有输出流没有输入流
1)PrintStream
作用:包含用于创建用户界面和绘制图形图像的所有类,通过数据流,序列化和文件系统提供系统输入和输出
printWriter用法与PrintStream几乎一样
第三周课后练习:
package com.lalala.file;
import org.junit.Test;
import java.io.File;
public class FileInformation {
public static void main(String[] args) {
}
@Test
public void info(){
File file=new File("d:\\蓝旭培训/news1.txt");
System.out.println("文件名字="+file.getName());
System.out.println("文件的绝对路径="+file.getAbsolutePath());
System.out.println("文件的父目录="+file.getParent());
System.out.println("文件大小(字节)="+file.length());
System.out.println("文件是否存在="+file.exists());
System.out.println("是不是一个文件="+file.isFile());
System.out.println("是不是一个目录="+file.isDirectory());
}
}
package com.lalala.file;
import org.junit.Test;
import java.io.File;
public class Directory_ {
public static void main(String[] args) {
}
@Test
public void m1(){
String filePath="d:\\蓝旭培训/news1.txt";
File file = new File(filePath);
if(file.exists()){
if(file.delete()){
System.out.println(filePath+"删除成功");
}else{
System.out.println("删除失败");
}
}else {
System.out.println("该文件不存在");
}
}
}