java之路,IO操作(字符集,序列化)

简介:   字符集的编码 n  ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。
 

字符集的编码

n  ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。如,数字“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。ASCII是现今最通用的单字节编码系统。

n  GB2312GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》。主要用于给每一个中文字符指定相应的数字,也就是进行编码。一个中文字符用两个字节的数字来表示,为了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示。

n  GBK:为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBKK是“扩展”的汉语拼音第一个字母)。在新的编码系统里,除了完全兼容GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。

n  ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集 ,而英文实际上只用了其中数字小于128的部分。

n  Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。如 “a” ASCII码为0x61UNICODE就为0x000x61

n  UTF-8Eight-bit UCS Transformation Format(UCSUniversal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x00800x007f之间,对应的UTF码是两个字节,如果字符在0x08000xffff之间,对应的UTF码是三个字节。
import java.util.*;
import java.nio.charset.*;
class CodeTest
{
 public static void main(String[] args) throws Exception
 {/*
  Map m = Charset.availableCharsets();  //静态方法,返回当前可用的字符集
  Set names = m.keySet();     //返回键值对
  Iterator it = names.iterator();   //没有get方法,用迭代器来实现
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
  
  Properties pps = System.getProperties();  //获取当前默认字符集
  pps.list(System.out);       //list方法将其打印到指定的输出设备,System.out是标准输出
  */
  
  Properties pps = System.getProperties();
  pps.put("file.encoding", "ISO-8859-1"); //修改java虚拟机默认的编码方式
  int data, i = 0;
  byte[] buf = new byte[100];
  while((data = System.in.read()) != 'q') //获取输入
  {
   buf[i] = (byte)data;
   i++;
  }
  String str = new String(buf, 0, i); //构造字符串
  System.out.println(str);
  String strGBK = new String(str.getBytes("GBK"), "GBK");//按照指定的编码方式构造字符串
  System.out.println(strGBK);
 }
}



RandomAccessFile

n  RandomAccessFile类同时实现了DataInputDataOutput接口,提供了对文件随机存取的功能,利用这个类可以在文件的任何位置读取或写入数据。

n  RandomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下一数据的位置。

import java.io.*;
class RandomFileTest
{
 public static void main(String[] args)
 {
  Student s1 = new Student(1, "zhangsan", 88);
  Student s1 = new Student(2, "lisi", 89);
  Student s1 = new Student(3, "wangwu", 80);
  
  RandomAccessFile raf = RandomAccessFile("student.txt", "rw");
  s1.writeStudent(raf);
  s2.writeStudent(raf);
  s3.writeStudent(raf);
  raf.close();
 }
}

class Student
{
 int num;
 String name;
 double score;
 
 public Student(int num, String name, double score)
 {
  this.num = num;
  this.name = name;
  this.score = score;
 }
 
 public void writeStudent(RandomAccessFile raf) throws IOException
 {
  raf.writeInt(num);
  raf.writeUTF(name);
  raf.writeDouble(score); 
 }
 
 public void readStudent(RandomAccessFile raf) throws IOException
 {
  raf.readInt(num);
  raf.readUTF(name);
  raf.readDouble(score);  
 }
}


import java.io.*;
class RandomTest
{
 public static void main(String[] args) throws IOException
 {
  Student s1 = new Student(1, "zhangsan", 88);
  Student s2 = new Student(2, "lisi", 89);
  Student s3 = new Student(3, "wangwu", 80);
  
  RandomAccessFile raf = new RandomAccessFile("student.txt", "rw");
  s1.writeStudent(raf);
  s2.writeStudent(raf);
  s3.writeStudent(raf);
  
  Student s = new Student();
  //getFilePointer获取文件指针
  //seek设置文件指针
  raf.seek(0);
  for(long i=0; i   {
   s.readStudent(raf);
   System.out.println(s.num + ":" + s.name + ":"
   + s.score);
  }
  raf.close();
 }
}

class Student
{
 int num;
 String name;
 double score;
 
 public Student()
 {
  
 }
 public Student(int num, String name, double score)
 {
  this.num = num;
  this.name = name;
  this.score = score;
 }
 
 public void writeStudent(RandomAccessFile raf) throws IOException
 {
  raf.writeInt(num);
  raf.writeUTF(name);
  raf.writeDouble(score); 
 }
 
 public void readStudent(RandomAccessFile raf) throws IOException
 {
  raf.readInt();
  raf.readUTF();
  raf.readDouble();  
 }
}





对象序列化

n  将对象转换为字节流保存起来,并在日后还原这个对象,这种机制叫做对象序列化。

n  将一个对象保存到永久存储设备上称为持续性。

n  一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。

n  当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。

n  如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。

n  如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。

import java.io.*;

class ObjectSerialTest
{
 public static void main(String[] args) throws Exception
 {
  Employee e1 = new Employee("zhangsan", 20, 2000);
  Employee e2 = new Employee("lisi", 21, 2100);
  Employee e3 = new Employee("wangwu", 22, 2200);
  
  FileOutputStream fos = new FileOutputStream("employee.txt");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(e1);  //序列化是调用writeObject
  oos.writeObject(e2);
  oos.writeObject(e3);
  oos.close();
  
  FileInputStream fis = new FileInputStream("employee.txt");
  ObjectInputStream ois = new ObjectInputStream(fis);
  Employee e;
  for(int i=0; i   {
   e = (Employee)ois.readObject();//反序列化
   System.out.println(e.name+":"+e.age+":"+e.salary); 
  }
 }
}

class Employee implements Serializable
{
 String name;
 int age;
 double salary;
 
 public Employee(String name, int age, double salary)
 {
  this.name = name;
  this.age = age;
  this.salary = salary;
 }
 //重写writeObject方法,按照自己的方式来序列化
 private void writeObject(java.io.ObjectOutputStream oos) throws IOException
 {
  oos.writeInt(age);
  oos.writeUTF(name);
  System.out.println("write object");
 }
 //重写readObject方法,虽然是私有的方法,但是可以在外部调用,这是两个特例
 private void readObject(java.io.ObjectOutputStream ois) throws IOException
 {
  age = ois.readInt();
  name = ois.readUTF();
  System.out.println("read object");
 }
}

相关文章
|
6天前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时,出现找不到文件资源的情况,是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
21 0
|
11天前
|
Java Unix Windows
|
6天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(<https://www.sojump.com/m/2792226.aspx/>)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
19 0
|
4天前
|
XML 前端开发 Oracle
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
9 2
|
4天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
13 1
|
5天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
16 2
|
6天前
|
存储 NoSQL 安全
java 中通过 Lettuce 来操作 Redis
java 中通过 Lettuce 来操作 Redis
java 中通过 Lettuce 来操作 Redis
|
7天前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之DataWorks在调用java sdk的createFile功能时报错com.aliyuncs.exceptions.ClientException: 1201111000 如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
10 1
|
7天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
7天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
17 0