java - day016 - IO续(输入输出), 手写双向链表
- 课程回顾
- 对象的创建过程
- 类加载
- 加载父类,父类的静态变量分配内存
- 加载子类,子类的静态变量分配内存
- 父类静态变量赋值运算, 和静态初始化块
- 子类静态变量赋值运算, 和子类初始化块
- 创建对象
- 创建父类对象, 父类的实例变量分配内存
- 创建子类对象, 子类的实力变量分配内存
- 父类的实例变量赋值,
- 父类的构造方法
- 子类的实例变量赋值
- 子类的构造方法
- 接口
- 作用: 结构设计工具, 解耦合, 隔离实现
- 本质上是一个抽象类
- interface
- implements
- 接口可以实现多个
- 接口之间也可以多继承
- 内部类
- 非静态内部类, 静态内部列, 局部内部类, 匿名内部类
- 非静态内部类
- 辅助外部对象, 来封装局部数据, 或者局部的运算逻辑
- 非静态内部类的对象, 属于一个外部对象
- 非静态内部类不能独立创建对象
A a = new A();
Inner i = a.new Inner(); 同类内部可以省略 a.
- ObjectInputStream / ObjectOutputStream
- 对象的序列化和反序列化
- 把对象的信息, 按照固定的字节格式, 转成一串字节序列输出
- 方法
- writeObject(object obj);
- 序列化输出对象
- readObject();
- 反序列化恢复对象
- 被序列化的对象必须实现 Serializable 接口
- Serializable
- 空接口
- 标识接口可以序列化
- 不序列化的成员
- static
- 静态属于类, 不能用对象序列化
- transient
- 临时
- 只在程序运行期间,在内存中临时存在
- 序列化版本
- 控制旧版本的数据,不允许恢复新版本的类型
- 自己不定义,编译器会添加默认版本 ID
- 根据类的定义信息来产生版本 ID
- 字符集. 字符编码
- ASC-II, 最初字符集
- 0 到 127
- 英文字符, 标点, 及指令字符
- iso-8895-1 , Latin-1
- 扩展到 255
- cjk 字符集 , 中日韩字符集统称
- 双字节编码 , 到 65535
- 中国国标码 GBK
- 包含 21003 个中文字符
- Unicode 编码
- 统一码, 万国码
- 有 100 万+ 编码位
- 常用字符表 - 双字节
- 生僻字符表 - 三字节或以上标识
- UTF-8
- Unicode 的传输格式
- Unicode Transfermation Format
- 英文 - 单字节
- 某些字符 - 双字节
- 中文 - 三字节
- 特殊符号 - 多字节
- Java 的 char 类型字符, 使用Unicode 编码
- Java的字符编码转换
- Unicode <---> 其他编码
- Unicode --> 其他编码
String s = "abc中文";
// Unicode 转成系统默认编码
byte[] a = s.getBytes();
// 转成指定的编码
byte[] a = s.getBytes("UTF-8");- 其他编码 --> Unicode
// 把系统默认编码的一组字节值, 转成 Unicode
String s = new String(byte[]);
// 把指定编码的一组字节值, 转成 Unicode
String s = new String(byte[], "UTF-8");
- Reader / Writer
- 字符流, 抽象类
- 方法
- write(int c); //
- int 四个字节, 末尾两个字节是 char 类型字符数据
- 只处理末尾两个字节的输出
- write(char[] , from , length);
- 输出 char 数组中 , from 开始的 length 长度的数据
- write(String s);
- 输出字符串的全部字符
package day1604_编码转换; import java.io.UnsupportedEncodingException;
import java.util.Arrays; public class Test1 {
public static void main(String[] args) throws UnsupportedEncodingException { String s = "abc中文"; System.out.println(s); f(s,null);
f(s,"GBK");
f(s,"UTF-8");
} private static void f(String s, String charset) throws UnsupportedEncodingException { // 字符串 s, 转成其他编码的一组字节值
byte[] a;
if (charset == null) { a = s.getBytes();
}else {
a = s.getBytes(charset);
} System.out.println(charset + "\t"+Arrays.toString(a)); // 从默认编码转回 Unicode
// 从指定的编码转回 Unicode String str;
if (charset == null) {
str = new String(a);
}else {
str = new String(a, charset);
} System.out.println(str);
}
}
- 子类 InputStreamReader / outputStreamWriter
- 字符编码转换流
- InputStreamReader
- 读取其他编码转成 Unicode
- outputStreamWriter
- 把Unicode 转成 其他编码输出
package day1605_编码转换流; import java.io.FileOutputStream;
import java.io.OutputStreamWriter; public class Test1 {
public static void main(String[] args) throws Exception { f("/Users/dingzhijie/Desktop/file2.txt","abc中文丁志杰","GBK");
f("/Users/dingzhijie/Desktop/file3.txt","abc中文丁志杰","UTF-8"); } private static void f(
String path,
String s,
String charset) throws Exception { FileOutputStream fos = new FileOutputStream(path);
OutputStreamWriter osw = new OutputStreamWriter(fos,charset); osw.write(s); osw.close(); }
}
- BuffereadReader
- 可以一行一行读取文本数据
- readLine();
- 读取一行数据
- 读取结束,再读取返回 null
package day1606_Buffereader; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader; public class Test1 {
public static void main(String[] args) throws Exception { String path = "/Users/dingzhijie/Desktop/file6.txt";
String charset = "GBK"; FileInputStream fis = new FileInputStream(path);
InputStreamReader ips = new InputStreamReader(fis,charset);
BufferedReader br = new BufferedReader(ips); String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
} br.close(); } }- 手写双向链表
package day1501_手写双向链表; import java.util.Iterator; // 链表类
public class SXLianBiao<T> implements Iterable<T>{ private Node first; // 头部节点, 初始 null
private Node last; // 尾部节点, 初始 null private int size; // 节点数量,初始值 0 public void add(T value) { Node n = new Node();
n.value = value; // 数据封装到 n if (size == ) { // 添加第一个node 对象
n.prev = n; // n向前引用n
n.next = n; // n向后引用n this.first = n; // n 是头部节点
this.last = n; // n 也是尾部节点 }else {
n.prev = this.last;
n.next = this.first;
this.last.next = n;
this.first.prev = n;
this.last = n; } this.size++;
} public T get(int index) { Node n = getNode(index); return n.value;
} private SXLianBiao<T>.Node getNode(int index) {
// i越界
// 取头尾
// 取中间 if (index < || index >= this.size) {
throw new IndexOutOfBoundsException(""+index+"越界");
} if (index == ) {
return this.first;
}else if (index == this.size-) {
return this.last;
} Node n = null; if (index < this.size/) { // 前边一半
// n 引用first
n = this.first;
// 从 j 到 index
for (int j = ; j < index; j++) {
n = n.next;
} return n; }else { // 后面一半
n = this.last;
for (int j = this.size-; j >= index ; j--) {
n = n.prev;
}
} return n;
} public int size() {
return size;
} // 内部类, 封装节点数据
// 节点类,辅助外部双向链表对象
// 来封装局部数据
private class Node{
T value; // 节点中封装的数据
Node prev; // 引用前一个节点对象
Node next; // 引用后一个节点对象
} // Iterable 的抽象实现方法
public Iterator<T> iterator(){
return new Itr();
} // 迭代器类
// 内部类,封装双向链表的局部运算逻辑
private class Itr implements Iterator<T>{ Node n = null; @Override
public boolean hasNext() { if (size == ) {
return false;
} // 回到 first, 标识没有更多数据
return n != first; } @Override
public T next() {
if (n == null) {
n = first;
}
T value = n.value; // 取当前节点的数据
n = n.next;// 让 n 指向下一个节点
return value; // 返回数据
} } }
java - day016 - IO续(输入输出), 手写双向链表的更多相关文章
- java - day015 - 手写双向链表, 异常(续), IO(输入输出)
类的内存分配 加载到方法区 对象在堆内存 局部变量在栈内存 判断真实类型,在方法区加载的类 对象.getClass(); 类名.class; 手写双向链表 package day1501_手写双向链表 ...
- 使用java语言基于SMTP协议手写邮件客户端
使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...
- Java 文件IO续
文件IO续 File类 用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作 File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...
- Java通过IO流输入输出 向文件中存入大量三个属性的值,并通过验证前两个属性输出第三个属性
package ABC1; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import ...
- java设计思想-池化-手写数据库连接池
https://blog.csdn.net/qq_16038125/article/details/80180941 池:同一类对象集合 连接池的作用 1. 资源重用 由于数据库连接得到重用,避免了 ...
- java----构造回文字符串java(动态规划)【手写演算残图】
问题描述 草稿解决过程 (字丑别喷) 代码实现 import java.util.Scanner; /** * Created by Admin on 2017/3/26. */ public cla ...
- 「小程序JAVA实战」 小程序手写属于自己的第一个demo(六)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-06/ 自己尝试的写一个小demo,用到自定义样式,自定义底部导航,页面之间的跳转等小功能.官方文档 ...
- 手写Maven的archetype项目脚手架
一.背景 maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,在创建的项目的时候, ...
- 手写JAVA虚拟机(二)——实现java命令行
查看手写JAVA虚拟机系列可以进我的博客园主页查看. 我们知道,我们编译.java并运行.class文件时,需要一些java命令,如最简单的helloworld程序. 这里的程序最好不要加包名,因为加 ...
随机推荐
- python中异常处理之esle,except,else
异常是指程序中的例外,违例情况.异常机制是指程序出现错误后,程序的处理方法.当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理. python中使用try...except语句捕获异常, ...
- Vue学习笔记十二:vue-resource的基本使用
目录 HTML 浏览器效果 Vue不提倡使用操作DOM,所以Jquery不使用了,ajax也不使用了.所以,Vue给我们提供了一种和ajax差不多功能的指令,vue-resource HTML < ...
- 基于TreeSoft实现异构数据同步
一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路. TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...
- WIN10桌面无创建文件夹选项,无法创建文件
在桌面或其他磁盘,右键没有新建选项,无法新建文件夹或文档. 右键桌面左下角开始按钮,点击:命令提示符(管理员) 弹出,Windows命令处理程序对话框,点击是 粘贴内容: cmd /k r ...
- 代理工具WebScarab安装(转载)
原文地址:https://blog.csdn.net/shiyuqing1207/article/details/46428443 2015年06月09日 16:31:52 shiyuqing1207 ...
- (模板)AC自动机模板
模板1. 给出模式串和文本串,文本串长度小于1e6,模式串长度之和小于1e6,求文本串中有多少模式串出现. 题目链接:https://www.luogu.org/problem/P3808 AC co ...
- RedHat Linux下普通用户无法使用sudo命令的解决方法
Ref:http://blog.sina.com.cn/s/blog_4aa35ca101012qb6.html 装完linux系统,发现普通用户无法使用sudo 命令, 提示:User1(普通用户) ...
- Deepin中安装docker
1.sudo apt install docker-ce: 2.安装好后可以用docker version查看一下是否成功,还可以通过网络详情里是否多了一个docker0来判断: 3.sudo use ...
- Git操作入门
生成ssh key: ssh-keygen -t rsa -C "lkt@temp.com" 按三次回车,最后在.ssh文件夹下得到id_rsa和id_rsa.pub两个文 ...
- fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
在PHP的日常开发中,时常会需要导出 excel ,一般我们会使用 PHPExcel ,性能强大,但是在数据量大的时候,phpexcel 性能差.内存溢出等各种不可控问题就会出现.因此,如果对导出样式 ...