admin管理员组

文章数量:1639678

[1]实验目的:理解文件和流的概念、Java流的层次结构,掌握Java提供的各种字节流类和字符流类的功能和使用方法。 

[2]实验内容

1、编写一个Java应用程序,将已存在的扩展名为.txt的文本文件加密后存入另一个文本文件中。按模板要求,将【代码1】~【代码7】替换为Java程序代码。

import java.io.*;
class SecretExample
{
    public static void main(String a[])
    {
        File fileone=new File("hello.txt");
        File filetwo=new File("hello.secret");
       char b[]=new char[100];
        try{
              FileReader in =【代码1】 //创建指向fileone的字符输入流
              FileWriter out =【代码2】 //创建指向fileontwo的字符输出流
              int n=-1;
              while ( (n=in.read(b)) != -1 )
              {
                  for (int i=0; i<n;i++)
                  {   b[i]=(char)(b[i]^'a');  }
                  【代码3】    //out将数组b的前n单元写到文件
               }
               【代码4】    //out关闭
              in = 【代码5】 //创建指向fileontwo的字符输入流
              System.out.println("加密后的文件内容:");
              n=in.read(b);
              while ( n != -1 )
              {
                   String str=new String(b,0,n);	
                   System.out.println("dfjakfjd"+str);
                   n=in.read(b);
              }
             in=new FileReader(filetwo);
             System.out.println("解密后的文件内容:");
             while ( (n=in.read(b)) != -1 )
             {
                  for (int i=0; i<n;i++)
                  {  b[i]=(char)(b[i]^'a');  }
                     String str=new String(b,0,n);
                     System.out.println(str);
                  }
              【代码6】    // in关闭
             }
             catch(IOException e)
             {
                   System.out.println(e);
             }
     }     
}
package experiment5;

import java.io.*;

class SecretExample {
    File file_one=new File("hello.txt");
    File file_two=new File("hello.secret");
    public void func()
    {
        char[] code =new char[100];
        try {
            FileReader in=new FileReader(file_one);//【代码1】创建指向file_one的字符输入流
            FileWriter out=new FileWriter(file_two);//【代码2】创建指向file_two的字符输出流
            int n;
            if((n=in.read(code))!=-1)
            {
                for(int i=0;i<n;i++)
                {
                    code[i]=(char)(code[i]^1);//异或运算
                }
                out.write(code,0,n);//【代码3】out 将数组 b 的前 n 单元写到文件
            }
            out.close();//【代码 4】out 关闭
            in=new FileReader(file_two);//【代码5】创建指向file_two的字符输入流
            System.out.println("加密后的文件内容:");
            n=in.read(code);
            if(n!=-1)
            {
                String str=new String(code,0,n);
                System.out.println("dfjakfjd "+str);
            }
            in=new FileReader(file_two);
            System.out.println("解密后的文件内容:");
            if((n=in.read(code))!=-1)
            {
                for(int i=0;i<n;i++)
                {
                    code[i]=(char)(code[i]^1);
                }
                String str=new String(code,0,n);
                System.out.println(str);
            }
            in.close();//【代码 6】in 关闭
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }
}

public class Exp5_1 {
    public static void main(String[] args){
        SecretExample secretExample = new SecretExample();
        secretExample.func();
    }
}

 

 hello.txt

 

 hello.secret

 

 

2、编程完成下列功能:

1)首先建立两个文件myfiel.txt和myfile2.txt。

2)从标准设备中输入多名学生信息,如学号,姓名,专业,班级,家庭住址等,待输入"bye"时结束,将输入内容保存在myfile1.txt文件中。

3)再将myfile1.txt文件中内容拷贝到myfile2.txt。 

package experiment5;

import java.io.*;
import java.util.Objects;
import java.util.Scanner;

//声明实现接口Serializable,实现序列化
class Student implements Serializable{
    private final String stu_id;
    private final String name;
    private final String major;
    private final String squad;
    private final String address;
    Student(String stu_id, String name,String major, String squad, String address){
        this.stu_id = stu_id;
        this.name = name;
        this.major = major;
        this.squad = squad;
        this.address = address;
    }
    public Student(Student s){
        this(s.stu_id,s.name, s.major, s.squad,s.squad);
    }
    @Override
    public String toString(){
        return "学号:"+this.stu_id + "\t姓名:"+this.name + "\t专业:" + this.major + "\t班级:" + this.squad + "\t地址:" + this.address;
    }
}
public class Exp5_2 {
    public static void main(String[] args) throws IOException {
        String stu_id, name, major, squad, address;
        FileOutputStream fileOutputStream1 = new FileOutputStream("myfile1.txt");
        ObjectOutputStream objectOutputStream1 = new ObjectOutputStream(fileOutputStream1);




        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学生学号,姓名,专业,班级和地址,输入”bye“结束(至多999人)。");
        while(true){
            stu_id = scanner.next();
            if(Objects.equals(stu_id, "bye")) break;
            name = scanner.next();
            major = scanner.next();
            squad = scanner.next();
            address = scanner.next();
            Student student = new Student(stu_id, name, major, squad, address);
            objectOutputStream1.writeObject(student);
        }
        objectOutputStream1.close();
        fileOutputStream1.close();

        FileInputStream fileInputStream1 = new FileInputStream("myfile1.txt");
        ObjectInputStream objectInputStream1 = new ObjectInputStream(fileInputStream1);

        FileOutputStream fileOutputStream2 = new FileOutputStream("myfile2.txt");
        ObjectOutputStream objectOutputStream2 = new ObjectOutputStream(fileOutputStream2);

        FileInputStream fileInputStream2 = new FileInputStream("myfile2.txt");
        ObjectInputStream objectInputStream2 = new ObjectInputStream(fileInputStream2);
        System.out.println("myfile1.txt中的学生信息:");
        while(true){
            try{
                Student s = (Student) objectInputStream1.readObject();
                System.out.println(s.toString());
                Student ss = new Student(s);
                objectOutputStream2.writeObject(ss);
            }catch (EOFException | ClassNotFoundException e){break;}
        }

         objectInputStream1.close();
         fileInputStream1.close();
         objectOutputStream2.close();
         fileOutputStream2.close();
         System.out.println("myfile2.txt中的学生信息:");
         while (true){
             try{
                 System.out.println(objectInputStream2.readObject());
             }catch (EOFException | ClassNotFoundException e){break;}
         }
         objectInputStream2.close();
         fileInputStream2.close();
    }
}

 myfile1.txt

myfile2.txt

 

[3]实验分析

通过本次实验,熟悉了Java中文件和流的概念,掌握了流的使用方法。

在第一题中只涉及到字符串的操作,所以采用字符输入/输出流更为简单。

在第二题中,涉及到对对象的读和写,所以我采用文件输入/输出字节流,和对象字节流操作文件,每次以对象为单位读写,这样更为方便。将每一个Student对象转换成字节流写入文件。这样,每一个对象都要经过序列化转换为字节流,从字节流中重建的时候也有经过反序列化。

这样带来一个问题,在生成的文件里面,并不显示键盘输入的字符,而是序列化后的对象,所以显示为乱码

本文标签: 程序设计输入输出Java