Novos.be 比利时VPS性能测试

这家是个新商家 可能是oneman 不过老板人挺好的 难得的比利时商家 还可以解锁奈飞 希望能做大做好吧

付款方式有 银行卡 Paypal 支付宝

博主上车了他家前几天限量套餐 这个配置价格太超值了 用来挂PT速度还可以 有个小缺点就是流量统计不太准 会多算一点

https://www.lowendtalk.com/discussion/169167/50-off-2-x-amd-ryzen-3900xt-80gb-nvme-2-tb-sata-5-71-mo-10-max/

  • 2个AMD Ryzen 3900XT vCPU(专用/主机直通)
  • 4096 MB内存
  • 80 GB联网(40 GBps infiniband)NVMe SSD操作系统磁盘空间
  • 2 TB联网SATA存储(作为RAW磁盘添加到您的VPS)。
  • 25 TB每月流量@ 1 GBps易爆端口
  • 1个IPv4和1个/ 64 IPv6(带票的更多内容)
  • 免费1x快照。
  • 免费的50 GB备份空间。
  • 免费的高可用性
  • 免费的Colt IP保护DDoS保护。
  • Proxmox / KVM虚拟化
  • 比利时安特卫普

本来是19欧元/月,特价5.71欧元/月

LemonBench测试结果 https://paste.ubuntu.com/p/QpqNCPdkKy/

LemonBench Linux System Benchmark Utility Version 20201005 Intl BetaVersion 
 
 Bench Start Time:	2021-01-16 23:01:32
 Bench Finish Time:	2021-01-17 00:19:40
 Test Mode:		Full Mode
 
 -> System Information
 
 OS Release:		Debian GNU/Linux "Buster" 10.7 (x86_64)
 CPU Model:		AMD Ryzen 9 3900XT 12-Core Processor  3.79 GHz
 CPU Cache Size:	512 KB
 CPU Number:		2 vCPU
 Virt Type:		KVM
 Memory Usage:		692.64 MB / 3.86 GB
 Swap Usage:		[ No Swapfile / Swap partition ]
 Disk Usage:		1.41 GB / 82.41 GB
 Boot Device:		/dev/sda1
 Load (1/5/15min):	0.00 0.02 0.02 
 CPU Usage:		0.0% used, 0.0% iowait, 0.0% steal
 Kernel Version:	4.19.0-12-cloud-amd64
 Network CC Method:	bbr + fq

 -> Network Information

 IPV4 - IP Address:	[BE] 194.124.41.*
 IPV4 - ASN Info:	42160 (LCPDCO - lcp nv, BE)
 IPV4 - Region:		Belgium Flemish Region Oostkamp

 -> Media Unlock Test

 HBO Now:				No
 Bahamut Anime:				No
 Abema.TV:				No
 Princess Connect Re:Dive Japan:	Yes
 BBC:					No
 Bilibili China Mainland Only:		No
 Bilibili Hongkong/Macau/Taiwan:	No
 Bilibili Taiwan Only:			No

 -> CPU Performance Test (Standard Mode, 3-Pass @ 30sec)

 1 Thread Test:			2104 Scores
 2 Threads Test:		4184 Scores

 -> Memory Performance Test (Standard Mode, 3-Pass @ 30sec)

 1 Thread - Read Test :		56721.42 MB/s
 1 Thread - Write Test:		24975.40 MB/s

 -> Disk Speed Test (4K Block/1M Block, Direct-Write)

 Test Name		Write Speed				Read Speed
 10MB-4K Block		3.3 MB/s (798 IOPS, 3.21 s)		10.9 MB/s (2664 IOPS, 0.96 s)
 10MB-1M Block		151 MB/s (143 IOPS, 0.07 s)		181 MB/s (172 IOPS, 0.06 s)
 100MB-4K Block		3.2 MB/s (783 IOPS, 32.68 s)		10.7 MB/s (2623 IOPS, 9.76 s)
 100MB-1M Block		190 MB/s (181 IOPS, 0.55 s)		202 MB/s (192 IOPS, 0.52 s)
 1GB-4K Block		3.4 MB/s (826 IOPS, 309.81 s)		11.6 MB/s (2835 IOPS, 90.27 s)
 1GB-1M Block		228 MB/s (217 IOPS, 4.59 s)		212 MB/s (202 IOPS, 4.95 s)

 -> Speedtest.net Network Speed Test

 Node Name			Upload Speed	Download Speed	Ping Latency	Server Name
 Speedtest Default		107.54 MB/s	85.44 MB/s	4.11 ms		Telenet BVBA/SPRL (Belgium Mechelen)
 China, Nanjing CU  		28.26 MB/s	42.80 MB/s	170.26 ms	China Unicom (China Nanjing)
 China, Shanghai CU 		13.01 MB/s	71.30 MB/s	171.38 ms	China Unicom 5G (China ShangHai)
 China, Hangzhou CT 		0.11 MB/s	3.00 MB/s	210.17 ms	China Telecom ZheJiang Branch (China Hangzhou)
 China, Nanjing CT  		23.35 MB/s	54.68 MB/s	231.32 ms	China Telecom JiangSu 5G (China Nanjing)
 China, Guangzhou CT		0.06 MB/s	14.57 MB/s	231.95 ms	ChinaTelecom 5G (China Guangzhou)
 China, Wuhan CT    		Fail: Latency test failed for both TCP, and no HTTP URL available.
 China, Shenyang CM 		Fail: Latency test failed for both TCP, and no HTTP URL available.
 China, Hangzhou CM 		Fail: Latency test failed for both TCP, and no HTTP URL available.
 China, Nanning CM  		Fail: Cannot read: Resource temporarily unavailable
 China, Lanzhou CM  		Fail: Latency test failed for both TCP, and no HTTP URL available.
 Hong Kong, CSL     		22.30 MB/s	17.98 MB/s	245.17 ms	CSL (Hong Kong Kwai Chung)
 Hong Kong, PCCW    		49.47 MB/s	65.89 MB/s	195.47 ms	STC (China Hong Kong)
 Korea, South Korea 		25.47 MB/s	12.73 MB/s	281.01 ms	kdatacenter.com (South Korea Seoul)
 Japan, GLBB        		41.90 MB/s	2.69 MB/s	238.49 ms	Allied Telesis Capital Corporation (Japan Fussa-shi)
 Taiwan, FET        		32.50 MB/s	96.06 MB/s	273.81 ms	FarEasTone Telecom (Taiwan Keelung City)
 Taiwan, Chief      		41.97 MB/s	55.74 MB/s	236.98 ms	Chief Telecom (Taiwan Taoyuan)
 Taiwan, TWM        		40.08 MB/s	101.66 MB/s	245.05 ms	Taiwan Mobile (Taiwan Taoyuan)
 Singapore, Singtel 		20.04 MB/s	47.42 MB/s	251.56 ms	Singtel (Singapore Singapore)
 Singapore, M1      		23.97 MB/s	39.93 MB/s	328.19 ms	M1 Limited (Republic of Singapore Singapore)
 Singapore, NME     		22.83 MB/s	27.01 MB/s	246.96 ms	NewMedia Express (Republic of Singapore Singapore)
 USA, Century Link  		63.19 MB/s	77.72 MB/s	151.82 ms	CenturyLink (United States Seattle, WA)

Unixbench测试

性能有点爆炸 单核分数2732.1 双核分数3583.1

单核跑分
综合跑分

磁盘性能测试

磁盘都是网络挂载的 还可以

nvme磁盘测速
SATA盘测速

Netcup2020年12月闪购优惠

每日一款优惠 北京时间早上六点更新 通常会出现性价比极佳的优惠 可以注意以下

活动界面: https://www.netcup.de/adventskalender/

12.1 设置费2 € 月付0,16 € 的 .de后缀,netcup官方提供代注册服务 性价比较高 可惜de后缀无法国内备案

12.2 4核独享AMD EPYC™ 7702,20GB内存,640GB SSD空间,月付16欧,半年付,12个月合同期

12.3 虚拟主机4000 SE 500GB SSD空间 支持nodejs ruby 3.33€月付 12个月合同期

12.4 4核(应该是intel e5),10GB内存,240GB SSD空间,月付7.7欧,年付,12个月合同期 性价比可以

12.5 年付10€ .at后缀

12.6 1 GBit / s的vLAN 5.99€/月 组内网用的 可以在内网互联免流

12.7 2.79€ 他家的主题马克杯 这到国内的运费就够买10个了

12.8 虚拟主机2000 SE而不是3.89 €/月只需€2.22 一般般吧 他家就是配置越高性价比越高 低端货性价比一般

12.9 AMD EPYC™7702 48 GB DDR4 ECC RAM 30.30€/月 kvm 资源专用VPS

12.10 转销商级别B 9.99€/月 没啥鬼用 买了之后要签合同,成为转销商 拿域名和服务器有优惠

12.11 RS 4000 G9 SE AMD EPYC™7702 32 GB DDR4 ECC RAM 25€/月 性价比一般般吧

12.12 故障转移IPv6子网 3.99€/月 价格有点贵 就是个/64的ipv6

12.13 .eu后缀 0.42€/月 年付的话5€ 不过他家好像只提供.de的代注册服务 这个估计得要欧盟身份资料

12.14 转销商虚拟主机4000 9.99€/月 日常促销价

12.15 每月39.39€ RS 8000 G9 不是独立服务器 是资源专用的vps

处理器:AMD EPYC™7702
处理器核心:12个专用
RAM DDR 4 ECC:64 GB
硬盘:2 TB固态硬盘


12.16 5.55€/月 虚拟主机 8000 SE ADV20 500G SSD空间 12个免费.de后缀

12.17 10.10€/月 性价比不错 他家专用的性能很不错


处理器:
AMD EPYC™7702
处理器核心:2个专用
RAM DDR 4 ECC:12 GB
硬盘:320 GB固态硬盘

12.18 转销商虚拟主机1000 2.49€/月

12.19.ch后缀 0.42€/月

12.20 2.5GBit / s的vLAN 9.99€/月 组内网用的 可以在内网互联免流

12.21 设置费2 € 月付0,16 € 的 .de后缀,netcup官方提供代注册服务 性价比较高 可惜de后缀无法国内备案

12.22 虚拟主机2000SE 2.22€/月 还行 他家虚拟主机节日的时候是越贵的折扣越高,一般低端款性价比就这样了

12.23 VPS 12.12€/月 半年付 U应该是intel的志强 性价比可以


处理器:
AMD EPYC™7702
处理器核心:6个vCore,KVM技术
RAM DDR 4 ECC:18 GB RAM
硬盘:480 GB

12.24 虚拟主机1000 SE 0.97€/月 一般般 接下来圣诞应该有好东西

以上优惠只可以叠加新用户5€优惠卷 需要可以自取

36nc16061348969        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348968        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348967        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348966        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348965        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348964        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348963        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348962        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348961        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348960        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16006580653        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性       
36nc16006580652        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性       
36nc16006580651        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性       
36nc16006580650        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性

Netcup2020黑色星期五预告

预告地址

2020年11月26日星期四起的早鸟优惠

今年,我们将首次为现有客户提供服务,并在真正的黑色星期五之前独家提供早鸟促销。促销活动仅对2020年11月26日星期四下午6:00至2020年11月27日星期五上午6:59的现有客户有效。

  • 下午6:00: .de域名每月0.16欧元,另加2欧元的安装费(数量不限的商品)
  • 下午6时: .eu域名€5.00 /年(项目数量不限)
  • 下午6:00: .ch网域€5.05 /年(项目数量不受限制)
  • 下午6: 00  .li网域€5.05 /年(项目数量不受限制)
  • 下午6点::。at网域€10.00 /年(项目数量不受限制)

2020年11月27日黑色星期五上午7:00的特别优惠

定期促销适用于2020年11月27日(星期五)上午7:00至下午6:30(新促销活动的时间是有限的),仅在售完即止。

  • 07:00-07:59 a.m。:.de域名€0.16 /月加€2设置费(不限数量的商品)
  • 7:00-07:59 am: .at域名€10.00 /年(项目数量不受限制)

  • 上午7:00 ::。 eu域名€5.00 /年(项目数量不受限制)
  • 上午7:00: .ch域名€5.05 /年(项目数量不受限制)
  • 上午7:00: .li网域€5.05 /年(项目数量不受限制)
  • 上午07:00:虚拟主机1000 SE 50%折扣-而不是€1.94 /月仅€0.97 /月(最多100件)
  • 上午07:00: Cloud vLAN 2.5 Gbit7s 50%折扣-而不是€19.99 /月仅€9.99 /月(最多1000件)
  • 上午07:00: VPS 1000 G9-而不是€5.85 /月仅€4.44 /月(最多200件)
  • 上午8:00: RS 2000 G9-而不是每月€15.60(每月最多€11.11)
  • 上午8:00:虚拟主机4000 SE-而不是€7.79 /月仅€3.33 /月(最多333件)
  • 9:00上午: VPS Black Surprise-仅€7.77 /月(最大777台)
  • 上午09:00:转销商虚拟主机4000-而不是19.49€/月(仅9.99€/月)(最多99件)
  • 上午10:00: VPS 500 G8-而不是€5.16 /月仅€3.99 /月(最多50件)
  • 11:00 am: RS Black Special 1-仅€10.10 /月(最多200件)
  • 上午11:00:虚拟主机2000 SE-而不是€3.89 /月仅€2.22 /月(最多200件)
  • 下午12:00: RS Black Special 2-仅€16.16 /月(最多161件)
  • 下午12:00:虚拟主机8000 SE-而不是€12.66 /月仅€5.55 /月(最多1000件)
  • 下午1:00:经销商B级-而不是€18.52 /月仅€9.99 /月(最多100件)
  • 下午1点: RS 8000 G9 SE-仅€39.39 /月(最多100件)
  • 下午2:00: RS Black Special 3-仅30.30€/月(最多200件)
  • 下午3时: Cloud vLAN Giga-而不是€12.66 /月仅€5.99 /月(最多400个单位)
  • 下午4:00: RS 4000 G9 SE-仅€25.00 /月(最多200件)
  • 下午5:00: VPS Black Wonder-每月仅12.12欧元(最多200件)

  • 6:00-6:29 p.m .: VPS 200 G8-仅1.79€/月(最多50件)

促销活动的更改或增加将在我们的特价博客Twitter宣布。时间表会根据需要进行更新。


所有价格均以欧元为单位并包括增值税,“早鸟”仅适用于2020年11月26日(星期四)下午6:00至2020年11月27日(星期五)上午6:59之间的现有客户,售完即止。定期促销仅在2020年11月27日有效,并且售完即止。不排除错误。我们在线商店(www.netcup.de)上的价格适用。促销不能与优惠券一起使用。

以上优惠只可以配合新用户5o优惠卷 其他优惠卷不能用 以下是优惠码
36nc16061348969        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348968        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348967        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348966        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348965        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348964        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348963        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348962        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348961        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16061348960        优惠券5欧元(适用于新客户,无域名)        23.11.2020        无限有效性       
36nc16006580653        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性       
36nc16006580652        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性       
36nc16006580651        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性       
36nc16006580650        优惠券5欧元(适用于新客户,无域名)        21.09.2020        无限有效性

最大子序和 最大连续子数组和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

初看有点懵逼,一直想有啥简单的解法,想半天只想到用暴力做orz

时间复杂度 O(n^3) 时间爆炸

class Solution {
    public int maxSubArray(int[] nums) {
        int max = -100;
        int sum = 0;
        if(nums.length == 1){
            return nums[0];
        }
        for(int i = 0;i < nums.length; i++){
            for(int j = i ; j < nums.length; j++){
                sum = 0;
                for(int k = i ; k <= j ; k++ ){
                    sum += nums[k];
                    if(sum > max){
                        max = sum;
                    }
                }
            }
        }
        return max;
    }
}

贪心法 相对于暴力简直快的飞起

贪心准则:遍历整个数组,逐一求和sum.当sum <= 0 时,对后续子序列和不是正收益,直接舍弃,同时用max记录sum的最大值.

class Solution {
    public int maxSubArray(int[] nums) {
        int max = -2147483648;//避免干扰设置成最小
        int sum = 0;
        for(int i : nums){
            if(sum > 0){
                sum += i;
            }else{
                sum = i;
            }
            max = max > sum ? max : sum;
            
        }
        return max;
    }
}

学习了大佬们给出的动态规划法 感觉跟贪心法一个思路,只不过是把sum求和结果放在nums上了

class Solution {
    public int maxSubArray(int[] nums) {
        int point = nums[0];
        for(int i = 1;i < nums.length;i++){
            if(point > 0 ){
                nums[i] += point;
            }
            point = nums[i];
        }
        return Arrays.stream(nums).max().getAsInt();
    }
}

哈尔滨理工 校园网 公网ipv6教程

校园网支持ipv6,上联单位为cernet2黑龙江省结点,使用isatap隧道技术接入。

经测试获取到的是公网的ipv6!!甚至没有封禁关键端口

linux下操作 我用发行版是manjaro 其他的发行版也行 用对应的工具安装isatapd即可

[dragonfsky@dragonfsky-mi ~]$ sudo pacman -S  isatapd
[dragonfsky@dragonfsky-mi ~]$ sudo isatapd 192.168.254.250
isatapd[72459]: interface is0 up 出现如下提示时即可获得教育网的公网ipv6地址

windows下操作

Dos下输入netsh
          Interface  ipv6  isatap
          set  router  192.168.254.250
          set  state enable
          exit

两数相加

问题描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

本彩笔的解法 纯粹的按部就班 浪费很多内存空间 唯一的优点就是速度还行 感觉有很多三元运算符是没必要的,以后再看看。

时间复杂度:O(max(m, n))

空间复杂度: O(max(m,n))

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode tempNode = new ListNode(0);
        ListNode firstNode = tempNode;
        int nextPlus = 0;
        while(!(l1 == null && l2 == null)){
        	int sum = ((l1==null)?0:(l1.val))+((l2==null)?0:l2.val) + nextPlus;
            nextPlus = 0;
        	if (sum >= 10) {
        		nextPlus = sum/10;
        		sum -= nextPlus*10;
        	}
        	tempNode.next = new ListNode(sum);
        	tempNode = tempNode.next;
        	l1 = l1==null? null : l1.next;
        	l2 = l2==null? null : l2.next;
        }
        if (nextPlus > 0) {
        	tempNode.next = new ListNode(nextPlus);
        }
        return firstNode.next;
    }
}

大佬们的解法

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int carry = 0;
        while(l1 != null || l2 != null) {
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + carry;
            
            carry = sum / 10;
            sum = sum % 10;
            cur.next = new ListNode(sum);

            cur = cur.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if(carry == 1) {
            cur.next = new ListNode(carry);
        }
        return pre.next;
    }
}

作者:guanpengchn
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/hua-jie-suan-fa-2-liang-shu-xiang-jia-by-guanpengc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

双数之和问题

问题描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

有点不太理解 “数组中同一个元素不能使用两遍” 具体值的什么

最简单的暴力法 时间复杂度:O(n^2) 空间复杂度: O(1)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0 ; i < nums.length ;i++ ) {
			for (int j = nums.length-1 ; j != i ; j--) {
				if ((nums[i]+nums[j]) == target) {
					System.out.print(" i:"+i+"j:"+j);
					break;
				}
			}
		}
        throw new IllegalArgumentException("No two sum solution");
    }
}

优化的思路利用哈希表

哈希表可以建立关键字key和索引的映射,通过以空间换取速度的方式,在不产生冲突时能够以恒定的时间进行快速查找,一旦产生冲突查找时间可能会从O(1) 降低到 O(n)。

时间复杂度:接近O(n) 空间复杂度:O(n)

class test{
	public int[] get(int[]num , int target){
		Map<Integer,Integer> map = new HashMap<>();
		for (int i = 0 ; i < num.length ; i++ ) {
			if (map.containsKey(target - num[i])) {
				return new int[]{map.get(target-num[i]),i}
			}
			map.put(num[i], i);
		}
	}
}

Java流笔记之对象序列化

java.io.Serializable

java.io.Externalizable

序列化机制可以将实现序列化的对象转换成字节序列,使得对象能脱离java程序存在.如果要使一个对象是可序列化的,需要实现Serializable接口或者Externalizable接口之一.

使用Serializable标记接口实现对象的序列化很简单,只需要目标对象类实现Serializable接口即可,无需实现其方法.如果希望让对象的一些实例变量不被序列化,可以使用transient修饰符修饰.

1.将student对象序列化并储存在磁盘中并读取还原成对象

import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.lang.ClassNotFoundException;

public  class SerializeTest{
	public static void main(String[] args) {
		try(
			ObjectOutputStream oop = new ObjectOutputStream(new FileOutputStream("log.txt"));
			ObjectInputStream oip = new ObjectInputStream(new FileInputStream("log.txt"));
		){
			Student s1 = new Student(3,"李华",1998);
			oop.writeObject(s1);
			Student s = (Student)oip.readObject();
			System.out.println(s.age + "  " + s.name + " " + s.year);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
class Student implements Serializable{
	int age;
	transient String name;
	int year;
	Student(int age, String name, int year){
		this.age = age;
		this.name = name;
		this.year = year;
	}
}
运行结果:(name用transient修饰,并未被序列化写入到磁盘)
3  null 1998
[Finished in 0.9s]

使用transient修饰的实例成员会被排除在序列化机制外,导致在反序列化时无法获得该实例成员的值.除了transient修饰符之外,Java还提供了自定义序列化机制,通过自动序列化机制,可以使程序自定义控制序列化流程.自定义序列化包含三个方法:

private void writeObject(ObjectOutputStream out) //负责写入对象 默认会调用out.defaultWriteObject()方法
private void readObject(ObjectInputStream in) //负责读取恢复对象 默认会调用in.defaultReadObject()方法
private void readObjectNoDate() //当序列流不完整时,负责初始化反序列化对象

 **注意**

  1. 如果使用序列化向一个文件写入了多个对象,那么读取时是按照写入顺序读取.
  2. 若可序列化对象拥有多个父类,那么这些父类要么有无参的构造器,要么也是序列化的,否则就会抛出InvalidClassException异常.另外,如果父类是不可序列化但有无参数的构造器,则父类中定义的成员变量值不会序列化到二进制流中.
  3. 若类的成员变量不是基本类型或者String,而是其他的引用类型,则这个引用类型也要是可序列化,否则该类无法序列化.(因为在序列化对象时,对象的所有成员变量也会被序列化).
  4. JAVA序列化机制采用了特殊的算法
    • 所有保存到磁盘的对象拥有一个特殊的序列化编号
    • 在程序进行序列化对象之前会检查该对象是否被序列化过,只有在该对象在(本次java虚拟机)未被序列化过时才会将该对象转换成字节系列.
    • 若该对象已经被序列化过,则程序会直接输出该对象的序列化编号.
    • **注意**在对可变对象进行序列化时一定要注意,如果在序列化可变对象后再改变该对象并且进行序列化,程序只会输出该对象改变前的序列化编号,并不会将改变过的对象重新序列化输出.

Java流笔记之RandomAccessFile

java.io.RandomAccessFile

RandomAccessFile是java的一个文件内容访问类,特点是支持”随机访问”,但只能对文件进行操作.
构造方法:

RandomAccessFile(File file/String fileName, String mode): mode为读写模式,分别有:
"r":只读,若写会抛出IOException
"rw":读写,若文件不存在则会创建
"rwd":读写,内容更新同步写到底层设备
"rws":读写,内容和元数据更新同步写到底层设备

常用方法:

long getFilePointer():返回文件中指针的位置
void seek(long index):将指针定位到index位置
void readXXX() void writeXXX() 读写

1.读取文件

import java.io.RandomAccessFile;
import java.io.IOException;
import java.io.FileNotFoundException;
public class RandomAccessFileTest{
	    public static void main(String[] args) {
	    try(
		    RandomAccessFile raf = new             
            RandomAccessFile("RandomAccessFileTest.java","rw");
		    ){
		    System.out.println("文件指针初始位置 :     "+raf.getFilePointer());
		    byte[] buffer = new byte[32];
		    int hasRead;
		    while ((hasRead = raf.read(buffer)) > 0) {
		    	    System.out.print(new String(buffer,0,hasRead));
		    }
	    }catch (IOException e) {
	    	e.printStackTrace();
	    }
    }
}

2.追加内容

import java.io.RandomAccessFile;
import java.io.IOException;
import java.io.FileNotFoundException;
public class RandomAccessFileTest{
	public static void main(String[] args) {
		try(
			RandomAccessFile raf = new RandomAccessFile("RandomAccessFileTest.java","rw");
		){
			System.out.println("文件字节数 : " + raf.length());
			raf.seek(raf.length());
			System.out.println("当前文件指针位置: " + raf.getFilePointer());
			raf.write("//这是添加的内容".getBytes());

		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}//这是添加的内容

3.修改内容

**注意:直接修改文件指针内容会直接覆盖内容**
import java.io.RandomAccessFile;
import java.io.IOException;
import java.io.FileNotFoundException;//这是添加的新内容//这是添加的新内容
public class RandomAccessFileTest{
	public static void main(String[] args) {
		try(
			RandomAccessFile raf = new RandomAccessFile("RandomAccessFileTest.java","rw");
		){
			System.out.println(raf.getFilePointer());
			raf.seek(101);
			//将剩余内容缓存到content
			byte[] buffer = new byte[1024];
			int hasRead;
			String content = "";
			while ( (hasRead = raf.read(buffer)) > 0) {
				content += new String(buffer,0,hasRead);
			}
			System.out.println(content);
			raf.seek(101);
			//开始修改内容
			raf.write("//这是添加的新内容".getBytes());
			raf.write(content.getBytes());
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}//这是添加的内容