FileStream实例重复利用要小心

直接看看源代码的错误地方吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FileStreamTest
{
    class Program
    {
        static void Main(string[] args)
        {
            String file = @"D:\temp.txt";
            FileStream fileStream;

            if (File.Exists(file))
            {
                fileStream = File.OpenRead(file);
            }
            else
            {
                fileStream = File.Create(file);
            }

            //这里对StreamWriter使用using,会导致在这个域结束之后,对fileStream的流关闭
            using (StreamWriter writer=new StreamWriter(fileStream))
            {
                writer.WriteLine("test some plain text!");
            }

            //这里再传入fileStream的文件流已经被关闭,所以会在运行时报错
            using (StreamReader reader=new StreamReader(fileStream))
            {
                Console.WriteLine(reader.ReadLine());
            }

            fileStream.Close();
            fileStream.Dispose();
        }
    }
}

  解决办法就是要重复使用流的时候,不要用using块,或者在给StreamWriter, StreamReader构造的时候传文件名,而不是之前的FileStream。

时间: 2024-10-07 06:35:33

FileStream实例重复利用要小心的相关文章

SQL群集下安装多实例并启用AlwaysOn可用性组功能

SQL群集+安装新实例+启用AlwaysOn可用性组功能 主要内容 并行安装运行SQL server 的不同版本和实例 启用AlwaysOn可用性组功能 实验环境 并行安装SQL Server 2012 +SQL Server 2016 场景1:基于SQL Server 2012搭建了Cluster01-SQL群集.   hostname IP 实例名 端口 说明 AD dc1.contoso.com 192.168.136.150       SQL SQL1.contoso.com 192.

C#中file类的应用

现在就其中几个常用的进行介绍: Create:一般使用此重载方法,File.Create (String) ,String是一个路径名,表示文件的完整路径,返回值是一个FileStream实例: Copy :将现有文件复制到新文件,有两个重载方法,File.Copy (String, String)第一个参数是源文件,第二个参数是目的文件,且不允许改写同名的文件.File.Copy (String, String, Boolean),这个允许改写同名的文件,可以设置Boolean.在执行Copy

七、数据流

流(stream)是对串行传输的数据(以字节为单位)的一种抽象表示,底层的设备可以是文件.外部设备.主存.网络套接字等. 流提供三种基本操作: 写入:将数据从内存缓冲区传输到外部源. 读取:将数据从外部源传输到内存缓冲区. 查找:重新设置流的当前位置,以便随机读写.需要注意的是,并不是所有的流类型都能够支持查找,例如,网络流没有当前位置的统一概念,因此一般不支持查找. 说明:Stream类提供有多种操作流的方法,其中Read和Write方法是Stream类及其派生类都提供的实现,可支持在字节级别

JAVA的序列化和持久化的区别与联系

持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文件中等等. 持久化是将程序数据在持久状态和瞬时状态间转换的机制. JDBC就是一种持久化机制.文件IO也是一种持久化机制. 持久化是一种对象服务,就是把内存中的对象保存到外存中,让以后能够取回.需要实现至少3个接口: void Save(object o) 把一个对象保存到外存中 Object Load

【浅析】静态工厂方法

第一次看到这个名词是在Effective的第一条中,书中先是数落了一番构造器之后提出静态工厂方法的好处如何如何.看完后觉得,虽然这个名词之前没听过,其实在开发途中用的不少,入类型转换valueOf(),单例模式中的getInstance()均有静态工厂模式的痕迹.首先是不太认可书中所说的好处,于是上网寻找资料.总结如下: 一.什么是静态工厂方法 其又叫简单工厂模式,与工厂模式不同,其是通过专门定义一个类来负责创建其他类的实例,其实例通常拥有共同父类,其普遍实现主要依靠Java的反射机制. 二.好

序列化和持久化的区别

持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文件中等等. 持久化是将程序数据在持久状态和瞬时状态间转换的机制. JDBC就是一种持久化机制.文件IO也是一种持久化机制. 持久化是一种对象服务,就是把内存中的对象保存到外存中,让以后能够取回.需要实现至少3个接口: void Save(object o) 把一个对象保存到外存中 Object Load

JAVA序列化基础知识

1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 2.什么情况下需要序列化 a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候: b)当你想用套接字在网络上传送对象的时候: c)当你想通过RMI传输对象的时候: 6.相关注意事项 a)序列化时,只对对象的状态进行

《Effective Java》笔记

Java语言支持四种类型:接口.类.数组.基本类型 类的成员由它的域field.方法.成员类.成员接口组成. 方法的签名signature由它的名称和所有参数类型组成,签名不包括它的返回类型. API元素:类.接口.构造器.成员.序列化形式. 第二章  创建和销毁对象  7条 第1条 用静态工厂方法替代构造器 1 public static Boolean valueOf(boolean b){ 2 3 return b?Boolean.TRUE : Boolean.False; 4 5 } 这

C#学习笔记 --文件和注册表操作

System.MarshalByRefObject --这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo --这是表示任何文件系统对象的基类 FileInfo和File --这些类表示文件系统上的文件 DirectoryInfo和Directory --这些类表示文件系统上的文件夹 Path --这个类包含的静态成员可以用于处理路径名 DriveInfo --它的属性和方法提供了指定驱动器的信息 Directory类和File类只包含静态方法