------------------- 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();
}
}
/*
DataInputStream与DataOutputStream
可以用以操作基本数据类型的数据流对象
(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门课成绩
从键盘上输入以上数据(包括姓名,三门课程)
输入格式,如:zhangsan,30,40,60,计算出总成绩
并把学生的信息和计算出的总分数安高低顺序存放在磁盘文件“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培训、期待与您交流! ----------------------