File类概述和构造方法
private static void method1()
{
String path="C:\\itdemoe\\a.txt";
File file=new File(path);
}
private static void method2()
{
String path1="C:\\itdemoe";
String path2="a.txt";
File file=new File(path1,path2);
sout(file);
}
private static void method3()
{
File file1=new File("C:\\itdemoe");
String path="a.txt";
File file=new File(file1,path);
sout(file);
}
绝对路径和相对路径
//创建一个新的空的文件 createNewFile();
File file1=new File("C:\\itDemo\\aaa");
boolean result1=file1.createNewFile();
sout(result);
File file=new File("C:\\itDemo\\aa.txt");
boolean result=file.mkdir();
File类删除功能
File类判断和获取功能
File file=new File("C:\\ithDemo\\a.txt");
boolean result1=file.isFile();
boolean result2=file.isDirectory();
File file =new File("a.txt");
boolean result=file.exists();
sout(result);
File类高级获取功能
File file=new File("filemodule\\aaa");
if(!file.exists())
{
file.mkdirs();
}
File newFile=new File(file,"a.txt");
newDile.createNewFile();//注意:文件所在的文件夹必须存在
private static void deleteDir(File src){
//先删掉这个文件夹里面所有的内容
//递归 方法在方法体中自己调用自己
//注意:可以解决所有文件夹和递归相结合的题
//1.进入---得到src文件夹里面所有内容的File对象
File[] files=src.listFiles();
//遍历--得到src文件夹里面每一个文件和文件夹的File对象
for(File file:files)
{
if(file.isFile())
//判断--如果遍历到的File对象是一个文件,那么直接删除
{
file.delete();
}else
{//判断
//递归
deleteDir(file);//参数一定要是src文件夹里面的文件夹File对象
}
}
//最后在删除这个文件夹
src.delete();
}
练习
private static void getCount(HashMap<String,Integer>hm,File file)
{
File[] file=file.listFiles();
for(File f:files){
if(f.isFile()){
String fileName=f.getName();
String [] fileNameArr=fileName.split("\\.");
if(fileNameArr.length==2){
String fileEndName=fileNameArr[1];
if(hm.containsKey(fileEndName)){
//已经存在
//将已经出现的次数获取出来
Integer count =hm.get(fileEndName);
//这种文件又出现了一次
count++;
//把已经出现的次数给覆盖掉
hm.put(fileEndName,count);
}
else{
//不存在
//表示当前文件是第一次出现
hm.put(fileEndName,1);
}
}
}else{
getCount(hm,f);
}
}
}
IO 流概述和分类
I表示intput,是数据从硬盘进内存的过程,称之为读
O表示output,是数据从内存到硬盘的过程,称之为写
IO的数据传输,可以看做是一种数据的流动,按照流动的方向,以内存为参照物,进行读写操作
简单来说:内存在读,内存在写
用windows记事本打开能读的懂 ,那么这样的文件就是纯文本文件
//创建字节输出流的对象---告诉虚拟机我要往哪个文件中写数据了
FileOutputStream fos=new FileOutputStream("D:\\a.txt");
//FileOutputStream fos=new FileOutputStream(new File("D:\\a.txt"));
fos.write(97);
fos.close();
}
字节流写数据
FileOutputStream fos=new FileOutputStream("bytestream\\a.txt");
byte [] bys={82,34,56,78,9,00,45};
fos.write(bys,1,2);
fos.close();
字节流写完数据后,加换行符
\r\n
FileOutputStream fos=new FileOutputStream("bytes\\a.txt");
fos.write(97);
fos.write("\r\n".getBytes());
fos.write(98);
fos.write("\r\n".getBytes());
字节流写数据如何实现追加写入呢?
public FileOutputStream(String name,boolean append)
创建文件输出流以指定的名称写入文件,如果第二个参数为true,不会清空文件里的内容
try{
FileOutputStream fos= new FileOutputStream("a.txt");
fos.write(98);
}catch(IOException e)
{
e.printStackTrace();
}finally
{
if(fos!=null)
{
try{
fos.close();
}catch(IOException e){
e.printStackTrace();
}}}
字节流读数据
一次读一个字节
//如果文件不存在,那么就不会报错
FileInputStream fis=new FileInputSteam("bytestream\\a.txt");
int read=fis read();
//一次读取一个字节,返回值就是本次读到的那个字节数据
//也就是字符在码表中对应的那个数字
//如果我们想要看到的是字符数据,那么一定要强转成char
sout((char)read);
fis.close();
读取文件多个字节代码
FileInputStream fis=new FileInputSteam("bytestream\\a.txt");
//文件中多个字节
int b;
while((b=fis.read())!=-1)
{
sout((char)b);
}
fis.close();
复制文件
FileInputStream fis=new FileInputStream("C:\\itheima\\a.avi");
FileOutputStream fos=new FileOutputStream("bytestream\\a.avi");
int b;
while((b=fis.read())!=-1)
{
fos.write(b);
}
fis.close();
fos.close();
字节流操作的文件过大,那么速度慢
提高拷贝速度的解决办法
FileInputStream fis =new FileInputStream("C:\\itheima\\a.avi");
FileOutputStream fos=new FileOutputStream("bytestream\\a.avi");
byte[] bytes=new byte[1024];
int len;//本次读到的有效字节个数--这次读几个字节
while(len=fis.read(bytes))!=-1)
{
fos.write(bytes,0,len);
}
fis.close();
fos.close();
字节缓冲流
BufferOutputStream:字节缓冲输出流
BufferedInputStream:字节缓冲输入流
构造方法:
字节缓冲输出流:BufferedOutputStream(OutputStream out)
字节缓冲输入流:BufferedInputStream(InputStream in)
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
//利用缓冲流去拷贝文件
//创建一个字节缓冲输入流
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("bytestream\\a.txt"));
//创建一个字节缓冲输出流
BufferedOutputStream b0s=new BufferedOutputStream(newFileOutputStream("bytestrm\\b.txt"));
int b;
while((b=bis.read())!=-1)
{
bos.write(b);
}
bis.close();
bos.close();
//利用缓冲流去拷贝文件
//创建一个字节缓冲输入流
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("bytestream\\a.txt"));
//创建一个字节缓冲输出流
BufferedOutputStream b0s=new BufferedOutputStream(newFileOutputStream("bytestrm\\b.txt"));
byte [] bytes=new byte[1024];
int len;
while((len=bis.read(bytes))!=-1)
{
bos.write(bytes,0,len);
}
bis.close();
bos.close();
字符流
特殊操作流
properties
Properties prop=new Properties();
//增
prop.put("小龙女","杨过");
prop.put("郭靖","黄蓉");
sout(prop);
//删
prop.remove("郭靖");
sout(prop);
//改
//put---如果键不存在,那么就添加,如果键存在,那么就覆盖
prop.put("郭襄","杨过");
sout(prop);
//查
Object values=prop.get("郭靖");
sout(values);
//遍历
Set<Object>keys=prop.keySet();
for(Object key:keys)
{
Object value=prop.get(key);
sout(key+"="+value);
}
//装的是所有的键值对对象
Set<Map.Entry<Object,Object>> entries=prop.entrySet();
for(Map.Entry<Object,object> entry:entries){
Object key = entry.getkey();
Object value = entry.getValue();
sout(key+"="+value);
}
Properties作为集合的特有方法:
Properties prop=new Properties();
prop.setProperty("江苏","南京");
prop.setProperty("浙江","杭州");
prop.setProperty("山东","济南");
sout(prop);
String value=prop.getProperty("江苏");
sout(value);
//从属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
Set<String> keys=prop.stringPropertyNames();
for(String key:keys){
String value=prop.getProperty(key);
sout(key+"="+value);
}
Properties和IO流结合的方法:
//读取
Properties prop =new Properties();
FileReader fr=new FileReader("prop.properties");
//调用完了load方法之后,文件中的键值对数据已经在集合中了
prop.load(fr);
fr.close();
sout(prop);
Properties prop=new Properties();
prop.put("zhangsan","123");
prop.put("lisi","233");
prop.put("wangwu","421");
FileWriter fw=new FileWriter("prop.properties");
prop.store(fw,null);
fw.close();