Java高级部分--文件与流(序列化)(3)

一.文件管理

1.Java中的对文件的管理,通过java.io包中的File类实现。

2.File类的方法及含义

boolean createNewFile() 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。

static File createTempFile(String prefix,String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

static File createTempFile(String prefix,Stirng suffix,File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

boolean exists( ) 测试此抽象路径名表示的文件或目录是否存在。

boolean delete( ) 删除此抽象路径名表示的文件或目录。

boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。

boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。

boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。

String[] list( )  返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。

String getAbsolutePath( ) 返回抽象路径名的绝对路径名字符串。

String getName( ) 返回由此抽象路径名表示的文件或目录的名称,不包括路径名称。

String getPath( ) 将此抽象路径名转换为一个路径名字符串。

File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。

boolean renameTo(File dest ) 重新命名此抽象路径名表示的文件。

long length( ) 返回由此抽象路径名表示的文件的大小,以byte为单位。

boolean mkdir( ) 创建此抽象路径名指定的目录。

boolean mkdirs( ) 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。注意,如果此操作失败,可能已成功创建了一些必需的父目录。


 •需求:桌面(C:/Users/Administrator/Desktop)路径下创建test文件夹,test文件夹下创建abc.txt。

 1 package io;
 2 
 3 import java.io.File;  
 4 import java.io.IOException;
 5 
 6 public class File1 {
 7  
 8     public static void main(String[] args) throws IOException {
 9             
10            File   f3=new File("C:/Users/Administrator/Desktop/test");
11            File   f4=new File(f3, "abc.txt");
12              
13            f3.mkdirs();             //创建文件夹,联通父目录一起创建
14            f4.createNewFile(); //创建文件
15            
16            System.out.println(f4.exists());   //判断是否存在该文件
17       //  f4.delete();   //删除文件
18            System.out.println(f4.canRead());   //是否可以读取该文件中的内容
19            System.out.println(f4.canWrite());   //是否该文件可修改
20            
21            System.out.println("------------------------------------------------");
22            String   str[]=f3.list();   //获取该文件夹中的所有文件名
23            for(int i=0;i<str.length;i++){
24                System.out.print(str[i]+"    ");
25            }
26            System.out.println();     //换行
27            
28            File  f[]=f3.listFiles();    //获得该文件加下的所有文件对象
29            for(int i=0;i<f.length;i++){
30                System.out.print(f[i]+"    ");
31            }
32            
33            
34            System.out.println();   //换行
35            System.out.println("执行成功");  
36            
37         
38     }
39 
40 }

•需求:删除test文件夹下所有名字包含a的文件

 1 package io;
 2 
 3 import java.io.File;
 4 
 5 public class File2 {
 6 
 7     
 8     public static void main(String[] args) {
 9         File f1 = new File("C:/Users/Administrator/Desktop/test");
10         File files[] = f1.listFiles();
11         for (int i = 0; i < files.length; i++) {
12             String   name=files[i].getName();
13             if (files[i].isFile() && name.substring(0, name.lastIndexOf(".")).contains("a")) {
14                 files[i].delete();
15             }
16         }
17         System.out.println("删除成功");
18 
19     }
20 }

二.流

流的作用:数据传递

分类:

1.按方向分:

               输入流  in

               输出流  out

2.根据操作的数据分:

                          字节流(节点流) stream

                          字符流  reader writer

3.按功能分:

              节点流(基础流)

              处理流(过滤流) buffered

流使用的步骤:

                   1指定文件(数据源    数据宿)

                   2架设节点流的管道,架设处理流的管道

                   3调用读取或写入方法

                   4(在写入流中用flush刷新缓冲区)关闭流

字节输入流:

              fileinputstream

              字节 空格 符号

字节输出流:

               fileOutputstream

               字节 空格 符号

字符输入流:

              字节 空格 符号

字符输出流 (flush刷新缓冲区):

                                      字符串 空格 符号

处理流(输入输出字节处理流):

                                    Bufferedinputstream  

                                    Bufferedoutputstream 

 输入输出字符处理流:

                           Bufferedreader- - 读行

                           Bufferedwriter- - 换行写入

•需求:桌面(C:/Users/Administrator/Desktop)路径下创建a.txt,a.txt下写入Pioneer.HengYu

 1 package io;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.File;
 6 import java.io.FileNotFoundException;
 7 import java.io.FileReader;
 8 import java.io.FileWriter;
 9 import java.io.IOException;
10 
11 public class BufferReader1 {
12 
13     
14     public static void main(String[] args) throws IOException {
15         
16 
17         File f1 = new File("C:/Users/Administrator/Desktop/a.txt");
18         FileWriter fWriter = new FileWriter(f1);
19         BufferedWriter bWriter = new BufferedWriter(fWriter);
20         bWriter.write("Pioneer.HengYu");
21         bWriter.flush();    //刷新过滤流的缓冲区(写入)
22         fWriter.close();
23         bWriter.close();
24         System.out.println("执行成功");
25 
26     }
27 
28 }

mark:标记

         有两个或多个标记同时存在时,按照代码执行顺序,最后执行的标记生效

skip:跳过字符

        skip在mark前执行,然后reset到mark上时,两次都跳过字符

        skip在mark后执行,然后reset到mark上时,当次跳过字符

reset:重置到最新标记的位置上

 1 package io;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileReader;
 7 import java.io.IOException;
 8 
 9 public class BufferedReader2 {
10 
11     
12     public static void main(String[] args) throws IOException {  
13         
14         //   BufferedReader  bf2=new BufferedReader(new FileReader("d:/a/b/c/test/a.txt"));  
15         
16            File    file=new File("C:/Users/Administrator/Desktop/a.txt");
17            FileReader   fReader=new FileReader(file);
18            BufferedReader   bReader=new BufferedReader(fReader);
19            
20               //一次读3行  
21             for(int i=0;i<3;i++){
22                 System.out.println(bReader.readLine());  
23             }
24           
25            bReader.skip(1);    //跳过字符
26            bReader.mark(2);    //第二次标记    
27             //暂停下载            
28             for(int i=0;i<3;i++){
29                 System.out.println(bReader.readLine());  
30             }
31             
32                   
33             for(int i=0;i<3;i++){
34                 System.out.println(bReader.readLine());  
35             }
36 
37             bReader.reset();      //重置到最新标记的位置上
38             for(int i=0;i<3;i++){
39                 System.out.println(bReader.readLine());  
40             }
41            
42            
43     
44            
45 
46     }
47 
48 }

执行结果

•需求:模拟服务器返回一个网页(传递的是浏览器能够解析的代码)

 1 package io;
 2 
 3 import java.io.File;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.io.PrintWriter;
 7 
 8 public class PrintWriter1 {
 9 
10 
11     public static void main(String[] args) throws IOException {
12             
13         File  f1=new File("d:/a.html");  //d盘下创建a.html
14         f1.createNewFile();
15         FileWriter   fw1=new FileWriter(f1);
16         PrintWriter   pWriter=new PrintWriter(fw1);
17         pWriter.println("<html>");
18         pWriter.println("<head>");
19         pWriter.println("</head>");
20         pWriter.println("<body>");
21         pWriter.println("<h1>服务器端传递给客户端的网页数据</h1>");
22         pWriter.println("</body>");
23         pWriter.println("</html>");
24         pWriter.flush();
25         fw1.close();
26         pWriter.close();
27         
28     
29         System.out.println("执行成功"); 
30 
31     }
32 
33 }

•需求:更改输出设备不在控制台输出信息,将输出设备更改到指定的文件上(日志)

 1 package io;
 2 
 3 import java.io.File;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.PrintStream;
 8 
 9 public class PrintStream1 {
10 
11     
12     public static void main(String[] args) throws IOException {  
13         
14         File file = new File("d:/a/b/c/test/a.txt");
15         FileOutputStream fos = new FileOutputStream(file, true);  //ture的话,原有数据不会被清空掉,可以继续追加信息
16         PrintStream ps = new PrintStream(fos);
17         
18         System.setOut(ps);
19         System.out.println("123");  
20         
21         
22         System.setErr(ps);
23         System.out.println("输出设备更改到指定的文件上");
24         
25         fos.close();
26         ps.close();
27 
28     }
29 
30 }

•需求:C盘图片复制到G盘(可改图片名)

 1 package io;
 2 
 3 import java.awt.Image;
 4 import java.awt.image.RenderedImage;
 5 import java.io.File;
 6 import java.io.IOException;
 7 
 8 import javax.imageio.ImageIO;
 9 
10 public class ImageIo1 {
11 
12     
13     public static void main(String[] args) throws IOException {
14 
15         File  f1=new File("C:/Users/Administrator/Desktop/1.png");    //1.png是电脑中已有图片
16          Image  img=ImageIO.read(f1);  //向上转型      读取源文件
17      
18        ImageIO.write((RenderedImage)img, "png", new File("g:/2.png"));   //将读取的源文件写入目标位置
19          
20          System.out.println("执行成功");  
21          
22           }
23 }

*对象在流中不能直接传递,需要先将对象序列化,再进行传递,对象(Object)序列化是指将对象转换为字节序列的过程

序列化:通过使用ObjectInputStream和ObjectOutputStream类保存和读取对象的机制叫做序列化

          ObjectOutputStream类:ObjectOutputStream类继承OutputStream类,并实现了ObjectOutput接口。它负责向流写入对象

                                 主要方法:writeObject(Object obj) 向指定的OutputStream中写入对象obj

      ObjectInputStream类 :ObjectInputStream类继承InputStream类,并实现了ObjectInput接口。它负责从流中读取对象

                                 主要方法:readObject(Object obj) 从指定的InputStream中读取对象

序列化类的步骤:  (自动将对象转换成byte序列   ----可以在流传递-----  操作系统会将字节序列转换成对象

(1)创建Person类,实现序列化接口,声明属性,提供构造方法和set、get方法(ObjectOutputStream1中主要运用get方法取值)

(2)实现序列化接口--->Person implements  Serializable   

(3)在ObjectOutputStream1类中先运用ObjectOutputStream类(它负责向流写入对象)、writeObject方法将对象写入一个文件夹中,再通过ObjectInputStream类(它负责从流中读取对象)、readObject方法读取出来

(4)建议所有可序列化类都显式声明 serialVersionUID 值(static final long serialVersionUID = 42L;

(5)transient关键字:transient修饰的属性不进行序列化的操作,起到一定消息屏蔽的效果

 1 person类
 2 
 3 package io;
 4 
 5 import java.io.Serializable;
 6 
 7 public class Person implements  Serializable {   
 8     
 9     static final long serialVersionUID = 42L;   
10 
11        
12             String   name;
13           transient  String   password;     //屏蔽写入到磁盘文件上的属性
14             int   age;
15             String   sex;
16             
17             public Person(String name, int age, String sex) {
18                 
19                 this.name = name;
20                 this.age = age;
21                 this.sex = sex;
22             }
23 
24             public String getName() {
25                 return name;
26             }
27 
28             public void setName(String name) {
29                 this.name = name;
30             }
31 
32             public int getAge() {
33                 return age;
34             }
35 
36             public void setAge(int age) {
37                 this.age = age;
38             }
39 
40             public String getSex() {
41                 return sex;
42             }
43 
44             public void setSex(String sex) {
45                 this.sex = sex;
46             }
47 
48 }
 1 ObjectOutputStream1类(主方法)
 2 
 3 package io;
 4 import java.io.File;
 5 import java.io.FileInputStream;
 6 import java.io.FileNotFoundException;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 import java.io.ObjectInputStream;
10 import java.io.ObjectOutputStream;
11 
12 public class ObjectOutputStream1 {
13 
14     /**
15      *   将创建的person对象写入a文件中
16      */
17     public static void main(String[] args) throws Exception {
18         
19         File file = new File("d:/a.txt");
20         FileOutputStream   fos=new FileOutputStream(file);
21         ObjectOutputStream   oos=new ObjectOutputStream(fos);//处理流,过滤流
22         Person   p1=new Person("Pioneer.HengYu", 23, "男");
23         oos.writeObject(p1);   
24         oos.flush();
25         fos.close();         //关闭基础流
26         oos.close();        //关闭过滤流
27         System.out.println("执行成功");
28         
29         
30         FileInputStream   fis=new FileInputStream(file);
31         ObjectInputStream   ois=new ObjectInputStream(fis);
32         Person   p=(Person)ois.readObject();   //向下转型(强转)
33         System.out.println(p.getName());
34         System.out.println(p.getAge());
35         System.out.println(p.getSex());
36         fis.close();
37         ois.close();
38           
39         
40 
41     }
42 
43 }
原文地址:https://www.cnblogs.com/Pioneer-HengYu/p/6637802.html