黑马程序员-随机访问和编码

来源:互联网 发布:tv版看电影软件 编辑:程序博客网 时间:2024/05/20 16:40

------------------- android开发java培训、期待与您交流! ----------------------

随机访问和编码

课堂笔记太重要了,一天的学习内容!

1-------------------------------------------------------------------------------------------

/*

RandomAccessFile

该类不是Io体系的子类,而是直接继承object

但是他是io包中的成员,因为它具备读和写的功能

内部封装一个数组,而且通过指针对数组的元素进行操作

可以通过getFilePointer获取指针位置

同时可以通过seek改变指针位置

 

其实完成读和写的原理就是在内部封装了字节输入流和字节输出流

通过构造函数可以看出,该类只能操作文件

而且操作文件还有模式:只读r,读写rw

如果模式为只读r,不会创建文件,会去读取一个已经存在的文件,如果该文件不存在,则会出现异常

如果模式为rw,而且该对象的构造函数要操作的文件不存在,会自动创建,如果存在不会覆盖

*/

 

import java.io.*;

class  RandomAccessFileDemo

{

       public static void main(String[] args) throws IOException

       {

               //writeFile();

               //readFile();

               writeFile_2();

       }

       public static void readFile()throws IOException

       {

              //创建对象,随机访问文件,可以使用功能是读

              RandomAccessFile raf=new RandomAccessFile("d:\\ran.txt","r");

              //raf.seek(8*1);//调整对象中的指针

              //raf.skipBytes(8);//跳过指定字节数,只能向前跳

              byte[] buf=new byte[4];//创建字节数组长度为4

              raf.read(buf);//用字节数组格式读取文件

              String name=new String(buf);

              int age=raf.readInt();

              System.out.println("name="+name);//获取名字

              System.out.println("age="+age);//获取年龄

              raf.close();//关闭资源

 

       }

       public static void writeFile_2()throws IOException

       {

              RandomAccessFile raf=new RandomAccessFile("d:\\ran.txt","rw");

              raf.seek(8*3);//指定位置

              raf.write("周期".getBytes());//存放周期

              raf.writeInt(103);//周期数

              raf.close();

       }

       public static void writeFile()throws IOException

       {

              //创建对象随机访问文件,可以使用功能是读和写

              RandomAccessFile raf=new RandomAccessFile("d:\\ran.txt","rw");

              raf.write("李四".getBytes());//写入名字,以字节形式存入

              raf.writeInt(97);//写入年龄,以四个字节长形式存入

              raf.write("王五".getBytes());

              raf.writeInt(98);

              raf.close();

       }

}

 

import java.io.*;

class  RandomAccessFileDemo

{

       public static void main(String[] args) throws IOException

       {

               //writeFile();

               //readFile();

               writeFile_2();

       }

       public static void readFile()throws IOException

       {

              //创建对象,随机访问文件,可以使用功能是读

              RandomAccessFile raf=new RandomAccessFile("d:\\ran.txt","r");

              //raf.seek(8*1);//调整对象中的指针

              //raf.skipBytes(8);//跳过指定字节数,只能向前跳

              byte[] buf=new byte[4];//创建字节数组长度为4

              raf.read(buf);//用字节数组格式读取文件

              String name=new String(buf);

              int age=raf.readInt();

              System.out.println("name="+name);//获取名字

              System.out.println("age="+age);//获取年龄

              raf.close();//关闭资源

 

       }

       public static void writeFile_2()throws IOException

       {

              RandomAccessFile raf=new RandomAccessFile("d:\\ran.txt","rw");

              raf.seek(8*3);//指定位置

              raf.write("周期".getBytes());//存放周期

              raf.writeInt(103);//周期数

              raf.close();

       }

       public static void writeFile()throws IOException

       {

              //创建对象随机访问文件,可以使用功能是读和写

              RandomAccessFile raf=new RandomAccessFile("d:\\ran.txt","rw");

              raf.write("李四".getBytes());//写入名字,以字节形式存入

              raf.writeInt(97);//写入年龄,以四个字节长形式存入

              raf.write("王五".getBytes());

              raf.writeInt(98);

              raf.close();

       }

}

/*

DataInputStreamDataOutputStream

可以用以操作基本数据类型的数据流对象

2-----------------------------------------------------------------------------------------------

*/

import java.io.*;

 

class  DataStreamDemo

{

       public static void main(String[] args) throws IOException

       {

              writeData();

              readData();

              writeUTFDemo();

              readUTFDemo();

       }

       public static void readUTFDemo()throws IOException

       {

              //读取UTF编码过的文件

              DataInputStream dis=new DataInputStream(new FileInputStream("d:\\UTFdata.txt"));

              String s=dis.readUTF();

              System.out.println(s);

              dis.close();

       }

       public static void writeUTFDemo()throws IOException

       {

              //采用UTF编码存入信息

              DataOutputStream dos=new DataOutputStream(new FileOutputStream("d:\\UTFdata.txt"));

              dos.writeUTF("你好");

              dos.close();

       }

 

 

       public static void readData() throws IOException

       {

              DataInputStream dis=new DataInputStream(new FileInputStream("d:\\data.txt"));

              int num=dis.readInt();//读取整型数据

              boolean b=dis.readBoolean();//读取Boolean型数据

              double d=dis.readDouble();//读取Double类型数据

              System.out.println("num="+num);

              System.out.println("b="+b);

              System.out.println("d="+d);

              dis.close();

       }

       public static void writeData()throws IOException

       {

              DataOutputStream dos=new DataOutputStream(new FileOutputStream("d:\\data.txt"));

              //创建数据输出流对象,作用于文件输出流对象,指定信息存放的文件

              dos.writeInt(234);//写入整型数据

              dos.writeBoolean(true);//存放Boolean型数据

              dos.writeDouble(2457.45);//存放Double类型数据

              dos.close();//关闭资源

       }

}

3--------------------------------------------------------------------------------------------

/*

用于操作字节数组的流对象

ByteArrayInputStream:包含一个内部缓冲区,该缓冲区包含从流中读取的字节

                                  在构造的时候,需要接收数据,而且数据是一个字节数组

ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装一个

                                         可变长度的字节数组,他就是目的地此类实现了一个输出流,其中

                                         的数据被写入一个 byte数组。缓冲区会随着数据的不断写入而自动增长。

                                         可使用 toByteArray() toString()获取数据。

因为这两个流对象都是操作的数组,并没有使用系统资源,所以不用close进行关闭

 

源设备:键盘system.in,硬盘FileStream,内存ArrayStream

目的设备:键盘system.out,硬盘FileStream,内存ArrayStream

 

*/

 

import java.io.*;

class  ByteArrayStream

{

       public static void main(String[] args)

       {

              //数据源

              ByteArrayInputStream bis=new ByteArrayInputStream("afdsafa".getBytes());

              //数据目的

              ByteArrayOutputStream bos=new ByteArrayOutputStream();

              int by=0;

              while((by=bis.read())!=-1)

              {

                     bos.write(by);

              }

              System.out.println(bos.size());

              System.out.println( bos.toString());

       }

}

4------------------------------------------------------------------------------------------------

/*

编码:将字符串变成字节数组

解码:将字节数组变成字符串

String-->byte[];str.getBytes(charsetName);

byte[]-->String;new String(byte[],charsetName)

*/

import java.util.*;

class  EncodeDemo

{

       public static void main(String[] args) throws Exception

       {

              //将字符串先用A编码进行编码,用B编码进行解码,将错误的解码再用B编码编码,将编码后的字节数用A解码。

              String s="你好";//要编码的字符串

              byte[] b1=s.getBytes("GBK");//采用GBK编码对字符串进行编码,将字符串编译成字节数

              System.out.println(Arrays.toString(b1));//输出编码后的字节数组

              String s1=new String(b1,"ISO8859-1");//采用iso8859-1对字节数进行解码,将字节数变成字符串。(解码将出错)

              System.out.println("s1="+s1);//输出字符串

              //s1进行iso8859-1编码

              byte[] b2=s1.getBytes("iso8859-1");//将错误的解码再用iso8859-1对字符串进行编码,获取其字节数

              System.out.println(Arrays.toString(b2));//输出字节数

              String s2=new String(b2,"gbk");//将字节数重新用GBK进行解码,将字节数转变成字符串

              System.out.println("s2="+s2);//输出字符串

       }

}

 

/*

编码与解码

import java.util.*;

class  EncodeDemo

{

       public static void main(String[] args) throws Exception

       {

              String s="你好";//要编码的字符串

              byte[] b1=s.getBytes("utf-8");//采用utf-8(也可以用GBK编码)对字符串进行编码,将字符串编译成字节数

              System.out.println(Arrays.toString(b1));//输出编码后的字节数组

              String s1=new String(b1,"utf-8");//采用utf-8(如果用GBK编码的话,必须用GBK解码)对字节数进行解码,将字节数变成字符串

              System.out.println("s1="+s1);//输出字符串

       }

}

*/

5---------------------------------------------------------------------------------------------

/*

(从大到小顺序排名)

有五个学生,每个学生有3门课成绩

从键盘上输入以上数据(包括姓名,三门课程)

输入格式,如:zhangsan304060,计算出总成绩

并把学生的信息和计算出的总分数安高低顺序存放在磁盘文件“stud.txt”中

方法:

1,描述学生对象

2,定义一个可以操作学生对象的工具类

思想:

1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象

2,因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分进行排序,所以用TreeSet

3,将集合的信息写入到一个文件中

*/

import java.io.*;

import java.util.*;

class Student implements Comparable<Student>//定义学生类

{

       private String name;

       private int ma,cn,en;

       private int sum;

       Student(String name,int ma,int cn,int en)//描述学生对象

       {

              this.name=name;//学生姓名

              this.ma=ma;//学生数学成绩

              this.cn=cn;//学生语文成绩

              this.en=en;//学生英语成绩

              sum=ma+cn+en;//学生总成绩

       }

       public int compareTo(Student s)//覆盖父类中的compare方法

       {

              int num=new Integer(this.sum).compareTo(new Integer(s.sum));//比较学生总成绩大小

              if(num==0)//若总成绩相等

                     return this.name.compareTo(s.name);//返回按姓名的自然顺序排列

              return num;//返回正确顺序

       }

       public String getName()//获取姓名

       {

              return name;

       }

       public int getSum()//获取总成绩

       {

              return sum;

       }

       public int hashCode()//覆盖hashCode方法

       {

              return name.hashCode()+sum*78;

       }

       public boolean equals(Object obj)//覆盖equals方法

       {

              if(!(obj instanceof Student))//判断是否是学生类

                     throw new ClassCastException("类型不匹配");//如果不是学生类抛出异常

              Student s=(Student)obj;//将获得的类强转为学生类

              return this.name.equals(s.name)&&this.sum==s.sum;//判断是否重复输入

       }

       public String toString()//覆盖方法

       {

              return "Student["+name+","+ma+","+cn+","+en+"]";

       }

}

class StudentInfoTool//定义学生信息工具类

{

       //由于一次要录入很多学生的信息,所以返回一个Set集合,用于存储学生

       public static Set<Student> getStudents() throws IOException

       {

              return getStudents(null);//由于方法一样,可以直接调用下边的方法

       }

       public static Set<Student> getStudents(Comparator<Student> cmp) throws IOException//重载形式

       {

              BufferedReader bufr=

                     new BufferedReader(new InputStreamReader(System.in));//创建缓冲区,接收键盘录入信息

              String line=null;

              Set<Student> stus=null;

              if(cmp==null)

                     stus=new TreeSet<Student>();//创建集合,用于按大小顺序存放学生对象

              else

                     stus=new TreeSet<Student>(cmp);

              while((line=bufr.readLine())!=null)

              {

                     if("over".equals(line))//判断录入结束标记

                            break;

                     String[] info=line.split(",");//用逗号切割信息

                     Student stu=new Student(info[0],Integer.parseInt(info[1]),

                                                              Integer.parseInt(info[2]),

                                                              Integer.parseInt(info[3]));

                     stus.add(stu);

              }

              bufr.close();//关闭缓冲区

              return stus;//返回学生集合

       }

       public static void writeToFile(Set<Student> stus)throws IOException

       {

              BufferedWriter bufw=new BufferedWriter(new FileWriter("StudentInfo.txt"));//创建缓冲区,用于存放学生信息的文件

              for(Student stu:stus)

              {

                     bufw.write(stu.toString()+"\t");//写入学生信息

                     bufw.write(stu.getSum()+"");//计算学生总成绩,并写入

                     bufw.newLine();//换行

                     bufw.flush();//刷新缓冲区

              }

              bufw.close();//关闭缓冲区

       }

}

 

class StudentInfoTest1

{

       public static void main(String[] args) throws IOException

       {

              Comparator<Student> cmp=Collections.reverseOrder();

              Set<Student> stus=StudentInfoTool.getStudents(cmp);//从大到小

              //Set<Student> stus=StudentInfoTool.getStudents();//从小到大

              StudentInfoTool.writeToFile(stus);

       }

}

加油!!

------------------- android开发java培训、期待与您交流! ----------------------

 

0 0
原创粉丝点击