一、File文件操作
(1)File类的基本操作方法
public static void main(String[] args) {
// File类:表示文件或目录的路径抽象表示形式
// IO: input/output 输入输出
// File file = new File("c:\\test\\moliying.txt");
// File file = new File(
// "c:"+File.separator+"test"+File.separator+"moliying.txt");
File file = new File("moliying.txt");
System.out.println(file);
// 判断文件是否存在
if (!file.exists()) {
System.out.println("文件不存在");
System.out.println("创建该文件...");
try {
// 创建文件
boolean b = file.createNewFile();
System.out.println("文件创建:" + b);
} catch (IOException e) {
e.printStackTrace();
}
}
// 检查File是文件或目录
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否是目录:" + file.isDirectory());
// 获取全路径(绝对路径)
System.out.println("绝对路径=" + file.getAbsolutePath());
// 获取文件名:带扩展名
System.out.println("文件名:" + file.getName());
// 获取文件最后修改的时间
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(new Date(file.lastModified())));
// 文件是否可读
System.out.println("是否可读:" + file.canRead());
// 文件是否可写
System.out.println("是否可写:" + file.canWrite());
// 文件是否为隐藏文件
System.out.println("是否是隐藏文件:" + file.isHidden());
// 相对路径
System.out.println("相对路径:" + file.getPath());
// 文件大小
System.out.println("文件大小:" + file.length());
File f2 = new File("c:\\test\\vince");
if (!f2.exists()) {
f2.mkdirs();// 创建多级目录
System.out.println("目录已创建");
}
File f3 = new File("c:\\test\\mly.txt");
if (f3.exists()) {
/*
if (f3.isFile()) {
f3.delete();
System.out.println("删除成功");
}
*/
//即可重命名,又可以实现移动文件
f3.renameTo(new File("c:\\moliying.txt"));
System.out.println("重命名成功");
}
//创建临时文件
/*
try {
File f4 = File.createTempFile("mly-", null);
System.out.println(f4.getAbsolutePath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
}
(2)文件搜索:请在指定文件目录中查找.jpg文件
findFile(new File("C:\\"),".jpg");
private static void findFile(File dir,String ext){
File target = dir;
if(target==null)return;
if(target.isDirectory()){
File[] fs = target.listFiles();
if(fs!=null){
for(File f:fs){
findFile(f,ext);
}
}
}else{
String fileName = target.getName().toLowerCase();
if(fileName.endsWith(ext)){
System.out.println(target.getAbsolutePath());
}
}
}
二、字节流
IO 流是用于对文件内容进行操作
从数据类型划分,可以分为字节流和字符流
从数据流向划分,可以分为输出流和输入流
输出流:针对程序来说,把数据从程序输出到文件中
输入流:针对程序来说,把数据从文件输入到程序中
字节输出流:
OutputStream 字节输出流的父类
FileOutputStream 文件字节输出流
/**
* 把字节输出到文件中
*/
public static void outputStream(){
//1要确定你要输出的目标文件
File file = new File("c:\\test\\mly.txt");
//2准备你要输出的数据
String data = "hello xiaohuang";
//3创建文件输出流
// OutputStream out = null;
try(OutputStream out = new FileOutputStream(file)) {
//out = new FileOutputStream(file);
//4通过输出流把数据写入文件
out.write(data.getBytes());
//5关闭输出
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
字节输入流:
InputStream 字节输入流的父类
FileInputStream 文件字节输入流
//把文件中的数据输入到程序中
public static void inputStream(){
//1、要确定读取的目标文件
File file = new File("c:\\test\\mly.txt");
//2、创建一个文件输入流绑定这个目标文件
try {
InputStream in = new FileInputStream(file);
//3、确定每次要读取的字节大小
// byte[] bs = new byte[1024*1024*10];
byte[] bs = new byte[4];
int len = -1;//每次从文件中读取数据的实际长度
StringBuilder sb = new StringBuilder((int)file.length());
while((len=in.read(bs))!=-1){
sb.append(new String(bs,0,len));
}
//5、关闭输入流
in.close();
System.out.println(sb);
//4、循环读取数据,(保存或输出到控制台)
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
示例:
从控制台输入一句话,可以把这句话客写入文件中,直到输入ok退出
private static void saveDataFormConsole() throws IOException{
File file = new File("c:\\test\\vince.txt");
OutputStream out = new FileOutputStream(file);
Scanner input = new Scanner(System.in);
String exit = "ok";//退出的标记
do{
System.out.println("请输入:");
String info = input.nextLine();
if(exit.equalsIgnoreCase(info)){
break;
}else{
out.write(info.getBytes());
//向文件中输出换行符 (\r\n)
String separator = System.getProperty("line.separator");
out.write(separator.getBytes());
}
}while(true);
out.close();
}
注意,使用字节流处理文本文件时,由于文本文件中的字符可能使用不同的编码,
比如,中文使用2个字节表示,英文字符使用单字节表示,此时,在读取部分内容时
可以出现乱码。所以,这种情况下,我们应该使用字符流来处理。
所谓字符流,就是按文本文件中的每个字符为单位进行处理,所以处理文本文件,通常
建议使用字符流,其它任意情况都建议使用字节流
三、字符流
//处理的单位是字符
private static void read() throws IOException{
Reader reader = new FileReader("c:\\test\\io.txt");
char[] cs = new char[32];
int len = -1;
StringBuilder sb = new StringBuilder(100);
while(true){
len=reader.read(cs);
if(len==-1){break;}
sb.append(new String(cs,0,len));
}
reader.close();
System.out.println(sb);
}
字节流与字符流的区别?
1、字节流会在执行write方法时,直接把数据写入磁盘
2、字符流会在执行write方法时,把数据保存到缓存中,在关闭或刷新时会把缓存的
数据同步到磁盘中。
字符缓存默认8KB,刷新缓存的方式有三种:
(1)缓存已满
(2)手动调用flush方法
(3)手动调用close方法
字符流是基于字节流上的实现
四、转换流:
(1)InputStreamReader
把输入的字节流转换为字符流处理
(2)OutputStreamWriter
把输出的字节流转换为字符流处理
五、缓冲流
缓冲流给字节或字符提供一种功能的增强,加入缓冲(缓存)的流操作,可以提高
写入或读取的效率,在使用流操作时必需添加缓冲
BufferedInputStream : 字节输入缓冲流
BufferedOutputStream:字节输出缓冲流
BufferedReader:字符输入缓冲流
BufferedWriter:字符输出缓冲流
六、打印流
PrintStream: 字节打印流,给字节输出增强功能
PrintWriter: 字符打印流,给字符输出增强功能
补充作业:
实现一个文件目录的复制