unity C# IO 分段写入与读取

本人测试的一个压缩文件, 为3.31G下面提供了三种方法分别对文件进行分段操作,功能不同,坑也不同。
第一种读取的方法代码比较少,但是确实最好的一种方法.因为我们用的byte数组, 数组是有长度的,而且长度是整数,整数是有界限的,所以在读取和操作的时候就会造成越界的情况。

第一种方法:在读取的时候采用分次读入和分次读取,这样的话,只要合理的划分分段写入得大小就不会有问题第二种方法:在读取的时候, 因为是直接读取,所以文件不能太大(大概2G),太大就读取不了第三种方法:其实跟第二种一样,只不过只是写入byte[];这种的方法在程序中也有可能会用到,所以也就研究了一下。比如网络传输,一个大文件会分几次发送,但是每次发送接受到的都是字节,这时候就需要用到这个方法了
  1 using System.Collections;
  2 using System.Collections.Generic;
  3 using UnityEngine;
  4 using System.IO;
  5
  6 public class IOTest : MonoBehaviour
  7 {
  8     public static int segWriteSize
  9     {
 10         get
 11         {
 12             return 1024 * 1024 * 5;   //每次五兆
 13         }
 14     }
 15
 16     private void Start()
 17     {
 18         string path = @"E:\1.zip";
 19         string outpath = @"E:\all.zip";
 20         StartCoroutine(SegWrite(path, outpath));
 21
 22         //byte[] bs = File.ReadAllBytes(path);
 23         //Debug.Log(bs.Length);
 24         //StartCoroutine(SegWrite(bs, outpath));
 25
 26
 27         //StartCoroutine(SegRead(path, outpath));
 28     }
 29
 30     public static IEnumerator SegRead(string filepath, string outpath)  //第一种
 31     {
 32         FileStream fswrite = File.OpenWrite(outpath);
 33         FileStream fsread = new FileStream(filepath, FileMode.Open, FileAccess.Read);
 34         BinaryReader r = new BinaryReader(fsread);
 35         byte[] bs = r.ReadBytes(segWriteSize);
 36         while(bs.Length != 0)
 37         {
 38             fswrite.Write(bs, 0, bs.Length);
 39             fswrite.Flush();
 40             yield return null;
 41             Debug.Log("write.......");
 42             bs = r.ReadBytes(segWriteSize);
 43         }
 44         fswrite.Close();
 45
 46     }
 47
 48     public static IEnumerator SegWrite(string filepath, string outpath)  //分段写入 第2种
 49     {
 50         FileStream fsRead = File.OpenRead(filepath);  //打开
 51         byte[] buffer = new byte[segWriteSize];  //一次分段写入的大小
 52         int segsize = buffer.Length;   //分段的长度
 53         int copied = 0;   //标记长度
 54         int filesize = 0;   //一次写入的文件大小
 55
 56         FileStream fswrite = File.OpenWrite(outpath);
 57         if (segsize < (int)fsRead.Length)    //如果文件比分段写入的大,说明需要分段
 58         {
 59             while (copied + segsize <= (int)fsRead.Length)  //分段写入
 60             {
 61                 yield return null;
 62                 filesize = fsRead.Read(buffer, 0, buffer.Length);  //一次读入的大小
 63                 fsRead.Flush();
 64                 fswrite.Write(buffer, 0, buffer.Length);  //分次写入
 65                 fswrite.Flush();
 66                 copied += filesize;
 67                 Debug.Log("write........");
 68             }  //剩下的在写入
 69             int left = (int)fsRead.Length - copied;
 70             fsRead.Read(buffer, 0, left);
 71             fsRead.Flush();
 72             fswrite.Write(buffer, 0, left);
 73             fswrite.Flush();
 74             Debug.Log("write........");
 75         }
 76         else
 77         {
 78             buffer = new byte[(int)fsRead.Length];
 79             fsRead.Read(buffer, 0, buffer.Length);
 80             fsRead.Flush();
 81             fswrite.Write(buffer, 0, buffer.Length);
 82             fswrite.Flush();
 83         }
 84         fsRead.Close();
 85         fsRead.Dispose();
 86         fswrite.Close();
 87         fswrite.Dispose();
 88         Debug.Log("write finish");
 89     }
 90
 91     public static IEnumerator SegWrite(byte[] bs, string outpath)   //第三种
 92     {
 93         byte[] buffer = new byte[segWriteSize];  //一次分段写入的大小
 94         int segsize = buffer.Length;   //分段的长度
 95         int copied = 0;   //标记长度
 96
 97         FileStream fswrite = File.OpenWrite(outpath);
 98         if (segsize < bs.Length)    //如果文件比分段写入的大,说明需要分段
 99         {
100             while (copied + segsize <= bs.Length)
101             {
102                 buffer = new byte[segWriteSize];
103                 for (int i = 0; i < segWriteSize; i++)
104                 {
105                     int index = copied + i;
106                     buffer[i] = bs[index];
107                 }
108                 copied += segWriteSize;
109                 fswrite.Write(buffer, 0, buffer.Length);  //分次写入
110                 fswrite.Flush();
111                 yield return null;
112                 Debug.Log("write........");
113             }
114             int left = bs.Length - copied;
115             buffer = new byte[left];
116             for (int i = 0; i < left; i++)
117             {
118                 int index = copied + i;
119                 buffer[i] = bs[index];
120             }
121             copied += left;
122             Debug.Log(copied);
123             fswrite.Write(buffer, 0, left);
124             fswrite.Flush();
125             yield return null;
126             Debug.Log("write........");
127         }
128         else
129         {
130             fswrite.Write(bs, 0, bs.Length);
131             fswrite.Flush();
132         }
133
134         fswrite.Close();
135         fswrite.Dispose();
136         Debug.Log("write finish");
137     }
138
139
140 }
时间: 2024-11-11 06:17:23

unity C# IO 分段写入与读取的相关文章

java一行一行写入或读取数据

        假如E:/phsftp/evdokey目录下有个evdokey_201103221556.txt文件, 现在对evdokey_201103221556.txt文件进行写入或读取操作,并解决写入或读取出现的乱码问题. /**     * 一行一行读取文件,适合字符读取,若读取中文字符时会出现乱码     *      * 流的关闭顺序:先打开的后关,后打开的先关,     *       否则有可能出现java.io.IOException: Stream closed异常    

手机的sd卡的写入和读取数据的方

我们要实现的是:往输入框输入数据,点击一个写入按钮,将输入框内的数据写入到sd卡上,在点击读取按钮,则将sd卡上只等的文件名称内的数据显示到一个textView上. 首先,看一下XML文件,很简单,只有两个按钮,一个输入框,和一个文本控件: 保存的数据可以到mnt/sdcard/下查看 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:

【Java编程】写入、读取、遍历Properties文件

在Java开发中通常我们会存储配置参数信息到属性文件,这样的属性文件可以是拥有键值对的属性文件,也可以是XML文件,关于XML文件的操作,请参考博文[Java编程]DOM XML Parser 解析.遍历.创建XML.在该篇博文中,我将展示如何向属性文件写入键值对,如何读取属性文件中的键值对,如何遍历属性文件. 1.向属性文件中写入键值对 特别注意: Properties类调用setProperty方法将键值对保存到内存中,此时可以通过getProperty方法读取,propertyNames(

java处理Excel文件---excel文件的创建,删除,写入,读取

这篇文章的代码是我封装的excel处理类,包含推断excel是否存在,表格索引是否存在,创建excel文件,删除excel文件,往excel中写入信息,从excel中读取数据. 尤其在写入与读取两个方法中,我採用了java反射机制去实现,以object对象作为參数就可以.代码自己主动解析该实体类的属性与方法.代码重用性高. 代码另一些须要改进和扩展的地方.大家能够依据实际情况进行简单改动. 上代码,首先是我封装的这个类(採用的是POI包): package module.system.commo

Java笔记--java一行一行写入或读取数据

转自 Ruthless java一行一行写入或读取数据 链接:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/phsftp/evdokey目录下有个evdokey_201103221556.txt文件, 现在对evdokey_201103221556.txt文件进行写入或读取操作,并解决写入或读取出现的乱码问题. 文件内容如: zhangsan,23,福建 lisi,30,上海 wangwu,43,北京 l

iOS中plist的创建,数据写入与读取

iOS中plist的创建,数据写入与读取功能创建一个test.plist文件,textInput作为输入,displayLabel作为显示,有一个按钮来触发保持程序triggerStorage: -(void)triggerStorage { displayLabel.text = textInput.text; NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)

如何写入和读取注册表

参考下面代码,写入和读取注册表 1 string registrySubKey = @"SOFTWARE\RegistryTest"; 2 RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(registrySubKey, true); 3 if (registryKey == null)//没有则创建路径 4 { 5 Registry.LocalMachine.CreateSubKey(registrySubKey);

蜗牛爱课- iOS中plist的创建,数据写入与读取

iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);    NSString *path=[paths    objectAtIndex:0];      NSString *filename=[path stringByAppendin

NSUserDefaults写入和读取自定义的对象

需要写入的对象必须实现NSCoding protocol Person Class Person.h #import <Foundation/Foundation.h> #import "Face.h" @interface Person : NSObject <NSCoding> @property (nonatomic, strong) NSString *personId; @property (nonatomic, strong) NSString *n