I/O流

0. 字节流与二进制文件

我的代码

package experiment0;

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

public class Main {
    public static void main(String[] args)
    {
        String fileName="d:\\student.data";//文件地址
        try(DataOutputStream dos=new DataOutputStream(new FileOutputStream(fileName)))//写入二进制文件
        {
            Student student1=new Student(1,"xixi",19,89);
            dos.writeInt(student1.getId());
            dos.writeUTF(student1.getName());
            dos.writeInt(student1.getAge());
            dos.writeDouble(student1.getGrade());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("ojk");
        try(DataInputStream dis=new DataInputStream(new FileInputStream(fileName)))//读取文件并输出
        {
            int id=dis.readInt(),age=dis.readInt();
            String name=dis.readUTF();
            double grade=dis.readDouble();
            Student student2=new Student(id,name,age,grade);//存入对象
            System.out.println(student2.toString());//输出
        } catch (FileNotFoundException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
           
            e.printStackTrace();
        }
    }
}

二进制与文本,前者是数据的原形式后者是数据的终端形式。
在使用try...catch...finally时要避免在finally中使用return 语句或者抛出异常.

1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读)

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

package expriment1_1;

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<>();//以Student对象 的list
		        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)
		        {
		          
		            e.printStackTrace();
		        } 
		        catch (IOException e) 
		        {
		            
		            e.printStackTrace();
		        }
		        System.out.println(studentList);

	}

}

1.2编写public static ListreadStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中

public static List<Student> readStudents(String fileName)
    {
        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();
        }
        return studentList;
    }

1.3使用PrintWriter将Student对象写入文本文件,基础代码见后。注意:缓冲区问题。

package experime1_3;

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

public class main {

	public static void main(String[] args) {
		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();
		            pw.print("4 小羊 12 88");
		        } catch (FileNotFoundException e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        } catch (IOException e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        }

	}

}

1.4使用ObjectInputStream/ObjectOutputStream读写学生对象

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

import experiment0.Student;

public class main {

	public static void main(String[] args) {
		String fileName1="d:\\Students.dat";
		try(
		            FileOutputStream fos=new FileOutputStream(fileName1);
		            ObjectOutputStream oos=new ObjectOutputStream(fos))
		        {
		            Student ts=new Student(5,"asd",14,60);
		            oos.writeObject(ts);
		        }
		        catch (Exception e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        }
		        try(
		            FileInputStream fis=new FileInputStream(fileName1);
		            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();
		        }

	}

}

使用程序生成的文件是支持UTF-8
方法writeObject处理对象的序列化

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

对文件进行1000万次写入

String FILENAME = "D:\\test.txt";    
        double sum=0,aver;
        PrintWriter pw=null;
        try {
            pw = new PrintWriter(FILENAME);
            for(int i = 0;i<1000_0000;i++){//写入1千万行
            int x=new Random().nextInt(10);
            sum+=x;
            pw.println(x);
            //System.out.println(x);
        }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally{
            pw.close();
        }
        aver=sum/10000000;
        System.out.format("%.6f", aver);

JUnit

public class test {
    @Test
        public void test() {
        String FILENAME = "test.txt";
        long begin = System.currentTimeMillis();
        Scanner scanner=null;
        try {
            scanner = new Scanner(new File(FILENAME));
            while(scanner.hasNextLine()){//只是读出每一行,不做任何处理
                scanner.nextLine();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally{
            scanner.close();
        }       
        System.out.println("1 ok");
    }
    @Test
    public void Bufftest() {
        String FILENAME = "test.txt";
        long begin = System.currentTimeMillis();
        BufferedReader br = null;
        try {
             br = new BufferedReader(new FileReader(new File(FILENAME)));
            while(br.readLine()!=null){};//只是读出,不进行任何处理
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }       
        System.out.println("2 ok");
    }
}

在进行JUnit测试是要注意测试方法必须使用public void进行修饰,不能带任何的参数
并且要新建一个源代码目录来存放我们的测试代码

3. 字节流之对象流

public static void writeStudent(List<Student> stuList)
    {
        String fileName="d:\\Students.dat";
        try (   FileOutputStream fos=new FileOutputStream(fileName);
                ObjectOutputStream ois=new ObjectOutputStream(fos))
        {
            ois.writeObject(stuList);
            
        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            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) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return stuList;
    }   

当使用对象流写入或者读取对象的时候,必须保证该对象是序列化的,这样是为了保证对象能够正确的写入文件,并能够把对象正确的读回程序。

5. 文件操作

public static void findFile(Path dir,String fileName) {
		File file = dir.toFile();
		File[] files=file.listFiles();
		for(File f:files)
        {
            if(f.isFile())
            {
                if(f.getName().equals(fileName))
                {
                    System.out.println(f.getAbsolutePath());
                    return;
                }
            }
            else if(f.isDirectory())
            {
                findFile(f.toPath(),fileName);
            }
        }
	}

在查阅资料File类和Path类之间是可以互相转换

6. 正则表达式

6.1如何判断一个给定的字符串是否是10进制数字格式?尝试编程进行验证。

public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Pattern pattern=Pattern.compile("^[+-]?[0-9]+(\\.\\d+)?");
        Matcher matcher=null;
        while(sc.hasNext())
        {
            String str=sc.next();
            matcher=pattern.matcher(str);
            System.out.println(matcher.matches());
        }
        sc.close();
    }
}

6.2修改HrefMatch.java

package experiment6_2;

import java.io.*;
import java.net.*;
import java.util.regex.*;

/**
 * This program displays all URLs in a web page by matching a regular expression that describes the
 * <a href=...> HTML tag. Start the program as <br>
 * java HrefMatch URL
 * @version 1.01 2004-06-04
 * @author Cay Horstmann
 */
public class HrefMatch
{
   public static void main(String[] args)
   {
	   try
	      {
	         // get URL string from command line or use default
	        /* String urlString;
	         if (args.length > 0) urlString = args[0];
	         else urlString = "http://cec.jmu.edu.cn";*/
	         String fileName="F:\\计算机语言的学习文件\\JAVA 学习资料\\下载文件\\Exp-StreamAndFile\\Exp-StreamAndFile\\参考代码\\HrefMatch\\集美大学-计算机工程学院.htm";
	         // open reader for URL
	        //InputStreamReader in = new InputStreamReader(new URL(urlString).openStream());
	        InputStreamReader in = new InputStreamReader(new FileInputStream(fileName));
	    //InputStreamReader in = new InputStreamReader(new FileInputStream("集美大学-计算机工程学院.htm"));
	         // read contents into string builder
	         StringBuilder input = new StringBuilder();
	         int ch;
	         while ((ch = in.read()) != -1)
	            input.append((char) ch);

	         // search for all occurrences of pattern
	         String patternString = "<a\\s+href\\s*=\\s*(\"[^\"]*\"|[^\\s>]*)\\s*>";
	     String patternImgString = "[+-]?[0-9]+";
	     //String patternString = "[\u4e00-\u9fa5]";     //匹配文档中的所有中文
	         Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
	         Matcher matcher = pattern.matcher(input);

	         while (matcher.find())
	         {
	            int start = matcher.start();
	            int end = matcher.end();
	            String match = input.substring(start, end);
	            System.out.println(match);
	         }
	      }
	      catch (IOException e)
	      {
	         e.printStackTrace();
	      }
	      catch (PatternSyntaxException e)
	      {
	         e.printStackTrace();
	      }
   }
}

总的来说这些都是课上有完成的内容,但是量比较多,回来后也有些遗忘,在写这些的时候花费了很多时间才完成!

posted on 2020-01-15 15:58  jellysheep  阅读(151)  评论(0编辑  收藏  举报

导航