当前位置:   article > 正文

常州工学院Java作业04_仔细阅读下面编辑区内给出的代码框架及注释,在 begin-end 间编写程序代码,使用 ha

仔细阅读下面编辑区内给出的代码框架及注释,在 begin-end 间编写程序代码,使用 ha

第1关:练习-Java输入输出之File类之获取文件信息

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,输出给定目录下的最大文件和最小文件名,具体要求如下:

  • 接收给定字符串(如:/test);
  • 输出给定目录下的最大文件和最小文件名以及它们的文件大小(不考虑子目录)。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. /test

预期输出:

  1. 最大的文件是d1.txt,其大小是80字节
  2. 最小的文件是d2.txt,其大小是15字节
    1. import java.io.*;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4.  
    5. public class FileTest {
    6.     public static void main(String[] args) throws IOException {
    7.         // 请在Begin-End间编写完整代码
    8.         /********** Begin **********/
    9.         // 接收给定字符串(目录)
    10.         Scanner input = new Scanner(System.in);
    11.         String str = input.next();
    12.         // 遍历目录,输出最小文件和最大文件名以及它们的大小
    13.         File file = new File(str);
    14.         String Max = null;
    15.         String Min = null;
    16.         long max = 0;
    17.         long min = 100;
    18.         File[] list = file.listFiles();
    19.         for (int i = 0;i < list.length;i ++){
    20.             if (list[i].isFile() & list[i].length() > max & list[i].length() > 0){
    21.                 Max = list[i].getName();
    22.                 max = list[i].length();
    23.             }
    24.             if(list[i].isFile() & list[i].length() < min & list[i].length() > 0){
    25.                 Min = list[i].getName();
    26.                 min = list[i].length();
    27.             }
    28.         }
    29.         System.out.println("最大的文件是" + Max + ","+"其大小是" + max + "字节");
    30.         System.out.println("最小的文件是" + Min + ","+"其大小是" + min + "字节");
    31.             /********** End **********/
    32.     }           
    33. }

练习-Java输入输出之文件字节IO流之合并文件

任务描述

本关任务:把给定的多个文件合并成一个文件。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,把给定的多个文件合并成一个文件。具体要求如下:

  • 接收给定的一行字符串(如:/test,a.txt。其中逗号前为一个目录,该目录下存储着子文件,逗号后为目标文件,用于存储各子文件合并的内容;
  • 把给定目录下的所有子文件的内容合并到目标文件中;
  • 输出目标文件大小,示例:“最后目标文件的大小:X字节”;
  • 给定子文件的命名规则:假如目标文件为 a.txt,则子文件为 a.txt-1、a.txt-2、…、a.txt-n。

注意:请按照子文件后缀数字按照从小到大依次合并到目标文件。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. /test/,a.txt

预期输出(第一行为编程要求中要求输出的提示语句,后面为后台使用 cat 命令查看目标文件产生的结果):

  1. 最后目标文件的大小:31字节
  2. 888hy67
  3. ddsljcnjf746
  4. howtodoit

注意:最后有一个空行。

  1. import java.io.*;
  2. import java.util.Scanner;
  3.  
  4. public class FileTest {
  5.  
  6.     public static void main(String[] args) throws IOException {
  7.         
  8.         Scanner scanner = new Scanner(System.in);     // 获取给定字符串
  9.         String s = scanner.nextLine();
  10.         
  11.         // 请在Begin-End间编写完整代码
  12.         /********** Begin **********/
  13.         
  14.         // 切割给定字符串,得到子文件目录和目标文件名
  15.         String[] strs= s.split(",");
  16.         // 循环读取子文件内容,写入到目标文件
  17.         File f1=new File(strs[0]);
  18.         File dest = new File(strs[0]+strs[1]);
  19.  
  20.         FileOutputStream fos = new FileOutputStream(dest,true);
  21.  
  22.         File[] files = f1.listFiles();
  23.         for(File file:files){
  24.         FileInputStream fis = new FileInputStream(file);
  25.         int len=0;
  26.         byte[] by = new byte[1024];
  27.         while((len=fis.read(by))!=-1)
  28.             fos.write(by,0,len);
  29.         fis.close();
  30.         }
  31.         // 输出目标文件大小
  32.         System.out.println("最后目标文件的大小:"+dest.length()+"字节");
  33.  
  34.         fos.close();
  35.         /********** End **********/
  36.         BufferedReader re = new BufferedReader(new FileReader(strs[0]+strs[1]));
  37.         String sss=null;
  38.         while((sss=re.readLine())!=null)
  39.         System.out.println(sss);
  40.         re.close();
  41.     }
  42. }

 

学习-Java输入输出之对象IO流之序列化一个对象

任务描述

本关任务:序列化给定 Student 对象到给定文件中,再通过反序列化把其转化为一个对象。

相关知识

之前我们学习了 InputStream(字节输入流)和 OutputStream (字节输出流),下面我们来了解一下它们的子类—ObjectInputStream (对象输入流)和 ObjectOutputStream(对象输出流)。

为什么要有对象流

有的时候,我们可能需要将内存中的对象持久化到硬盘上(序列化),或者将硬盘中的对象信息读到内存中(反序列化),这个时候我们需要使用对象流。

序列化和反序列化

序列化: 是对象转换成一个字节序列的过程,是一个写操作。 反序列化:一个字节序列转换成对象的过程 ,是一个读操作。 序列化和反序列化中对象所对应的类,必须是实现 Serializable 接口。

ObjectOutputStream(对象输出流)

ObjectOutputStream 是 OutputStream 的子类,也叫做序列化流。该流把对象转成字节数据输出到文件中保存,可实现对象的持久存储。

ObjectOutputStream 的构造方法

构造方法

说明

ObjectOutputStream(OutputStream out)

使用底层输出流创建 ObjectOutputStream 对象

构造方法示例:

  1.  public static void main(String[] args) throws IOException {
  2.         // 通过文件字节输出流创建对象输出流
  3.         ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));
  4.     }

ObjectOutputStream 的常用方法

下表是它的常用方法:

方法

说明

write(byte[] w,int off,int len)

把字节数组中偏移量从 off 开始的 len 个字节写入此输出流

write(byte [] b)

将字节数组写入此输出流

writeBooolean()、writeByte()、writeShort()、writeInt()

将指定的基本数据类型以字节的方式写入到输出流

flush()

刷新此输出流并强制写出所有缓冲的输出字节

writeUTF(String s)

将字符串格式化顺序写入底层的输出流

writeObject(Object obj)

特有的方法,将指定的对象写入 ObjectOutputStream 流

通过 writeObject 方法将 Hero 对象写入文件示例:

Hero 类:

  1. import java.io.Serializable;
  2.  public class Hero implements Serializable {     // 实现Serializable接口
  3.     private static final long serialVersionUID = 1L;     //表示这个类当前的版本
  4.     public String name;
  5.     public float hp;
  6. }

Test类:

  1. public class Test {
  2. public static void main(String[] args) throws IOException {
  3.         //创建一个Hero对象
  4.         Hero h = new Hero();
  5.         // 设置属性
  6.         h.name = "garen";
  7.         h.hp = 616;
  8.         // 准备一个文件用于保存该对象
  9.         File f =new File("C:\\Users\\yy\\Desktop\\d.txt");
  10.         try(
  11.         // 将Hero对象写入文件
  12.         ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(f));){
  13.             objectOutputStream.writeObject(h);
  14.         }
  15.     }
  16.     }

执行结果:将对象写入了 d.txt 文件。

注意:Hero 类必须实现 Serializable 接口。

ObjectInputStream(对象输入流)

ObjectInputStream 是 InputStream 的子类,也叫做反序列流。该流将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。 ######ObjectInputStream 的构造方法

下表中是它的构造方法:

构造方法

说明

ObjectInputStream(InputStream in)

使用底层输入流创建 ObjectInputStream 对象

构造方法使用示例:

  1. public static void main(String[] args) throws IOException {
  2.         // 通过文件字节输入流创建对象输入流对象
  3.         ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));
  4.     }

ObjectInputStream 的常用方法

下表是它的常用方法:

方法

说明

read(byte[] r, int off, int len)

从流中读入字节数据到缓冲区数组中指定位置,off 为数组偏移量,len 为写入长度。

read(byte [] b)

从流中读入字节数据到缓冲区数组中

readBooolean()、readByte()、readShort()、readInt()

从输入流中读取基本数据类型

readUTF()

按照格式化顺序读底层的输入流

readObject()

特有的方法,把对象读入 ObjectInputStream 流

readObject 方法使用示例:

  1. public static void main(String[] args) throws   IOException, ClassNotFoundException {
  2.         try (
  3.                 // 通过文件字节输入流创建对象输入流对象
  4.                 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));) {
  5.                 // 获取对象
  6.             System.out.print(objectInputStream.readObject());
  7.         }
  8.     }

执行结果:

  1. com.company.Hero@58372a00

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,序列化给定 Student 对象到给定文件中,再通过反序列化把其转化为一个对象,具体要求如下:

  • 接收给定的一行字符串(如:/test/a.txt Bob 23,第一部分为给定文件路径,第二部分为 Student 对象姓名,第三部分为 Student 对象年龄);
  • 给 Student 对象属性赋值,并序列化到文件中;
  • 通过反序列化把文件内容转化为一个对象,并输出所有属性值。

Student 类代码如下:

  1. import java.io.Serializable;
  2. public class Student implements Serializable {
  3.     public String name;
  4.     public int age;
  5. }

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. /test/a.txt Bob 23

预期输出:

  1. Bob
  2. 23
    1. import java.io.*;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4.  
    5. public class FileTest {
    6.  
    7.     public static void main(String[] args) throws IOException, ClassNotFoundException {
    8.         // 接收给定的数据
    9.         Scanner scanner = new Scanner(System.in);
    10.         String filedir = scanner.next();
    11.         String name = scanner.next();
    12.         int age = scanner.nextInt();
    13.  
    14.         // 请在此编写代码
    15.         /********** Begin **********/
    16.         // 创建Student对象
    17.         Student stu = new Student(name,age);
    18.         // 给对象属性赋值
    19.         File file = new File(filedir);
    20.         // 序列化对象到文件中,并通过反序列化读取文件内容,最后打印对象的所有属性
    21.         ObjectOutputStream oos = new ObjectOutputStream(new  FileOutputStream(file));
    22.         
    23.         oos.writeObject(stu);
    24.  
    25.         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
    26.  
    27.         System.out.print(ois.readObject());
    28.         /********** End **********/
    29.  
    30.     }
    31. }

 

  1. import java.io.Serializable;
  2.  
  3. public class Student implements Serializable {
  4.     public String name;
  5.     public int age;
  6.     public Student(String name,int age){
  7.         this.name=name;
  8.         this.age=age;
  9.     }
  10.     public String toString (){
  11.        return this.name+"\n"+this.age;
  12.     }
  13. }

 

练习-Java输入输出之数组IO流之将给定整数转换为字符写入到给定文件中

任务描述

本关任务:将给定的整数转化为字符,并使用 ByteArrayOutputStream 将其写入到给定文件中(字符为 a 的除外)。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,将给定的整数转化为字符,并写入到给定文件中(字符为 a 的除外),具体要求如下:

  • 接收给定的一行字符串(如:/test/a.txt 96 97 98 99 %。字符串中 % 用于终止输入,整数为字节整数,剩下的为文件路径);
  • 将整数转化为字符,并使用 ByteArrayOutputStream 将其写入到给定文件中(字符为 a 的除外)。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. /test/a.txt 97 98 99 %

预期输出:

  1. bc
    1. import java.io.*;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class FileTest {
    5.     public static void main(String[] args) throws IOException {
    6.       try(ByteArrayOutputStream b=new ByteArrayOutputStream();){
    7.         Scanner input =new Scanner(System.in);
    8.         String next=input.next();
    9.         while(!input.hasNext("%")){  //%时停止输入
    10.             int i=input.nextInt();
    11.             if((char)i!='a'){
    12.                 b.write(i);  //将i写入字节数组输出流
    13.             }
    14.         }
    15.         File file=new File(next);  //生成指定文件
    16.         b.writeTo(new FileOutputStream(file)); //将输出流的内容写进file文件里
    17.         }
    18.     }
    19. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/244407
推荐阅读
相关标签
  

闽ICP备14008679号