Java——流、文件与正则表达式

0. 字节流与二进制文件

我的代码

package javalearn;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

class Student {
	private int id;
	private String name;
	private int age;
	private double grade;

	public Student() {

	}

	public Student(int id, String name, int age, double grade) {
		this.id = id;
		this.setName(name);
		this.setAge(age);
		this.setGrade(grade);
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		if (name.length() > 10) {
			throw new IllegalArgumentException("name's length should <=10 " + name.length());
		}
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		if (age <= 0) {
			throw new IllegalArgumentException("age should >0 " + age);
		}
		this.age = age;
	}

	public double getGrade() {
		return grade;
	}

	public void setGrade(double grade) {
		if (grade < 0 || grade > 100) {
			throw new IllegalArgumentException("grade should be in [0,100] " + grade);
		}
		this.grade = grade;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", grade=" + grade + "]";
	}

}

public class Main {
	public static void main(String[] args) {

		String fileName = "d:\\student.data";

		/* 将Student对象写入二进制文件student.data */
		try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileName))) {
			Student[] stu = new Student[3];
			stu[0] = new Student(1, "zhangsan", 19, 65.0);
			stu[1] = new Student(2, "lisi", 19, 75.0);
			stu[2] = new Student(3, "wangwu", 20, 85.0);
			for (Student stu1 : stu) {
				dos.writeInt(stu1.getId());
				dos.writeUTF(stu1.getName());
				dos.writeInt(stu1.getAge());
				dos.writeDouble(stu1.getGrade());
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("1");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("2");
		}

		/* 从student.data中读取学生信息并组装成对象 */
		try (DataInputStream dis = new DataInputStream(new FileInputStream(fileName))) {
			while (dis != null) {
				int id = dis.readInt();
				String name = dis.readUTF();
				int age = dis.readInt();
				double grade = dis.readDouble();
				Student stu = new Student(id, name, age, grade);
				System.out.println(stu);
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("3");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("4");
		}

	}
}

我的总结

- 1.二进制文件与文本文件的区别:二进制文件可以储存基本数据类型的变量;文本文件只能储存基本数据类型中的char类型变量。
- 2.如何优雅的关掉文件:
可以直接在try后面加一个括号,在括号中定义最后要关闭的资源。这样,不需要在catch后面加上finally,程序运行结束之后资源会自动关闭。

1. 字符流与文本文件

我的代码

  • 使用BufferedReader从编码为UTF-8的文本文件中读出学生信息,并组装成对象然后输出。
package test;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String fileName="d:/Students.txt";
        List<Student> studentList = new ArrayList<>();
                try(
                    FileInputStream fis=new FileInputStream(fileName);
                    InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
                    BufferedReader br=new BufferedReader(isr))
                {
                    String line=null;
                    while((line=br.readLine())!=null)
                    {
                        String[] msg=line.split("\\s+");
                        int id=Integer.parseInt(msg[0]);
                        String name=msg[1];
                        int age=Integer.parseInt(msg[2]);
                        double grade=Double.parseDouble(msg[3]);
                        Student stu=new Student(id,name,age,grade);
                        studentList.add(stu);
                    }
                } 
                catch (FileNotFoundException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
                catch (IOException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(studentList);

    }
}
  • 编写public static ListreadStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中
public static List<Student> readStudents(String fileName)
    {
        List<Student> stuList = new ArrayList<>();
        try(
            FileInputStream fis=new FileInputStream(fileName);
            InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
            BufferedReader br=new BufferedReader(isr))
        {
            String line=null;
            while((line=br.readLine())!=null)
            {
                String[] msg=line.split("\\s+");
                int id=Integer.parseInt(msg[0]);
                String name=msg[1];
                int age=Integer.parseInt(msg[2]);
                double grade=Double.parseDouble(msg[3]);
                Student stu=new Student(id,name,age,grade);
                stuList.add(stu);
            }
        } 
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return stuList;
    }
  • 使用PrintWriter将Student对象写入文本文件
package test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class WriteFile {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String fileName = "d:/Students.txt";
        try (FileOutputStream fos = new FileOutputStream(fileName, true);
                OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
                PrintWriter pw = new PrintWriter(osw)) {
            pw.println("1 zhang 18 85");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
  • 使用ObjectInputStream/ObjectOutputStream读写学生对象。
package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class WriteFile {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String fileName="d:/Students.dat";
        try(
                    FileOutputStream fos=new FileOutputStream(fileName);
                    ObjectOutputStream oos=new ObjectOutputStream(fos))
                {
                    Student ts=new Student(1,"lily",64,90);
                    oos.writeObject(ts);
                }
                catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try(
                    FileInputStream fis=new FileInputStream(fileName);
                    ObjectInputStream ois=new ObjectInputStream(fis))
                {
                    Student newStudent =(Student)ois.readObject();
                    System.out.println(newStudent);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }

}

2. 缓冲流(结合使用JUint进行测试)

我的代码

main函数:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.swing.text.AbstractDocument.BranchElement;

public class WriteFile {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String fileName = "e:/bigdata.txt";
		int n = 1000_0000;
		Random r = new Random(100);  //把种子放在外面
		try (PrintWriter pWriter = new PrintWriter(fileName)){  //省去finally
			for (int i = 0; i < n; i++) {
				pWriter.println(r.nextInt(11));  //产生0~10的随机数
			}
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		/*try (BufferedReader br = new BufferedReader(new FileReader(new File(fileName)))){ 
			String string = null;
			int count=0;
			long sum=0;
			double average = 0.0;
			while ((string=br.readLine())!=null) {
				int num = Integer.parseInt(string);
				sum+=num;
				count++;
			}
			average=1.0*sum/count;
			System.out.format("count = %d,sum = %d,averge = %.5f",count,sum,average);
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}*/
	}

}

Junit:
package test;

import static org.junit.jupiter.api.Assertions.*;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

import org.junit.jupiter.api.Test;

class testRead {
	String fileName = "e:/bigdata.txt";
	@Test
	void testB() {
		try (BufferedReader br = new BufferedReader(new FileReader(new File(fileName)))){
			String string = null;
			int count=0;
			long sum=0;
			double average = 0.0;
			while ((string=br.readLine())!=null) {
				int num = Integer.parseInt(string);
				sum+=num;
				count++;
			}
			average=1.0*sum/count;
			System.out.format("count = %d,sum = %d,averge = %.5f",count,sum,average);
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	@Test
	void testS() {
		try (Scanner sc = new Scanner(new File(fileName))){
			String string = null;
			int count=0;
			long sum=0;
			double average = 0.0;
			while (sc.hasNextLine()) {
				string = sc.nextLine();
				int num = Integer.parseInt(string);
				sum+=num;
				count++;
			}
			average=1.0*sum/count;
			System.out.format("count = %d,sum = %d,averge = %.5f",count,sum,average);
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
}

我的总结

- 1.在产生随机数[0.10]时。先写成了r.nextInt(10),这样只能生成[0,9]的随机数,应改为r.nextInt(11).
- 2.随机数种子应放在循环之外。
- 3.使用BufferedReader与使用Scanner从该文件中读取数据,明显使用Scanner读取文件慢的非常多。
- 4.注意格式化输出应用:System.out.format

3.字节流之对象流

我的代码

 public static void writeStudent(List<Student> stuList)
      {
          String fileName="D:\\Student.dat";
          try (   FileOutputStream fos=new FileOutputStream(fileName);
                  ObjectOutputStream ois=new ObjectOutputStream(fos))
          {
              ois.writeObject(stuList);
              
         } 
         catch (FileNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IOException e1) {
             // TODO Auto-generated catch block
             e1.printStackTrace();
         }
     }
 public static List<Student> readStudents(String fileName)
     {
         List<Student> stuList=new ArrayList<>();
         try (   FileInputStream fis=new FileInputStream(fileName);
                 ObjectInputStream ois=new ObjectInputStream(fis))
         {
             stuList=(List<Student>)ois.readObject();
         } 
         catch (FileNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IOException e1) {
            // TODO Auto-generated catch block
             e1.printStackTrace();
         } catch (ClassNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return stuList;
     }  

5.文件操作

我的代码

public class Main {
	public static void main(String[] args) {
		if (args.length == 0)
			args = new String[] { ".." };
		try {
			File pathName = new File(args[0]);
			String[] fileNames = pathName.list();

			// enumerate all files in the directory
			for (int i = 0; i < fileNames.length; i++) {
				File f = new File(pathName.getPath(), fileNames[i]);

				// if the file is again a directory, call the main method recursively
				if (f.isDirectory()) {
					if (f.getName().contains(fileName)) {
						System.out.println(f.getCanonicalPath());
						main(new String[] { f.getPath() });
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

我的总结

用了参考代码稍加修改,若文件名字包含fileName,则输出该文件的路径
posted on 2019-11-26 22:24  杨鸿漾  阅读(578)  评论(0编辑  收藏  举报

levels of contents