第九天
来源:互联网 发布:linux驱动框架 编辑:程序博客网 时间:2024/04/29 06:14
传智博客。传智博客老师今天又开始教文件操作多线程,讲了,
递归加载目录树、文件流读写操、大文件拷贝、Using的本质、文件流补充、序列化与反序列化
文件操作多线程
被using管理的对象 一处using块 就会自动调用这个对象的Dispose方法
如果类的对象要被using管理 这个对象的类必须实现IDisposeable接口.
using的本质其实就是1个try-finally 将using中的代码生成在了try中, 调用该对象的Dispose方法写在了finally中
所以Dispose方法无论如何都会调用.
2.序列化
需要将对象的状态保存起来
序列化: 将对象的状态持久化到某一种设备上(磁盘)
要将类标记为Serializable 这个类的对象才可以被序列化
以二进制的方式序列化,而不是文本文档.
反序列化.将之前序列化的文件还原为对象
1.将指定路径的文本文件内容,读取到文本框中。
private void button1_Click(object sender,EvenArgs e)
{
//1. 创建1个文件流对象. 并给这个文件流对象指定操作的文件(路径) 还有指定操作的方式
FileStream stream = new FileStream(@"H:\1.txt",FileMode.Open);
//2. 准备1个byte数组 以供文件流对象读取数据并放到这个数组里面.
byte[] buffer = new byte[1024*1024];
//3. 调用文件流的读数据方法 将读出来的字节放入到buffer数组中.
stream.Read(buffer,0,buffer.Length);
//4. 将字节数组以指定的编码转换为字符串
string content = Encoding.Default.GetString(buffer);
textBox1.text = content;
//5.关闭文件流
stream.Dispose();
}
2.将文本框的内容读取到保存的文本中。
private void button2_Click(object sender,EvenArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
DialogResult res = sfd.ShowDialog(); //DialogResult 定义一个通用对话框返回值的变量
if(res == System.Windows.Forms.FialogResult.OK)
{
//1. 创建文件流对象
FileStream stream = new FileStream(sfd.FileName,FileMode.Create);
//2. 调用文件流写入的方法.
string content =textBox1.Text;
//3. 将字符串以指定的编码转换为字节数组.(二进制)
byte[] buffer =Encoding.UTF8.GetBytes(content);
//调用文件流对象的写入方法
stream.Write(buffer,0,buffer.Length);
stream.Dispose();
}
}
3.将一个文件里的内容拷贝到另一个文件里。
private void button3_Click(object sender,EvenArgs e)
{
//1. 准备个用于读数据的文件流
using(FileStream streamReader = new FileStream(@"H:\1.txt",FileMode.Open));
{
//2. 准备1个用于写数据的文件流
using(FileStream streamWriter = new FileStream(@"H:\2.txt",FileMode.Create));
{
//3. 准备1个字节数组用于保存读出来的数据
byte[] data = new byte[1024*1024]
//4. 用读的文件流将数据读出来 放到字节数组中.
int length = 0;
do
{
length = streamReader.Read(data,0,data.Length)
streamWrite.Write(data,0,length);
}while(length>=data.Length);
//5. 调用写的文件流将字节数组写入.
//6. 关闭文件流
MessageBox.Show("操作成功");
}
}
}
4.
//被using管理的对象 一处using块 就会自动调用这个对象的Dispose方法
//如果类的对象要被using管理 这个对象的类必须IDisposeable接口.
//using的本质其实就是1个try-finally 将using中的代码生成在了try中, 调用该对象的Dispose方法写在了finally中
//所以Dispose方法无论如何都会调用.
private void button4_Click(objectt sender,EvenArgs e)
{
byte[] buffer = new byte[1024*1024];
stream.Read(buffer,0,buffer,Length);
stream.Dispose();
}
5.序列化和反序列化(二级制)
[Serializable]//指定一个类,可以被序列化,此类不能被继承。
class Person
{
public int Age{get;set;}
public string Name{ get;set;}
}
class Program
{
static void Main(string[] args)
{
Create();
Read();
}
public void Create()
{
Person p = new Person(){Age = 12,Name="rose"};
System.Runtime.Serialization.Formatters.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.BinaryFormatter();
using(FileStream fs = new FileStream("se.bin",FileMode.Create))
{
bf.Serialize(fs,p);
}
}
public void Read()
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
using(FileStream fs = new FileStream("se.bin",FileMode.Open))
{
object obj = bf.Deserialize(fs);
Person p = obj as Person;
Console.WriteLine(p.Name + ":" +p.Age);
}
}
}
6.建立目录
namespace A
{
public partial class Form1 : Form
{
string path = @"H:\1";
public Form1()//设计器支持所需要的方法
{
InitializeComponent();
}
private void Form1_Load(object sender,EventArgs e)
{
LoadTree(path,null);
}
private void LoadTree(string path,TreeNode node)
{
//判断1下node是不是null 如果是null代表要将指定目录下的所有的子目录直接加到TreeView下
//将指定路径下的所有的子目录
string[] dirs = Directory.GetDirectories(path);
//遍历
foreach(string dir in dirs)
{
TreeNode node1 = new TreeNode(Path.GetFileName(dir));
if(node==null)
{
// 如果是null代表要将指定目录下的所有的子目录直接加到TreeView下
TreeView .Nodes.Add(node1);
}
else//如果不是null 就将节点加载到传进来的节点下面.
{
node.Nodes.Add(node1);
}
if(Directory.GetDirectories(dir).Length>0)//判断当前遍历到的目录下面是否还有子目录.
{
//如果有 递归调用将当前遍历到的目录下的子目录加载到当前节点下.
node.Nodes.Add(node1);
}
}
}
}
}
- 第九天
- 第九天
- 第九天
- 第九天
- 第九天
- 第九天
- 第九天
- 第九天!
- 第九天
- 第九天
- 第九天
- 世界杯第九天
- IBM实习第九天
- 第九天:听课笔记
- 第九天:总结
- 第九天总结0401
- 5.18 第九天 瓶颈
- 实习日记->第九天
- 新的一年,新的开始
- CSS解读之alpha通道与opacity属性的区别
- 第八天
- unity3d Android客户端与PC服务器实现Socket通信(wifi)
- 算法中的栈
- 第九天
- Jos-lab1(中)
- 算法中的队列
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- unity 安卓真机调试
- Mahout笔记--代码分析
- JQuery设置iframe的src值
- 盘点2013:21款最优秀的开源数据库
- iOS多线程编程之NSThread的使用