首页 技术 正文
技术 2022年11月10日
0 收藏 872 点赞 2,941 浏览 9338 个字

0. 字节流与二进制文件

  1. 使用DataOutputStream与FileOutputStream将Student对象写入二进制文件student.data

    • 二进制文件与文本文件的区别
    • try…catch…finally注意事项
    • 使用try..with…resouces关闭资源
  2. 使用DataInputStream与FileInputStream从student.data中读取学生信息并组装成对象

我的代码

 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";
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");
}
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");
} }

我的总结

在读取文件数据时while循环会报错,加入测试点后发现while循环多读了一次,

Java第09次实验(IO流)-实验报告

后将while(dis!=null)改成while(dis.available()!=0),问题解决

Java第09次实验(IO流)-实验报告

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

任务:

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

    • 中文乱码问题(FileReader使用系统默认编码方式读取文件,会产生乱码,可使用InputStreamReader解决)
    • String的split方法使用\\s+可以使用多个空格作为分隔符。
    • 进阶:修改Students.txt文件,在正确的数据行中间增加一些错误行(如,每行只有3个数据,或者应该是数字的地方放入其他字符),修改自己的程序,让起可以处理出错的行(报错但可以继续运行)。
  2. 编写public static ListreadStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中
  3. 使用PrintWriter将Student对象写入文本文件,基础代码见后。注意:缓冲区问题。
  4. 使用ObjectInputStream/ObjectOutputStream读写学生对象。

我的代码

1.

  public class Main {
public static void main(String[] args) throws IOException
{
String FileName="D:\\TSBrowserDownloads\\Students.txt";
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(FileName),"UTF-8"));
String line = null;
while((line=br.readLine())!=null)
System.out.println(line);
} finally{
if (br!=null){
br.close();
}
}
} }

我的总结

默认方法打开读取会产生乱码

Java第09次实验(IO流)-实验报告

将模式读取方式改成”UTF-8″后显示正常

Java第09次实验(IO流)-实验报告

2.

 public static void ListreadStudents(String fileName){
ArrayList<Student> StudentList=new ArrayList<Student>();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));
while(br!=null) {
String line=br.readLine();
String[] stu=line.split("\\s+");
int id=Integer.parseInt(stu[0]);
String name=stu[1];
int age=Integer.parseInt(stu[2]);
double grade=Double.parseDouble(stu[3]);
Student Stu=new Student(id,name,age,grade);
StudentList.add(Stu);
}
} finally{
if (br!=null){
br.close();
}
}
}

实验调试

刚开始本来想用和DataInputStream一样直接读,发现BufferedReader只用read和ReadLine方法,得用实验提到的”\\s+”的方法将读到的一整行用分隔符来分开,再用类型转换来读。

3.

             String FileName="D:\\TSBrowserDownloads\\Students.txt";
PrintWriter pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream(FileName,true),"UTF-8"));
pw.print("4 陈六 21 93");
pw.close();

我的总结

正确写入文件

Java第09次实验(IO流)-实验报告

4.

         String FileName="D:\\TSBrowserDownloads\\student.dat";
try(
FileOutputStream fos=new FileOutputStream(FileName);
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(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进行测试)

使用PrintWriter往文件里写入1千万行随机整数,范围在[0,10]。随机数种子设置为100.
然后从文件将每行读取出来转换成整数后相加。然后依次输出“个数 和 平均值(保留5位小数)”。
对比使用BufferedReader与使用Scanner从该文件中读取数据(只读取,不输出),使用哪种方法快?

    • 使用junit对比BufferedReaderScanner读文件的效率
    • 格式化输出:System.out.format。
    • 要使用Scanner的hasNextXXX方法来判断是否到文件尾,否则会抛异常。
    • Scanner的asNextXXX方法应与相对应的nextXXX方法配合使用,否则容易出。
    • 请删除fail("Not yet implemented");;并且在需要测试的方法上使用@Test进行标注。

写入文件代码

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

使用JUint的代码

         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();
}
long end = System.currentTimeMillis();
System.out.println("last "+(end-begin));
System.out.println("read using Scanner done");
}
@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();
}
}
long end = System.currentTimeMillis();
System.out.println("last "+(end-begin));
System.out.println("read using BufferedReader done");
}
}

我的总结

可以明显对比出缓冲流BufferedReader的方法要比Scanner的方法快很多

Java第09次实验(IO流)-实验报告

不使用JUint也可以在循环开始前后定义时间变量,最后相减也能得到运行所用时间

第2次实验

3. 字节流之对象流

结合使用ObjectOutputStream、ObjectInputStream与FileInputStream、FileOuputStream实现对Student对象的读写。
编写如下两个方法:

    • public static void writeStudent(List stuList)
    • public static List readStudents(String fileName)

我的代码

 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. 文件操作

编写一个程序,可以根据指定目录和文件名,搜索该目录及子目录下的所有文件,如果没有找到指定文件名,则显示无匹配,否则将所有找到的文件名与文件夹名显示出来。

    1. 编写public static void findFile(Path dir,String fileName)方法.
      以dir指定的路径为根目录,在其目录与子目录下查找所有和filename
      相同的文件名,一旦找到就马上输出到控制台。

我的代码

 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,则输出该文件的路径

6. 正则表达式

  1. 如何判断一个给定的字符串是否是10进制数字格式?尝试编程进行验证。
  2. 修改HrefMatch.java
    • 尝试匹配网页中的数字字符串
    • 尝试匹配网页中的图片字符串

1.

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

2.

 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"; // open reader for URL
InputStreamReader in = new InputStreamReader(new URL(urlString).openStream());
//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();
}

Java第09次实验(IO流)-实验报告

总结:这次实验内容较多,花费了大量的时间,总的来说IO流是java中很重要的一部分,涉及面很广,还会和今后的网络编程牵扯关系,应该好好学。正值表达式的内容较难理解

上一篇: Curl elasticsearch
下一篇: IDEA连接Redis
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,083
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,558
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,407
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,180
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,816
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,899