流无处不在,只要是关于到文件的输入、输出、更新等,关于IO流,项目中还是经常用到的,写log日志免不了要与其打交道,现在需要用到,就顺道好好回顾一下进行整理,首先是几个需要用到的类的说明,其实说简单点,就是对文件夹、文件、文件内容进行编辑。

1. 创建文件、文件夹

        public void OperationFile()
{
//创建文件
if (!File.Exists("Log.txt"))
{
File.Create("Log.txt"); } //创建文件夹
if (!Directory.Exists("Log"))
{
Directory.CreateDirectory("Log");
}
}

2. 读写数据到文件中

FileStream 原始,比较复杂,处理的数据多

读取文件数据

        public void ReadFileStream()
{
//打开数据
//FileStream fs = File.OpenRead("201704191450.txt");
//FileInfo fileinfo = new FileInfo("201704191450.txt");
//FileStream fs = fileinfo.OpenRead(); //读取数据
byte[] bytedata = new byte[];
char[] chardata = new char[];
FileStream ffs = new FileStream("TestRead.txt",FileMode.Open);
//执行文件指针位置
ffs.Seek(,SeekOrigin.Begin);
//读取数据,其起始位置为seek指定的指针位置末
ffs.Read(bytedata,,);
//设置转码格式
Decoder d = Encoding.UTF8.GetDecoder();
d.GetChars(bytedata,,bytedata.Length,chardata,);
Console.WriteLine(chardata);
Console.ReadKey(); }

写入文件数据

        public void WriteFileStream()
{
//写入数据
byte[] byteData = new byte[];
char[] charData = new char[];
FileStream fis = new FileStream("TestWrite.txt", FileMode.Create);
charData = ("This is a jokey").ToArray();
byteData = new byte[charData.Length];
Encoder e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData, , charData.Length, byteData, , true);
fis.Seek(, SeekOrigin.Begin);
fis.Write(byteData, , byteData.Length);
}

由此可见,操作字符数据比较麻烦。而StreamWritrer、StreamReader不需要设置指针位置,读写文件时,比较灵活

StreamReader读取文件数据

        /// <summary>
/// StreamReader读取日志
/// </summary>
public void ReadLog()
{
StreamReader sr = new StreamReader("201704191451.txt", true);
string line = sr.ReadLine();
while (line!=null)
{
Console.WriteLine(line);
line = sr.ReadLine();
} sr.Close();
}

StreamWriter写入文件数据

        /// <summary>
/// StreamWrite写入日志
/// </summary>
/// <param name="ex"></param>
public void WriteExLog(string ex)
{
StreamWriter sw = new StreamWriter(DateTime.Now.ToString("yyyyMMddHHmm")+".txt",true);
sw.WriteLine(DateTime.Now.ToString("G")+" "+ex);
sw.Close(); }

两者一进行对比,可见StreamWriter、StreamReader确实比FileStream方便很多

关于流文件的使用,上面仅仅是单一的操作,实际项目中,多为混合模式,各种判断柔和在一起,这里也不多说什么,先写一个相对来书综合点的方法

       public void OperationStream()
{
//当前Debug下+创建文件夹
string straddrsfile = AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar.ToString() + "Test1";
//当前路径+文件名
string straddrspath = straddrsfile + Path.DirectorySeparatorChar.ToString() + "Test1" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xml";
straddrspath = straddrspath.Replace("\\", "/");
if (!File.Exists(straddrsfile))
{
//创建文件夹
Directory.CreateDirectory(straddrsfile);
//创建文件
StreamWriter sw = new StreamWriter(straddrspath,true);
//写入数据
sw.WriteLine(DateTime.Now.ToString("G") + "This is a jokey");
sw.Close();
//读取数据
StreamReader sr = new StreamReader(straddrspath,true);
string line = sr.ReadLine();
//输出数据
while (line != null)
{
Console.WriteLine(line);
line = sr.ReadLine();
}
sr.Close();
Console.ReadKey();
}
}

对于这些流关联的类,其重载的方法有很多,向那些参数的说明,指尖敲击下键盘,点下联想看看说明,就出来,总之,深入的研究清一个问题需要大量的时间,结果还未可知,当前项目既然需要这个日志,就稍稍巩固下。

------分割线---------------

实战:现在接手的项目中需要异常日志,初步思路如下:

        //記錄異常日誌  Log file txt
public void WriteTxtLog(Exception ex,string sysCode,string functId)
{
//文件夾名稱
string logFolder = ConfigurationManager.AppSettings["LogFolder"];
//文件名
string logFolderName = ConfigurationManager.AppSettings["LogFolderName"];
//文件夾路徑
string logFolderPath = ConfigurationManager.AppSettings["LogFolderPath"];
//文件路徑
string path = logFolderPath + "\\" + logFolder + "\\" + DateTime.Now.ToString("yyyyMMdd") + logFolderName;
//创建文件夹
if (!Directory.Exists(logFolderPath+"\\"+ logFolder))
{
Directory.CreateDirectory(logFolderPath + "\\" + logFolder);
}
//不存存在txt,則創建,存在則追加
var sw = !File.Exists(path) == true ? new StreamWriter(path, true) : File.AppendText(path);
//写入数据
sw.WriteLine("..................");
sw.WriteLine("異常日誌,開始時間:" + DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));
sw.WriteLine("系統名:" + sysCode + " 功能代號:" + functId + " 異常錯誤信息:" + ex.ToString());
sw.WriteLine("異常日誌,完成時間:" + DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));
sw.WriteLine("..................");
sw.Close();
}

市人皆大笑,举手揶揄之

IO流中的Stream相关对象的更多相关文章

  1. 第54节:Java当中的IO流(中)

    Java当中的IO流(中) 删除目录 // 简书作者:达叔小生 import java.io.File; public class Demo{ public static void main(Stri ...

  2. Java当中的IO流(中)

    Java当中的IO流(中) 删除目录 import java.io.File; public class Demo{ public static void main(String[] args){ / ...

  3. 规范之“用流中的Stream.Of(arr1,arr2)将两个集合合并”

    案例:用流中的Stream.Of(arr1,arr2)将两个集合合并 /** * 功能描述: * 两个对象集合添加到一起 * 在用flatMap扁平化改为Stream<User> * 这样 ...

  4. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  5. io流中的装饰模式对理解io流的重要性

    为了说明 io流中的装饰者模式对理解io流的重要性,我想先简要介绍以下io的装饰模式. 装饰(decorator)你也可以翻译成修饰.比如:一个会精通化学数学的物理学家.在这个"物理学家&q ...

  6. Java中IO流中所涉及到的各类方法介绍

    IO流之字节流 (1)IO用于在设备间进行数据传输的操作 (2)分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意 ...

  7. IO流中的字符输入输出流及try...catch处理流处理中的异常

    使用字节流读取中文的问题 import java.io.FileInputStream; import java.io.IOException; /* 使用字节流读取中文文件 1个中文 GBK:占用两 ...

  8. 关于Java中面向对象章节、IO 流中的重点基础知识。

    一.面向对象的三大特征,以及作用. 答:面向对象的三大特征即,封装性.继承性.多态性. 其分别的作用为 : 封装作用:将数据封装起来,提高数据的安全性, 继承作用:提高代码的复用性,减少冗余代码. 多 ...

  9. Java中IO流中的装饰设计模式(BufferReader的原理)

    本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...

随机推荐

  1. iOS基础之顺传逆传传值(delegate、block)

    写给iOS新手的福利! 在项目中经常会用到传值,根据传值的方向分为顺传(从根控制器到子控制器)和逆传(从子控制器到根控制器).在这里写了个Demo简单演示了效果,创建了两个控制器: 一个为根控制器,一 ...

  2. js对象继承的问题

    js继承方法有多种: 1.利用call()和apply()的方法. call()里面接受多个参数:apply()只能接受两个参数. call()第一个参数是本身,后面都是他的属性和方法. apply( ...

  3. .Net程序员学用Oracle系列(20):层次查询(CONNECT BY)

    1.层次查询语句 1.1.CONNECT BY 语法 1.2.CONNECT BY 示例 2.层次查询函数 2.1.SYS_CONNECT_BY_PATH 2.2.WMSYS.WM_CONCAT 2. ...

  4. java开发之阿里云对象存储OSS和云数据库Memcache的使用

    web开发中标配:aliyun ECS(阿里云服务器),aliyun RDS(阿里云数据库),aliyun OSS(阿里云对象存储),aliyun Memcache(阿里云缓存数据库). 今天就介绍下 ...

  5. 用php+mysql+ajax+jquery做省市区三级联动

    要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下拉跟着变化,市级下拉变化时区下拉跟着变化. 使用chinastates ...

  6. 常见Android面试题及答案(详细整理)

    1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...

  7. 关于<context:property-placeholder>的一个有趣现象

    转:http://stamen.iteye.com/blog/1926166 先来看下A和B两个模块 A模块和B模块都分别拥有自己的Spring XML配置,并分别拥有自己的配置文件: A模块 A模块 ...

  8. JDBC(下)

    1. 预编译sql处理(防止sql注入) -- 创建数据库 CREATE DATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i -- 创建表 USE jdbc ...

  9. TCP协议之三次握手与四次挥手

    TCP协议是TCP/IP体系中核心一个协议,该协议比起IP协议,ICMP协议,UDP协议都更复杂,因此这篇文章主要分析TCP协议在建立连接和断开连接的时候,状态转移以及报文段的内容. 下面,先放一张T ...

  10. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)

    MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...