IO&&Serize 利用线程Thread.Sleep实现"自动输出"
查看链接 https://github.com/jungle8884/C-.Net/tree/MyClassLibrary
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Jungle8884
{
/// <summary>
/// 对应于SerializeHelper,必须添加可序列化特性
/// </summary>
[Serializable]
public class Person
{
[NonSerialized]
public int Id = ; public string Name { get; set; } public string Gender { get; set; } } [Serializable]
public class Programmer : Person
{
private string Language { get; set; } public string Description { get; set; } } /// <summary>
/// 数据工厂
/// </summary>
public class DataFactory
{
/// <summary>
/// 初始化数据---用于测试
/// </summary>
/// <returns></returns>
public static List<Programmer> BuildProgrammerList()
{
#region data-prepare
List<Programmer> list = new List<Programmer>();
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "SoWhat",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "day",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "领悟",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "Sam",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "AlphaGo",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "折腾",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "Me860",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "打兔子的猎人",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "Nine",
Gender = "女"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "望",
Gender = "女"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "微笑刺客",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "waltz",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "爱在昨天",
Gender = "男"
});
list.Add(new Programmer()
{
Id = ,
Description = "高级班学员",
Name = "waltz",
Gender = "男"
});
#endregion return list;
}
}
}
数据准备
IO: 97和69两行可以模拟控制台自动输出---模拟黑客。。。
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.IO;
using System.Threading; namespace Jungle
{
public class MyIO
{
//日志文件名
private static string sLogFileName = Path.Combine(MyConstants.LogPathAbsolute, "Log.txt");
/// <summary>
/// 写日志
/// </summary>
/// <param name="sWriteIn"></param>
public static void WriteLogsWriteLine(string sWriteIn)
{
if (!File.Exists(sLogFileName))
{
//1 先创建文件夹
Directory.CreateDirectory(MyConstants.LogPathAbsolute);
//2 再创建文件
using (FileStream fileStream = File.Create(sLogFileName))//打开文件流 (创建文件并写入)
{
StreamWriter sw = new StreamWriter(fileStream);
sw.WriteLine(sWriteIn);
sw.Flush();
#region 其他方法---字节流
//byte[] bytes = Encoding.Default.GetBytes(sWriteIn);
//fileStream.Write(bytes, 0, bytes.Length);
//fileStream.Flush();
#endregion
}
}
}
/// <summary>
/// 写日志---追加
/// </summary>
public static void WriteLogsAppendText(string sWriteIn)
{
using (StreamWriter sw = File.AppendText(sLogFileName))
{
sw.WriteLine(sWriteIn);
sw.Flush();
} } /// <summary>
/// 读取日志输出到控制台
/// 适合小数据文件
/// </summary>
public static void ReadLogsToConsole()
{
foreach (string sResult in File.ReadAllLines(sLogFileName))
{
#region 其他方法---仅供参考
//string sResult = File.ReadAllText(sLogFileName);//一次性读取所有的文本 //Byte[] byteContent = File.ReadAllBytes(sLogFileName);//字节流的方式读取
//string sResultByte = Encoding.UTF8.GetString(byteContent);//字节流解码为字符串
#endregion
char[] cResult = sResult.ToCharArray();
foreach (char c in cResult)
{
Console.Write(c);
Thread.Sleep(200);
}
Console.WriteLine();
}
} /// <summary>
/// 读取大文件使用(当然小文件一样适用)
/// 采用策略:分批读取
/// </summary>
public static void ReadLargeFileToConsole()
{
using (FileStream stream = File.OpenRead(sLogFileName))
{
int iLength = ;//指定每次读取长度
int iResult = ; do
{
byte[] bytes = new byte[iLength];
iResult = stream.Read(bytes,,iLength);//返回读取的字节数
Console.Write((Encoding.UTF8.GetString(bytes, , iResult)));//直接输出一句
#region 按字节输出
//for (int i = 0; i < iResult; i++)
//{
// Console.Write((bytes[i].ToString()));
//}
#endregion
Thread.Sleep(300);
}
while (iLength == iResult);
}
} /// <summary>
/// 通过递归获取根目录下的所有子文件夹
/// 适用于无限集
/// 缺点:耗内存
/// </summary>
/// <param name="directoryList">存放所有文件夹的集合</param>
/// <param name="directoryParent">根目录文件夹</param>
public static void GetChildDirectoryByRecursion(List<DirectoryInfo> directoryList, DirectoryInfo directoryParent)
{
DirectoryInfo[] directoryListChild = directoryParent.GetDirectories();
directoryList.AddRange(directoryListChild);
if (directoryListChild.Length > )//跳出条件--->出口
{
foreach (var directoryChild in directoryListChild)
{
GetChildDirectoryByRecursion(directoryList, directoryChild);//相同的代码抽取出来--->递归
}
}
}
}
}
配置路径的新思想:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration; namespace Jungle
{
public class MyConstants
{
/// <summary>
/// 配置绝对路径---模板
/// </summary>
public static string LogPathAbsolute = ConfigurationManager.AppSettings["LogPath"]; /// <summary>
/// 配置相对路径---获取当前程序路径
/// </summary>
public static string LogPathRelative = AppDomain.CurrentDomain.BaseDirectory; /// <summary>
/// 序列化数据地址
/// </summary>
public static string BinarySerializeDataPath = ConfigurationManager.AppSettings["BinarySerializeDataPath"]; //二进制
public static string SoapSerializeDataPath = ConfigurationManager.AppSettings["SoapSerializeDataPath"]; //Soap
public static string XmlSerializeDataPath = ConfigurationManager.AppSettings["XmlSerializeDataPath"]; //Soap
}
}
MyConstants
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<appSettings><!-- 每台电脑的路径不一样,可自己更改 -->
<add key="LogPath" value="D:\Coding\Project\Jungle8884\Files\Logs\"/>
<add key="BinarySerializeDataPath" value="D:\Coding\Project\Jungle8884\Files\Serialize\"/>
<add key="SoapSerializeDataPath" value="D:\Coding\Project\Jungle8884\Files\Soap\"/>
<add key="XmlSerializeDataPath" value="D:\Coding\Project\Jungle8884\Files\Xml\"/>
</appSettings>
</configuration>
configuration
Serialize:
using Jungle8884;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization; namespace Jungle
{
/// <summary>
/// 本序列化只作为一个例子
/// 对应于Programmer类
/// 具体情况可以更改为泛型或具体类型
/// </summary>
public class MySerializableHelper
{
/// <summary>
/// 存放文件名称与路径
/// </summary>
private static string sFileNameBinary = Path.Combine(MyConstants.BinarySerializeDataPath, "BinarySerialize.txt");
private static string sFileNameSoap = Path.Combine(MyConstants.SoapSerializeDataPath, "SoapSerialize.txt");
private static string sFileNameXml = Path.Combine(MyConstants.XmlSerializeDataPath, "Programmer.xml"); #region 二进制序列化 public static void BinarySerialize(List<Programmer> pList)
{
using (Stream fStream = new FileStream(sFileNameBinary, FileMode.Create, FileAccess.ReadWrite))
{
pList = DataFactory.BuildProgrammerList();
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
binFormat.Serialize(fStream, pList);
}
} public static List<Programmer> BinaryDeserialize()
{
List<Programmer> pList = null;
using (Stream fStream = new FileStream(sFileNameBinary, FileMode.Open, FileAccess.ReadWrite))
{
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
fStream.Position = ;
pList = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化
}
return pList;
} #endregion #region Soap序列化 public static void SoapSerialize(List<Programmer> pList)
{
using (Stream fStream = new FileStream(sFileNameSoap, FileMode.Create, FileAccess.ReadWrite))
{
pList = DataFactory.BuildProgrammerList();
SoapFormatter soapFormat = new SoapFormatter();//创建二进制序列化器
//soapFormat.Serialize(fStream, pList);//SOAP不能序列化泛型对象
soapFormat.Serialize(fStream, pList.ToArray());
}
} public static List<Programmer> SoapDeserialize()
{
List<Programmer> pList = null;
using (Stream fStream = new FileStream(sFileNameSoap, FileMode.Open, FileAccess.ReadWrite))
{
SoapFormatter soapFormat = new SoapFormatter();
fStream.Position = ;
pList = ((Programmer[])soapFormat.Deserialize(fStream)).ToList();
}
return pList;
} #endregion //BinaryFormatter序列化自定义类的对象时,序列化之后的流中带有空字符,以致于无法反序列化,
//反序列化时总是报错“在分析完成之前就遇到流结尾”(已经调用了stream.Seek(0, SeekOrigin.Begin);)。
//改用XmlFormatter序列化之后,可见流中没有空字符,从而解决上述问题,但是要求类必须有无参数构造函数,
//而且各属性必须既能读又能写,即必须同时定义getter和setter,若只定义getter,则反序列化后的得到的各个属性的值都为null。 #region Xml序列化 public static void XmlSerialize(List<Programmer> pList)
{
using (Stream fStream = new FileStream(sFileNameXml, FileMode.Create, FileAccess.ReadWrite))
{
pList = DataFactory.BuildProgrammerList();
XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>));
xmlFormat.Serialize(fStream, pList);
}
} public static List<Programmer> XmlDeserialize()
{
List<Programmer> pList = null;
using (Stream fStream = new FileStream(sFileNameXml, FileMode.Open, FileAccess.ReadWrite))
{
XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>));
fStream.Position = ;
pList = (List<Programmer>)xmlFormat.Deserialize(fStream);
}
return pList;
} #endregion #region Json序列化分为两种:微软的和Newtonsoft的 //对象到Json字符串叫序列化
public static string JsonSerialize(List<Programmer> pList)
{
pList = DataFactory.BuildProgrammerList();
string sResultJson = MyJsonHelper.ObjectToString<List<Programmer>>(pList);
return sResultJson;
}
public static string JsonSerializeNewtonsoft(List<Programmer> pList)
{
pList = DataFactory.BuildProgrammerList();
string sResultJson = MyJsonHelper.ToJson<List<Programmer>>(pList);
return sResultJson;
} //Json字符串到对象叫反序列化
public static List<Programmer> JsonDeserialize(string sJson)
{
List<Programmer> pList = MyJsonHelper.StringToObject<List<Programmer>>(sJson);
return pList;
}
public static List<Programmer> JsonDeserializeNewtonsoft(string sJson)
{
List<Programmer> pList = MyJsonHelper.ToObject<List<Programmer>>(sJson);
return pList;
}
#endregion }
}
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;//System.Web.Extensions namespace Jungle
{
public class MyJsonHelper
{ #region 微软自带Json序列化
/// <summary>
/// (Object到)Json的序列化
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="obj">对象实例</param>
/// <returns>返回字符串</returns>
public static string ObjectToString<T>(T obj)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Serialize(obj);
}
/// <summary>
/// Json(到Object)的反序列化
/// </summary>
/// <typeparam name="T">反序列化到对象类型</typeparam>
/// <param name="sContent">待反序列化的字符串</param>
/// <returns></returns>
public static T StringToObject<T>(string sContent)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Deserialize<T>(sContent);
}
#endregion #region Newtonsoft.Json
/// <summary>
/// (Object到)Json
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToJson<T>(T obj)
{
return JsonConvert.SerializeObject(obj);
} /// <summary>
/// (Json到)Object
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sContent"></param>
/// <returns></returns>
public static T ToObject<T>(string sContent)
{
return JsonConvert.DeserializeObject<T>(sContent);
}
#endregion }
}
MyJsonHelper
测试代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Jungle; namespace Jungle8884
{
class Program
{
static void Main(string[] args)
{
MySafeInvoke.InvokeMethod(() => {
//MyIO.WriteLogsWriteLine("Get up to cheer up!");
//MyIO.WriteLogsAppendText("睡你麻痹,起来嗨!");
//MyIO.WriteLogsAppendText("为什么?");
//MyIO.WriteLogsAppendText("你很帅啊!");
//MyIO.WriteLogsAppendText("真的!");
//MyIO.WriteLogsAppendText("我不信...");
//MyIO.WriteLogsAppendText("这是真的!");
//MyIO.WriteLogsAppendText("这不是梦!");
//MyIO.ReadLogsToConsole();
//MyIO.ReadLargeFileToConsole();
//Process.Start(Path.Combine(MyConstants.LogPathAbsolute, "Log.txt"));//打开文本文件
List<Programmer> pList = null;
MySerializableHelper.BinarySerialize(pList);
MySerializableHelper.SoapSerialize(pList);
MySerializableHelper.XmlSerialize(pList);
});
}
}
}
下载链接:
链接:https://pan.baidu.com/s/1mjNnqQ0 密码:pco3
IO&&Serize 利用线程Thread.Sleep实现"自动输出"的更多相关文章
- 利用javascript实现文本的自动输出
主要利用了setTimeout(),递归和String.substring(); 做出的效果就像是有一个打字员在打字. <!doctype html> <html lang=&quo ...
- RabbitMQ/JAVA 客户端测试(补:利用线程)
上次进行了简单的连接测试.这次主要进行一下小小的补充.利用线程将生产者消费者代码合到一个文件中. 我是将Recv.java(消费者)文件放在一个线程里添加到Send.java(生产者)中. 代码如下: ...
- 线程(thread)
线程(thread): 现代操作系统引入进程概念,为了并发(行)任务 1.进程之间的这种切换代价很高 2.通信方式的代价也很大基本概念: 1.线程是比进程更小的资源单位,它是进程中的一个执行路线(分支 ...
- 线程 Thread Runnable 守护线程 join MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 转:线程Thread (1)
引言 1.理解多线程 2. 线程异步与线程同步 3.创建多线程应用程序 3.1通过System.Threading命名空间的类构建 3.1.1异步调用线程 3.1.2并发问题 3.1.3线程同步 3. ...
- 多个线程分别顺序交替打印一种不同字符abcdefg(已实现随便多少个线程打印多少个字符,利用线程池实现多线程)
下面实现多线程顺序打印字符"abcdefg": 实现Runnable接口: /** * @author: rhyme * @date: 2019-08-17 14:39 * @to ...
- Python 线程,with的作用(自动获取和释放锁Lock)
Python 线程,with的作用(自动获取和释放锁Lock) import threading import time num= #全局变量多个线程可以读写,传递数据 mutex=threading ...
- C/C++ Muti-Thread多线程编程学习(之)线程Thread | 创建、运行、结束
文章目录 前言 线程 Thread 创建线程 CreateThread _beginthread _beginthreadex pthread_create 线程运行 结束线程 前言 多线程(Mu ...
- 1.利用consul实现k8s服务自动发现
标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额 ...
随机推荐
- LINUX服务器--所有用户登陆操作命令审计
Linux用户操作记录我们都可以通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,那么Linux history命令就基本上不会有太大的作用了.我们怎么来查看Linux用 ...
- [国嵌攻略][165][usb下载线驱动设计]
查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...
- python基础2 day3
一.上节回顾 1,while else2,格式化输出name = input('>>>')s1 = '我叫%s,今年%d岁'%(name,18)dic1name = input('& ...
- spring boot容器启动详解
目录 一.前言 二.容器启动 三.总结 =======正文分割线====== 一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为 ...
- 用adb命令查看apk版本
adb devices (显示连接的设备) adb root (获取手机root权限) adb remount (重新挂载系统分区,使系统分区重新可写) adb shell (进入目标设备的L ...
- Spark性能调优之JVM调优
Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成 2.Spark的调优为什么会和JVM的调 ...
- 解Linux SSH命令大全,新手必看SSH命令
下面介绍一些基本的常用的Linux SSH命令,都是一些很简单的Linux SSH命令,新手掌握了这几个,一般管理一般的vps或者linux主机就可以了! 我们的教程介绍了putty的使用方法 ...
- Apache 403 错误解决方法-让别人可以访问你的服务器
参考网址:http://www.cnblogs.com/mrlaker/archive/2013/04/29/3050888.html http://www.jb51.net/article/6119 ...
- Spring学习之路二——概念上理解Spring
一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...
- linux unzip 解压后文件名乱码
在windows上zip的包,rz上传到linux下,发现出现乱码.记录下解决过程: 1.确定windows上的默认字符集 在Windows平台下,直接在命令行中,输入:chcp 在显示的结果中,会出 ...