1.File类
1.文件创建
创建的是文件还是文件夹,跟调用的方法有关。和后缀无关。
//创建File对象 \: window中使用\.第一个表示转移符。 而我们在linux或mac使用/. java语言跨平台操作。 window系统中也可以使用/ File file=new File("E:/hhhh/a.txt"); //创建文件,存在则不创建 boolean file1 = file.createNewFile(); System.out.println(file1);File file2=new File("E:/hhhh/bbb"); //创建文件夹 file2.mkdir(); //创建多级文件夹 File file3=new File("E:/hhhh/b/c/d"); file3.mkdirs();
2.删除
File file8=new File("a.text"); file8.createNewFile(); file8.delete(); File file9=new File("bbb"); file9.mkdirs(); file9.delete();
renameTo重命名|剪切
File file=new File("E:/hhhh/a.txt"); file.renameTo(new File("E:/197.txt")); file.setReadOnly();//设置文件只读 File file2=new File("E:/hhhh/bbb"); file2.mkdir(); file2.renameTo(new File("E:/hhhh/ccc"));
查询
File file=new File("demo");//获取路径 String name = file.getName();//获取文件名 String path = file.getPath();//获取文件相对路径 String absoluteFile = file.getAbsolutePath();//获取文件的绝对路径 String canonicalPath = file.getCanonicalPath(); System.out.println("名称:"+name); System.out.println("相对路径:"+path); System.out.println("绝对路径:"+absoluteFile); System.out.println("绝对路径:"+canonicalPath);
//获取指定目录下的子文件或子文件夹名 String[] list = file.list(); for(String s:list){System.out.println(s); }//获取指定目录下子文件或子文件夹对象 File[] files = file.listFiles();for(File f:files){ System.out.println(f.getName()+"是否为目录"+f.isDirectory()); }
File file = new File("E:/hhhh/179.txt"); //判断文件/文件夹是否存在 boolean exists = file.exists(); if (exists){System.out.println("存在"); }else {System.out.println("不");file.mkdirs(); } boolean directory = file.isDirectory(); System.out.println("是否是目录"+directory); File file1 = new File("E:/hhhh/178.txt"); boolean file2 = file1.isFile(); System.out.println("是否是文件"+file2);
File递归
public class Digui {public static void main(String[] args) {File file=new File("demo");print(file);}public static void print(File file){if(file.isFile()){if(file.getName().endsWith(".java")) {System.out.println(file.getName() + "路径" + file.getAbsolutePath());}}else {File[] files = file.listFiles();if(files.length>0) {for (File f : files) {print(f);}}}} }
2.IO流
IO流分类
以程序为基准点,写入文件里就是输出流,文件写进程序里就是输入流
1.流向:输入流和输出流 2.内容:字节流和字符流 3.方式:节点流和处理流
IO流提供了四个基类:
InputStream: 字节输入流
OutputStream: 字节输出流
Reader: 字符输入流
Writer: 字符输出流
1.字节输出流
public static void main(String[] args) throws IOException {//如果指定的文件不存在则自动创建. 目录不存在则出错//true允许追加内容,否则会覆盖原有内容OutputStream out = new FileOutputStream("E:/hhhh/a.txt",true);//out.write('a');out.write('9');out.write('a');out.write('b');String str="hello world";//字符串转换为字节数组类型。 getBytes()out.write(str.getBytes());//从0开始写入2个out.write(str.getBytes(),0,2);out.close(); }
2.字节输入流
InputStream inputStream = new FileInputStream("E:/hhhh/a.txt"); //读取一个字节,返回一个int类型,-1表示读取完毕 int read = inputStream.read();System.out.println((char)read);//存放读取的字节 byte[] bs=new byte[50]; //每次读取的字节个数 int read=-1; while ((read=inputStream.read(bs))!=-1){String str=new String(bs,0,read);System.out.println(str); } inputStream.close();
把文件复制到另一个盘,并改名
public static void main(String[] args) throws Exception {InputStream in=new FileInputStream("demo/a.txt");//InputStream in=new FileInputStream("demo/tu.jpg");OutputStream out=new FileOutputStream("demo2/c.txt");//OutputStream out=new FileOutputStream("demo2/qsl.jpg");byte[] bs=new byte[2048];int len=-1;while ( (len=in.read(bs))!=-1){//out.write(bs);out.write(bs,0,len);}in.close();out.close(); }
3.字符输出流
Writer w=new FileWriter("demo2/t.txt"); w.write("你好,啊啊啊"); w.write("你好,啊啊啊",0,3); w.close();
4.字符输入流
Reader r=new FileReader("demo2/t.txt"); /* 一次读取一个int len=-1;while( (len=r.read())!=-1){System.out.println((char) len);}*///一次读取多个char[] chars=new char[50];int size=-1;while ((size=r.read(chars))!=-1) {System.out.println(new String(chars, 0, size));}r.close();
public static void main(String[] args) throws Exception {Reader r=new FileReader("D:/小说.txt");Writer w=new FileWriter("E:/hhhh/小说cope.txt");Writer w2=new FileWriter("demo2/小说.txt");char[] c=new char[1024];int size=-1;while ( (size=r.read(c))!=-1 ){w.write(c,0,size);w2.write(c,0,size);}r.close();w.close();w2.close(); }
5.缓存流
在基础流上再进行了一次封装,提高了IO效率(基础流的容量小于缓存流时)
BufferInputStream
BufferOutputStream
public static void main(String[] args) throws Exception{long l = System.currentTimeMillis();InputStream in=new FileInputStream("demo/tu.jpg");BufferedInputStream bi=new BufferedInputStream(in);OutputStream out=new FileOutputStream("demo2/tu.jpg");BufferedOutputStream bs=new BufferedOutputStream(out);int len=-1;byte[] bytes=new byte[5];while ((len=bi.read(bytes))!=-1){bs.write(bytes,0,len);}bs.close();out.close();bi.close();in.close();long l1 = System.currentTimeMillis();System.out.println(l1-l); }
BufferedReader BufferedWriter
6.对象流
序列化时要保证对象类是可序列化的
implements Serializable
序列化,把对象信息写入到文件或网盘中
对象类需要可序列化,implements Serializable
Game game=new Game("张渺",18,9000); OutputStream ops=new FileOutputStream("demo/game.txt"); ObjectOutputStream oops=new ObjectOutputStream(ops); oops.writeObject(game); oops.close(); ops.close();
反序列化,把文件中写的对象信息输入到java程序中
InputStream is=new FileInputStream("demo/game.txt"); ObjectInputStream ois=new ObjectInputStream(is); Object o = ois.readObject(); System.out.println(o); ois.close(); is.close();
序列化ID
当完成序列化后,又修改了原本对象类中的内容且没有指定序列化ID,就不能完成反序列化
所有需要在序列化之前就指定序列化ID的值
保证后期修改了类成员也可以完成反序列化
如
private static final long serialVersionUID=1L;