File类的使用
- File类中的方法是针对于本地文件来使用的,该类可以在硬盘中操作:创建文件、删除文件、获取文件的大小、获取文件的路径(包括相对路径和绝对路径)、判断是否为文件或者是目录等等方法。
- 代码应用如下:
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File file = new File("abc.txt");
if (file.exists()) {
// file.delete();
// System.out.println("发现文件并删除");
System.out.println("判断是否为目录:"+file.isDirectory());
System.out.println("判断是否为文件:"+file.isFile());
System.out.println("获取当前文件的相对路径:"+file.getPath());
System.out.println("获取当前文件的绝对路径:"+file.getAbsolutePath());
System.out.println("获取文件大小:"+file.length());//单位:字节
}else {
try {
file.createNewFile();
System.out.println("没有发现文件,已经创建成功!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 运行结果如下:
判断是否为目录:false
判断是否为文件:true
获取当前文件的相对路径:abc.txt
获取当前文件的绝对路径:E:\Eclipse\EclipseWorkspace\FileDemo\abc.txt
获取文件大小:18
- 特别关注:在获取文件的相对路径和绝对路径时,如果你传入的文件路径本身就为绝对路径,例如:File file = new File(“D:abc.txt”);那么二者得出的结果是一样的,会返回绝对路径。只有当传入的路径为相对路径时,例如:File file = new File(“abc.txt”);绝对路径和相对路径的返回才会不同,相对路径返回该文件的相对路径,绝对路径返回文件的绝对路径。
流分类
按照流向分类(以内存为参照)
- 输入流:文件以流的形式流进内存,定义为输入流。
- 输出流:文件以流的形式流出内存,定义为输出流。
按照处理单元分类
- 字节流:以字节的方式流进流出内存,定义为字节流,一个字节=8byte。
- 字符流:以字符的方式流进流出内存,定义为字符流,一个字符=16Unicode。
- 缓冲流:利用该方法中自带的一行缓冲区传输数据。
- 二进制流:利用子类DataInputStream和DataOutputStream以二进制的单元方式进行数据的读写。(可以参考字符流代码处理,其中也要利用装饰模式,将其他类型的对象作为参数,传入二进制对象中。)
字节流-----代码参考
package org.dsl.ioproject;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class IOProject {
public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
try {
//定义读取文件的位置
in = new FileInputStream("d:/a.txt");
//定义写入文件位置
out = new FileOutputStream("d:/b.txt");
//定义字节缓冲数组,定义每次读取数据的大小
byte [] buf = new byte[10];
//定义标识,方便写入文件的大小判断
int len = -1;
while((len = in.read(buf)) != -1) {
//循环写入文件,每次写入从0开始,到每次写入不超过字节数组缓冲区定义的大小的真实长度为止
out.write(buf,0,len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//流使用完成后要关闭,否则不会写进文件中,关闭原则:先写后关,先关出再关入
if(out!=null)
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(in!=null)
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
特别注意
-
在定义文件的输入输出位置时,文件中的分隔符需要注意, 可以写成如下几种格式:
1. new FileInputStream("d:/a.txt");(Linux中分隔方式) 2. new FileInputStream("d://a.txt");(Linux中分隔方式) 3. new FileInputStream("d:\\a.txt");(windows中分隔方式) 4. 使用方法进行分隔自动匹配系统进行分隔File.pathSeparator(windows中文件的分隔";"),File.separator(windows中目录分隔符“\”)
-
.若单独使用输入流或者输出流时,在定义内存中的字符缓冲数组时,可以利用available()方法自动匹配需要操作的文件字节大小,例如:
1. InputStream in = new FileInputStream("d://a.txt"); 2. byte [] buf = new byte [in.available()];
-
在实际输入输出一起使用时,即将一个文件以流的形式读入内存,再以流的方式写进文件。一般会将字节缓冲数组定义较小,不会利用available()方法自动匹配需要操作的文件字节大小,进行一次性传输,主要避免文件过大,一次性读取会造成资源过载,所以一般定义较为合理,并且小于文件的实习大小的字符缓冲数组,例如:byte [] buf = new byte[10];但是如此处理在写文件时会出现问题,在每一次文件按照缓冲区的大小写入时,下一次会整体覆盖上一次的缓冲区的数据,但是文件最后一次传输时,文件的大小不足以覆盖整个缓冲区,这是会产生最后一次所能够覆盖的范围+倒数第二次缓冲区的剩余数据,作为最后一次整体返回,就会发生数据错乱的问题。解决的方法就是,将每次读进内存的实际大小写进最终文件,而不是将整个缓冲区的数据写进文件。代码示例如下:
图文理解:
字符流------代码参考
package CharIOProject;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class CharIODemo {
public static void main(String[] args) {
Reader reader = null;
Writer writer = null;
try {
reader = new FileReader("D://说明.txt");
writer = new FileWriter("D://个人说明.txt");
int len = -1;
char [] buf = new char [4];
StringBuffer sb = new StringBuffer();
while ((len = reader.read(buf))!=-1) {
sb.append(buf,0,len);
}
System.out.println(sb);
String context = sb.toString();
context = context.replace("name", "小花").replace("sex", "男");
writer.write(context);
System.out.println(context);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(writer != null)
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(reader != null)
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
缓冲流-----代码参考
package org.dsl.BuferedStreamDemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class BuferedStreamDemo {
public static void main(String[] args) {
Reader reader = null;
Writer writer = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
reader = new FileReader("D://说明.txt");
writer = new FileWriter("D://个人说明.txt");
//利用装饰模式将字符流装换为缓冲流
bufferedReader = new BufferedReader(reader);
bufferedWriter = new BufferedWriter(writer);
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = bufferedReader.readLine())!=null) {
sb.append(line);
}
System.out.println(sb);
String context = sb.toString();
context = context.replace("name", "小花").replace("sex", "男");
bufferedWriter.write(context);
System.out.println(context);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(bufferedWriter != null)bufferedWriter.close();
if(bufferedReader != null)bufferedReader.close();
if(writer != null)writer.close();
if(reader != null)reader.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
特别注意
所谓的缓冲流,就是利用装饰模式,将定义好的其他流以参数的形式传入到缓冲流类中,代码后面的入去和写入都是利用缓冲流类生成的新的对象,来进行读写的。
- 流关闭原则:
流使用完成后要关闭,否则不会写进文件中,关闭原则:先写后关,先关出再关入,如果有嵌套,先关外层,再关内层。
为避免写入文件时是空文件,会进行关闭流的操作,即使用close()方法将流关闭,也可以使用flush()方法,将流在缓冲区的数据刷新到要写入的文件中,其中close()方法包含flush()方法,使用close方法不仅可以将数据从缓冲区刷新到文件中,同期会释放资源,所以推荐使用close方法将流关闭处理。