十、IO
File类
java.io.File类
1.凡是与输入、输出相关的类、接口等都定义在java.io包下
2.File是一个类,可以有构造器创建其对象。此对象对应着一个文件或文件目录
3.File类对象是与平台无关的
4.File中的方法,仅涉及到如何创建、删除、重命名等等,只要涉及文件内容的,File无能为力。必须有IO流来完成
5.File类的对象常作为IO流的具体类的构造器的形参。
路径:
绝对路径:包括盘符在内的完整的文件路径
相对路径:在当前文件目录下的文件的路径
File方法
getName()//获取文件名
getPath()//获取文件路径
getAbsoluteFile()//获取绝对文件名
getParent()//获取上一层的文件路径//相对路径时null
getAbsolutePath()//获取绝对路径
renameTo(File newName)//重命名
file1.renameTo(file2)//file1重命名为file2.要求file文件一定存在,file2一定不存在
exists()//文件存在
canWrite()//文件可写
canRead()//文件可读
isFile()//是文件吗
isDirectory()//是文件目录
lastModfied()//最后修改时间
length()//内容长度
sysout(new Date(file1.lastModified()));
createNewFile()
delete()
mkDir():创建一个文件目录,只有在上层文件目录存在的情况下,才能创建
mkDirs():创建一个文件目录,若上层文件目录不存在,一并创建。
list() :得到文件目录的内容,用字符串数组接收
listFiles():得到文件目录的内容,用文件数组接收。
IO的体系
流
FileInputStream
//read()
@Test
public void test1(){
FileInputStream fis = null;
try {
File file1 = new File("g:/IO/hello2.txt");
fis = new FileInputStream(file1);
int b = fis.read();
while(b!=-1){
System.out.print((char)b);
b = fis.read();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fis != null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//read(byte[] byte)
@Test
public void test2(){
FileInputStream fis = null;
try {
File file2 = new File("g:/IO/hello2.txt");
fis = new FileInputStream(file2);
byte[] b = new byte[5];
int len ;
while((len = fis.read(b))!= -1){
for(int i= 0 ;i<len;i++){
}
String str = new String(b,0,len);
System.out.print(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
FileOutputStream
输出的物理文件可以不存在,当执行过程中,若不存在,会自动的创建,若存在,会将原有的文件覆盖
@Test
public void test3(){
File file3 = new File("g:/IO/hello3.txt");
FileOutputStream fos = null;
try{
fos = new FileOutputStream(file3);
fos.write(new String("I love myself!").getBytes());
}catch(Exception e){
e.printStackTrace();
}finally{
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
FileReaderFileWriter
@Test
public void test5(){
FileReader fr = null;
FileWriter fw = null;
try {
File file1 = new File("C:\Users\dell\Desktop\新建文件夹\java基础.txt");
File file2 = new File("C:\Users\dell\Desktop\新建文件夹\111.txt");
fr = new FileReader(file1);
fw = new FileWriter(file2);
int len;
char[] c = new char[1000];
while((len=fr.read(c))!=-1){
fw.write(c, 0, len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
BufferedInputStream/BufferedOutputStream
@Test
public void test6(){
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
File file1 = new File("D:\百度网盘下载\java\第10章:IO(day15-day16)\day15\day15_04IO流概述.wmv");
File file2 = new File("D:\百度网盘下载\java\第10章:IO(day15-day16)\day15\1.wmv");
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
int len;
byte[] b = new byte[1024];
while((len = bis.read(b))!= -1){
bos.write(b, 0, len);
bos.flush();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bis!= null){
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bos!=null){
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
BufferedWriter/BufferedReader
@Test
public void test7(){
BufferedWriter bw = null;
BufferedReader br = null;
try {
File file1 = new File("");
File file2 = new File("");
FileReader fr = new FileReader(file1);
FileWriter fw = new FileWriter(file2);
br = new BufferedReader(fr);
bw = new BufferedWriter(fw);
String str;
while((str = br.readLine())!= null){
bw.write(str);
bw.newLine();//换行
bw.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
转换流:
InputStreamReader / OutputStreamWriter(前提:数据是文本文件)
/*如何实现字节流与字符流之间的转换:
* 转换流:InputStreamReader OutputStreamWriter
* 编码:字符串 ---->字符数组
* 解码:字符数组--->字符串
*/
@Test
public void test8(){
BufferedReader br = null;
BufferedWriter bw = null;
try {
File file1 = new File("");
File file2 = new File("");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
br = new BufferedReader(isr);
bw = new BufferedWriter(osw);
String str;
while((str = br.readLine())!=null){
bw.write(str);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
标准的输入输出流:
标准的输出流:System.out
标准的输入流:System.in
str.toUpperCase();小写变大写
注:使用FileReader、FileWriter 可以实现文本文件的复制
对于非文本文件(视频文件、音频文件、图片),只能使用字节流
打印流:
打印流:字节流:PrintStream 字符流:PrintWriter
//创建打印输出流,设置为自动刷新模式(写入换行符或字节'
'时都会刷新输出缓存区)
if(ps != null){//把标准输出流(控制台输出)改成文件
System.setOut(ps);
}
数据流:
数据流:用来处理基本数据类型、String、字节数组的数据:DataInputStream DataOutputStream
对象流:
要实现序列化的类:1.要求此类是可序列化的,实现Serializable接口
2.要求类的属性同样的要实现Serializable接口
3.提供一个版本号,private static fianl long serialVersionUID
4.使用static 或 transient 修饰的属性,不可实现序列化
对象的序列化过程,将内存中的对象通过ObjectOutputStream转换为二进制流,存储到硬盘文件中
对象的反序列化过程,将二进制流通过ObjectInputStream转换为内存中的对象。
RandomAccessFile:
/*
* RandomAccessFile:支持随机访问
* 1.即可以充当一个输入流,又可以充当一个输出流
* 2.支持从文件的开头读取、写入
* 3.支持从任意位置的读入、写入(插入)
*/
@Test
public void testRandomAccess(){
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile(new File("hello.txt"),"r");
raf2 = new RandomAccessFile(new File("hello1.txt"),"rw");
byte[] b = new byte[5];
int len;
while((len = raf1.read(b)) != -1){
raf2.write(b,0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(raf1 != null){
try {
raf1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(raf2!=null){
try {
raf2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/*
* 实现文件指定位置插入数据
*/
@Test
public void test2(){
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(new File("hello1.txt"), "rw");
raf.seek(4);//把指针位置移到第4个位置
byte[] b = new byte[10];
int len;
StringBuffer sb = new StringBuffer();
while((len = raf.read(b))!=-1){
sb.append(new String(b,0,len));//把文件中当前指针位置后面的数据存到StringBuffer
}
raf.seek(4);
raf.write("YHS".getBytes());
raf.write(sb.toString().getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(raf!=null){
try {
raf.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}