Java写入大数据文件

Java写入大数据文件
Java写入大数据文件

/**

* 大数据排序合并

*

* @param args

*/

public static void main(String[] args) throws IOException {

// 写入文件的路径

String filePath = "D:\\456";

// 切分文件的路径

String sqlitFilePath = "D:\\456\\123";

//数据的个数

int CountNumbers=10000000;

//子文件的个数

int CountFile=10;

//精度

int countAccuracy=30*CountFile;

long startNumber=System.currentTimeMillis();

// 写入大数据文件

WriteData(filePath,CountNumbers);

System.out.println("存储完毕");

// 将大数据文件切分到另外的十个小文件中

sqlitFileDate(filePath, sqlitFilePath,CountFile);

System.out.println("文件切割完毕!");

// 把每个文件的数据进行排序

singleFileDataSort(sqlitFilePath,CountFile);

System.out.println("每个子文件排序完毕!");

//精度调整,十个文件数据进行比较整合

deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile); System.out.println("整合完毕");

long stopNumber=System.currentTimeMillis();

System.out.println("耗时"+(stopNumber-startNumber)/1000+"毫秒"); }

// 写入大数据文件

public static void WriteData(String path,int CountNumbers) throws IOException {

path = path + "\\12114.txt";

FileWriter fs = new FileWriter(path);

BufferedWriter fw=new BufferedWriter(fs);

for (int i = 0; i < CountNumbers; i++) {

fw.write(new Random().nextInt(Integer.MAX_VALUE) + "\r\n");

}

fw.close();

fs.close();

}

// 将大数据文件切分到另外的十个小文件中

public static void sqlitFileDate(String filepath, String sqlitPath, int CountFile) throws IOException {

FileWriter fs = null;

BufferedWriter fw=null;

FileReader fr = new FileReader(filepath + "\\12114.txt");

BufferedReader br = new BufferedReader(fr); // 读取获取整行数据

int i = 1;

LinkedList WriterLists=new LinkedList(); //初始化文件流对象集合 LinkedList fwLists=new LinkedList();

for (int j = 1; j <= CountFile; j++) {

//声明对象

fs = new FileWriter(sqlitPath + "\\12" + j + ".txt",false);

fw=new BufferedWriter(fs);

//将对象装入集合

WriterLists.add(fs);

fwLists.add(fw);

}

//判断是文件流中是否还有数据返回

while (br.ready()) {

int count=1;//初始化第一文件流

for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) { BufferedWriter type = (BufferedWriter) iterator.next();

if(i==count)//判断轮到第几个文件流写入数据了

{

//写入数据,跳出,进行下一个文件流,下一个数据的写入

type.write(br.readLine() + "\r\n");

break;

}

count++;

}

//判断是否到了最后一个文件流了

if (i >= CountFile) {

i = 1;

} else

i++;

}

br.close();

fr.close();

for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) { BufferedWriter object = (BufferedWriter) iterator.next();

object.close();

}

//遍历关闭所有子文件流

for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {

FileWriter object = (FileWriter) iterator.next();

object.close();

}

}

// 把每个文件的数据进行排序

public static void singleFileDataSort(String path1,int CountFile) throws IOException {

LinkedList nums = null;

for (int i = 1; i <= CountFile; i++) {

nums = new LinkedList();

String path = path1 + "\\12" + i + ".txt";

try {

FileReader fr = new FileReader(path);

BufferedReader br = new BufferedReader(fr);

while (br.ready()) {

// 将读取的单个数据加入到集合里面

nums.add(Integer.parseInt(br.readLine()));

}

// 对集合进行排序

Collections.sort(nums);

// 将排序好的数据写入源文件

numberSort(nums, path);

br.close();

fr.close();

} catch (NumberFormatException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

// 对每个文件数据进行排序,再写入源文件

public static void numberSort(LinkedList list, String path) {

try {

FileWriter fs = new FileWriter(path);

BufferedWriter fw=new BufferedWriter(fs);

for (Iterator iterator = list.iterator(); iterator.hasNext();) {

Object object = (Object) iterator.next();

fw.write(object + "\r\n");

}

fw.close();

fs.close();

} catch (IOException e) {

e.printStackTrace();

}

}

// 文件数据最终整合(精度调整)

public static void deathDataFile(String filepath, String sqlitFilePath1, int countAccuracy, int CountFile) throws IOException {

LinkedList nums = new

LinkedList(); //添加数据,进行排序

Object temp =

null; // 记录每次排序剩下的最后一个数字

boolean ispass = false;

LinkedList ispasses =

null; //记录数据文件的

状态信息

FileWriter fs = new FileWriter(filepath + "\\Sort.txt",

false); //创建文件流,以便整合的数据写入

BufferedWriter bw=new BufferedWriter(fs);

FileReader fr =

null; //声明读取

文件流

BufferedReader br =

null; //声明BufferedReader

LinkedList WriterLists = new LinkedList(); // 初始化文件流对象集合

LinkedList WriterListFile = new LinkedList();

for (int j = 1; j <= CountFile; j++) {

// 声明对象,开启所有子文件流访问所有子文件的数据

fr = new FileReader(sqlitFilePath1 + "\\12" + j + ".txt");

//开启所有BufferedReader,方便下次的整行的读取

br = new BufferedReader(fr);

// 将所有 FileReader对象装入集合

WriterListFile.add(fr);

// 将所有 BufferedReader对象装入集合

WriterLists.add(br);

}

for (;;) {

// 将十个源文件的是否有数据情况存入集合,以方便后面做判断

ispasses = new LinkedList();

// 分别读取十个源文件的单个数据

for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {

BufferedReader object = (BufferedReader) iterator.next();

Object obj = null;

while (object.ready()) {

//添加所有文件流的每次的数据

nums.add(Integer.parseInt(object.readLine().toString()));

break;

}

if (object.ready() == false)

ispasses.add("true"); //将各文件中的数据状态存入集合中 }

// 决断是否是第一次进来

if (nums.size() % countAccuracy == 0 && ispass == false) {

// 对集合进行排序

Collections.sort(nums);

// 接收最大的数据,其它的数据写入总排序文件

temp = numberSortData(nums, filepath, false, countAccuracy, bw);

//重新初始化集合

nums = new LinkedList();

// 添加上一组比较剩下的数据

nums.add(temp);

ispass = true;

// 记录源文件的数据数量,以便下次的遍历

continue;

}

if (ispass) {

if (nums.size() % countAccuracy == 1 && nums.size() > 1) {

// 对集合进行排序

Collections.sort(nums);

// 接收最大的数据,其它的数据写入总排序文件

temp = numberSortData(nums, filepath, true, countAccuracy,

bw);

nums = new LinkedList();

nums.add(temp);

continue;

}

}

// 记录下一组数据的位置

// 判断是不是十个文件都没有数据

if (ispasses.size() == CountFile) {

Collections.sort(nums);

temp = numberSortData(nums, filepath, true, countAccuracy, bw); nums = new LinkedList();

break;

}

}

bw.close();

//关闭写入流

fs.close();

//关闭所有的BufferedReader

for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {

BufferedReader object2 = (BufferedReader) iterator.next();

object2.close();

}

//关闭所有的FileReader

for (Iterator iterator = WriterListFile.iterator();

iterator.hasNext();) {

FileReader object = (FileReader) iterator.next();

object.close();

}

}

// 对数据进行排序,写入最终文件中(精度调整)

public static Object numberSortData(LinkedList list, String filePath, boolean ispass, int countAccuracy,BufferedWriter fs) {

Object temp =

0; //记录最后一个值

int tempCount =

0; //记录写入的数据位置

try {

for (Iterator iterator = list.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next();

// 判断是否是最后一个数

if (tempCount == list.size() - 1) {

// 判断集合里面不足一百個數了

if (list.size() < countAccuracy + 1 && ispass) {

temp = null;

} else {

temp = object;

break;

}

}

// 写入数据源

fs.write(object + "\r\n");

// 记录数据的下标

tempCount++;

}

} catch (IOException e) {

e.printStackTrace();

}

return temp; }

数据流图画法要求

数据流图(DFD)画法要求 一、数据流图(DFD) 1.数据流图的基本符号 数据流图由四种基本符号组成,见图5-4-1所示。 图5-4-1 数据流图的基本符号 例:图5-4-2是一个简单的数据流图,它表示数据X从源S流出,经P加工转换成Y,接着经P加工转换为Z,在加工过程中从F中读取数据。 图5-4-2数据流图举例 下面来详细讨论各基本符号的使用方法。 2.数据流

数据流由一组确定的数据组成。例如“发票”为一个数据流,它由品名、规格、单位、单价、数量等数据组成。数据流用带有名字的具有箭头的线段表示,名字称为数据流名,表示流经的数据,箭头表示流向。数据流可以从加工流向加工,也可以从加工流进、流出文件,还可以从源点流向加工或从加工流向终点。 对数据流的表示有以下约定: 对流进或流出文件的数据流不需标注名字,因为文件本身就足以说明数据流。而别的数据流则必须标出名字,名字应能反映数据流的含义。 数据流不允许同名。 两个数据流在结构上相同是允许的,但必须体现人们对数据流的不同理解。例如图5-4-3(a)中的合理领料单与领料单两个数据流,它们的结构相同,但前者增加了合理性这一信息。 两个加工之间可以有几股不同的数据流,这是由于它们的用途不同,或它们之间没有联系,或它们的流动时间不同,如图5-4-3(b)所示。 (a)(b)(c) 图5-4-3 简单数据流图举例 数据流图描述的是数据流而不是控制流。如图5-4-3 (c)中,“月末”只是为了激发加工“计算工资”,是一个控制流而不是数据流,所以应从图中删去。 3.加工处理 加工处理是对数据进行的操作,它把流入的数据流转换为流出的数据流。每个加工处理都应取一个名字表示它的含义,并规定一个编号用来标识该加工在层次分解中的位置。名字中必须包含一个动词,例如“计算”、“打

数据流图(DFD)专题讲解

软件设计师考试的下午题的第一道题,数据库系统工程师考试的下午题的第一道题都是数据流图题,而能够将这道题全部做对的考生是非常少的。根据历年的辅导和阅卷经验,发现很多考生不是因为这方面的解题能力不够,而是缺乏解这种题的方法与技巧。本文介绍一些解这种类型题的方法和技巧,希望起来抛砖引玉的效果。 一.解题当中考生表现出的特点 由于这是下午考试的第一道题,所以很多考生从考前的紧张氛围当中逐渐平静下来开始答题,头脑还比较清醒,阅读起来比较流畅,速度还可以,自我感觉不错。可偏偏这道题有很多人不能全取15分,纠其原因有以下一些特点: 1.拿卷就做,不全面了解试卷,做到心中有数。这样会导致在解题过程当中缺少一种整体概念,不能明确自己在哪些题上必需拿分(多花时间),哪些题上自己拿不了分(少花时间)。这样,在解题时目标就会明确很多。 2.速度快,读一遍题就开始动手做。 3.速度慢,用手指逐个字的去看,心想看一遍就能做出题来。 4.在阅读题目时,不打记,不前后联系起来思考。 5.边做边怀疑边修改,浪费时间。

6.缺少的数据流找不准,可去掉的文件找不出来。 7.由于缺少项目开发经验,对一些事务分析不知如何去思考。 8.盲目乐观,却忽略了答题格式,丢了不应该丢的分。 二.解题的方法与技巧 1.首先要懂得数据流图设计要略。 有时为了增加数据流图的清晰性,防止数据流的箭头线太长,减少交叉绘制数据流条数,一般在一张图上可以重复同名的数据源点、终点与数据存储文件。如某个外部实体既是数据源点又是数据汇点,可以在数据流图的不同的地方重复绘制。在绘制时应该注意以下要点: (1)自外向内,自顶向下,逐层细化,完善求精。 (2)保持父图与子图的平衡。 为了表达较为复杂问题的数据处理过程,用一个数据流图往往不够。一般按问题的层次结构进行逐步分解,并以分层的数据流图反映这种结构关系。根据层次关系一般将数据流图分为顶层数据流图、中间数据流图和底层数据流图,除顶层图外,其余分层数据流图从0开始编号。对任何一层数据流图来说,称它的上层数据流图为父图,在它的下一层的数据流图为子图。

文件流是以外存文件为输入输出对象的数据流

文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据读入。字符串流也称为内存流。 字符串流也有相应的缓冲区,开始时流缓冲区是空的。如果向字符数组存入数据,随着向流插入数据,流缓冲区中的数据不断增加,待缓冲区满了(或遇换行符),一起存入字符数组。如果是从字符数组读数据,先将字符数组中的数据送到流缓冲区,然后从缓冲区中提取数据赋给有关变量。 在字符数组中可以存放字符,也可以存放整数、浮点数以及其他类型的数据。在向字符数组存入数据之前,要先将数据从二进制形式转换为ASCII代码,然后存放在缓冲区,再从缓冲区送到字符数组。从字符数组读数据时,先将字符数组中的数据送到缓冲区,在赋给变量前要先将ASCII代码转换为二进制形式。总之,流缓冲区中的数据格式与字符数组相同。这种情况与以标准设备(键盘和显示器)为对象的输入输出是类似的,键盘和显示器都是按字符形式输入输出的设备,内存中的数据在输出到显示器之前,先要转换为ASCII码形式,并送到输出缓冲区中。从键盘输入的数据以ASCII码形式输入到输入缓冲区,在赋给变量前转换为相应变量类型的二进制形式,然后赋给变量。对于字符串流的输入输出的情况,如不清楚,可以从对标准设备的输入输出中得到启发。 文件流类有ifstream,ofstream和fstream,而字符串流类有istrstream,ostrstream和strstream。文件流类和字符串流类都是ostream,istream和iostream类的派生类,因此对它们的操作方法是基本相同的。向内存中的一个字符数组写数据就如同向文件写数据一样,但有3点不同: 1. 输出时数据不是流向外存文件,而是流向内存中的一个存储空间。输入时从内存中的存储空间读取数据。在严格的意义上 说,这不属于输入输出,称为读写比较合适。因为输入输出一般指的是在计算机内存与计算机外的文件(外部设备也视为文件)之间的数据传送。但由于C++的字符串流采用了C++的流输入输出机制,因此往往也用输入和输出来表述读写操作。 2. 字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。 3. 每个文件的最后都有一个文件结束符,表示文件的结束。而字符串流所关联的字符数组中没有相应的结束标志,用户要指定 一个特殊字符作为结束符,在向字符数组写入全部数据后要写入此字符。 字符串流类没有open成员函数,因此要在建立字符串流对象时通过给定参数来确立字符串流与字符数组的关联。即通过调用构造函数来解决此问题。建立字符串流对象的方法与含义如下。 建立输出字符串流对象 ostrstream类提供的构造函数的原型为: ostrstream::ostrstream(char *buffer,int n,int mode=ios::out); buffer是指向字符数组首元素的指针,n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同),第3个参数是可选的,默认为ios::out方式。可以用以下语句建立输出字符串流对象并与字符数组建立关联: ostrstream strout(ch1,20); 作用是建立输出字符串流对象strout,并使strout与字符数组ch1关联(通过字符串流将数据输出到字符数组ch1),流缓冲区大小为20。 建立输入字符串流对象 istrstream类提供了两个带参的构造函数,原型为: istrstream::istrstream(char *buffer); istrstream::istrstream(char *buffer,int n); buffer是指向字符数组首元素的指针,用它来初始化流对象(使流对象与字符数组建立关联)。可以用以下语句建立输入字符串流对象: istrstream strin(ch2); 作用是建立输入字符串流对象strin,将字符数组ch2中的全部数据作为输入字符串流的内容。 istrstream strin(ch2,20); 流缓冲区大小为20,因此只将字符数组ch2中的,20个字符作为输入字符串流的内容。 建立输入输出字符串流对象 strstream类提供的构造函数的原型为: strstream::strstream(char *buffer,int n,int mode); 可以用以下语句建立输入输出字符串流对象:

第8章 数据流与文件的输入输出

第8章 C++的I/O系统 8.1 知识要点 1.C++语言的“流”是指信息从外部输入设备(如键盘、磁盘等)向计算机内部(内存)输入和从内存向外部输出设备(显示器、磁盘)输出的过程。这种输入输出过程被形象地比喻为“流”。 2.C++系统中的所有I/O类均包含在iostream.h 、fstream.h、strstream.h这三个系统头文件中。 3.C++系统编译预处理时,要对# include命令进行“文件包含”处理,把该命令中指定的文件中的全部内容嵌入到该命令的位置,再编译整个C++文件,生成相应的目标代码程序。“文件包含”命令可以节省程序设计人员的重复劳动,也可以共享一些相同的程序段。 C++语言不仅提供了现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了4个类对象,它们分别是cin、cout、cerr、clong 4.用格式控制符进行格式化输入、输出 5.所谓“文件”一般是指:存储在外部介质上的数据的集合。文件可用于存入程序代码,也可用于存放数据。 6.C++语言的文件名也是由文件的主名和扩展名两部分组成,它们之间用“.”号分隔。文件的主名是由用户命名的一个有效的C++标识符,为了同其他软件系统兼容,一般不超过8个有效字符。 7.C++语言把文件看作是一个字符(字节)序列,即由一个一个字符的数据顺序组成。根据数据的组织形式可分为ASCII文件和二进制文件两种。ASCII文件又称为文本(text)文件或字符文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称为字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。 8.对文件的操作 要在程序中使用文件,就要在程序的开始包含预处理命令: #include 对一般文件(主要是磁盘文件)的操作过程是:打开,读/写,关闭。 用户对标准I/O文件不需要进行打开/关闭,标准I/O文件函数分为以下三种: (1)字符I/O函数字符输入函数getchar ( )和字符输出函数putchar ( )。 (2)字符串I/O函数字符串输入函数gets ( )和字符串输出函数puts ( )。 (3)格式化I/O函数格式化输入函数scanf ( )和格式化输出函数printf ( )。 9.对字符文件的操作 (1)字符文件 在字符文件中,以换行符‘\n’结束的一串字符称为记录;终端屏幕上输出的一行字符就相当于一条记录;交互输入时,用户通过键盘输入,以回车键结束的一串字符也是一条记录。 (2)向字符文件写入数据向字符文件写入数据有2种方法。 1)调用从ostream流类中继承来的插入操作重载函数。使用方法同交互输出过程,但这时插入操作符的第一个操作数应是某个定义过的文件对象而不是cout。 (3)从字符文件读取数据到内存变量从打开的字符文件中输入数据到内存变量有3种方法。 10.对字节文件(二进制文件)的操作 (1)字节文件 与字符文件不同的是,字节文件中存放的是可供机器直接读取的二进制代码,在打开方式中带有ios::binary选项 (2)建立二进制文件和write()成员函数一个文件被用户定义的一个文件流对象按字节方式打开后,通过文件流对象调用在ostream流类中定义的write()成员函数就能够向文件流对象所对应的文件中写入数据。 (3)访问二进制文件和read()成员函数 从字节文件读数据,就是把具有一定字节数的内容原原本本地复制到内存中由指定字符

文件与数据流

第8章文件与数据流 一、文件和流的概念 文件是指在各种驱动器上(硬盘、可移动磁盘等)永久或临时存储的数据的有序集合,是进行数据读/写操作的基本对象。文件通常具有文件名、路径、访问权限等属性。 流从概念上来说类似于单独的磁盘文件,它也是进行读/写操作的对象。流提供了连续的字节存储空间,通过流可以向后备的存储器写入数据,也可以从后备存储器读取数据。 与磁盘文件直接相关的流称为“文件流”。除此之外,还有网络流、内存流等其他类型的流。 流用于传输数据时,有两个传输方向: 读:将数据从外部数据源传输到程序中,这是读取流。 写:将数据从程序传输到外部数据源,这是写入流。

二、相关知识 1.流的创建 FileStream fs = new FileStream( "test1.dat", FileMode.Create, FileAccess.Write); 一般格式: FileStream fs = new FileStream( string path, FileMode mode, FileAccess access); 参数含义: path:指定当前FileStream对象将封装的文件的相 对路径或绝对路径。可以只是文件名(在程 序所在目录下创建或打开文件) mode:指定如何打开或创建文件,它的值必须是 FileMode枚举中的值。 access:指定如何访问文件,它的值必须是 FileAccess枚举中的值。 2)将数据写入流 fs.write(byte[] array,int offset,int count); 参数含义: array:要写入文件流的字节数组 offset:array数组中开始写入文件流的字节的下 标。 count:将要写入流的最大字节数 3)从流中读取数据 fs.ReadByte()从流中读取一个字节(返回已转换 为int的字节),并将流内的位置向前推进一个。 如果已经到达流的末尾,则返回-1。 在读之前,用canRead属性确定当前对象是否支持

数据流图试题及答案

数据流图试题及答案https://www.360docs.net/doc/0b9059026.html,work Information Technology Company.2020YEAR

【问题1】(1)费用单 (2)待租赁房屋列表 (3)看房请求 (4)变更房屋状态请求 【问题2】(5)房主信息文件 (6)租赁者信息文件 (7)房屋信息文件 (8)看房记录文件 【问题3】(1)起点:房主终点:变更房屋状态数据流名称:变更房屋状态请求 (2)起点:租赁者终点:登记租赁者信息数据流名称:租赁者信息 (3)起点:租赁者终点:安排租赁者看房数据流名称:看房请求 试题一(共15分) 阅读以下说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】 某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下: 1. 每门课程都有3到6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课 程的考试成绩。

2. 学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系统。 3. 在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效。 4. 对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给出具体处理意见之前,系统不会处理这些成绩。 5. 若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试委员会审查。 6. 在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告返还系统。 7. 根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。 现采用结构化方法对这个系统进行分析与设计,得到如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。 图1-1 顶层数据流图

关于数据流文件的一些信息

关于数据流文件的一些信息 又是一篇关于Windows,NTFS和cmd的帖子哈~貌似本板块可以改名为中国cmd联盟了~嘻嘻~废话不多说,进入正题你用过卡巴斯基么?是不是每次复制文 件都会显示这个:screen.width*0.7){this.resized=true; this.width=screen.width*0.7;this.alt='Click here to open new window';}"哈哈,这个就是今天我们要讨论的话题:NTFS数据流。NTFS分区 的数据流是一个子文件系统允许额外的数据连接到一个特别的文件中,现在的FAT文件系统格式是不支持数据流格式的。简单点说就是给在NTFS分区格式的 文件添加了一个标记。除了上面举的卡巴斯基的例子,在WinRAR添加压缩文件时,在高级选项中就有"保存文件数据流"的选项。再看看卡巴斯基对NTFS数据流干了些什么,Kaspersky把文件的验证指纹信息保存到NTFS数据流里面,如 果病毒/木马修改了这个文件,Kaspersky就会很快发现文件校检有误,这就是 为什么Kaspersky安装完毕要必须"全盘检查"一次,这样可以大幅度加快以后 的病毒检查速度!那么,怎样添加NTFS数据流呢?这就和cmd有关了CODE:[Copy to clipboard]dir C:1.txt看看1.txt里的内容,记住哦~然后CODE:[Copy to clipboard]dir c:2.txt:stream.txt怎么样,糊涂了吧~先看看 2.txt的属性:0 Bytes,打开2.txt看看有什么?什么都没了~然后在输入:CODE:[Copy to clipboard]notepad 2.txt:stream.txt看看,出来什么了? 惊讶吧~其实每个文件都可以有多个流的,用这个NTFS的特性我们可以隐藏文 件哦~而且,还可以,隐藏木马^_^实际上,流还可以不依赖于文件,下面的命令 也是合法的(先不要试,否则可能会有点麻烦):CODE:[Copy to clipboard]dir e::stream.txt这是把流绑到了文件夹上,这种流就更隐蔽了,一般情况下 要想删除流只有将其宿主删除,如果你执行了刚才的命令,并且是在根文件夹 上执行的,如果你想删除它,那就恭喜你要格盘了:),不过有现成的工具可以 使用的,这个就是:Streams v1.53 Reveal NTFS alternate streams这么样,又是sysinternal的作品哦~我要说的就说完了,下面是网上收集的关于NTFS 流的资料了Quote:NTFS上的交换数据流NTFS上的交换数据流转载:来源不详--目录--1、前言2、概念3、性质和应用-3.1创建-3.2删除-3.3检测与提取-3.4保存与传输-3.5文件隐藏-3.6运行-3.7与IIS相关4、附言5、参考文章--1、前言交换数据流(alternate data streams,以下简称ADS)也不是什么新

实验三 文件与数据流 实验报告

实验三文件与数据流实验报告 一、实验目的 1. 掌握输入输出流类的层次关系和类中的方法及输入输出流的编程方法。 2. 理解对象序列化。 二、实验要求 1. 利用InputStream(抽象类)的子类FileInputStream以及BufferedInputStream类对文件进行读入操作。BufferedInputStream相对于FileInputStream类而言增加了缓存,减少了IO 操作,在一定程序上提升了程序的性能。同理,利用OutputStream的子类FileOutputStream 和BufferedOutputStream类进行文件的输出操作。 2. 通过DataInputStream和DataOutputStream对象进行基本数据类型的写入文件和从文件读出的操作。 3. 通过ObjectInputStream和ObjectOutputStream可以直接把对象写入到文件或者从文件中读出。同时,如果要使对象能够通过这个类写入到文件中,这个类需要实现Serializable 接口。 三、实验内容 1. 将文件f1.txt的内容加密(字母’A’ 变为’C’,字母’B’ 变为字母‘D’,…,字母‘Z’ 变为’B’)后存放到f 2.txt中。读出f2.txt文件的内容,并显示解密后的内容。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileExperiment00 { public static void main(String[] args) { try { encrypt(); decrypt(); } catch (Exception e) { e.printStackTrace(); } } public static void encrypt() throws Exception { File f1 = new File("f1.txt"); File f2 = new File("f2.txt"); if (!f1.exists()) { System.out.println("文件不存在"); return; } if (!f2.exists()) {

数据流总结 文档

[分享]业务流程图/数据流图/数据字典/系统流程图 业务流程图是一种描述系统内各单位、人员之间业务关系、作业顺序和管理信息流向的图表,利用它可以帮助分析人员找出业务流程中的不合流理向,它是物理模型。 业务流程图主要是描述业务走向,比如说病人吧,病人首先要去挂号,然后在到医生那里看病开药,然后再到药房领药,然后回家。 业务流程图描述的是完整的业务流程,以业务处理过程为中心,一般没有数据的概念。 数据流程图是一种能全面地描述信息系统逻辑模型的主要工具,它可以用少数几种符号综合地反映出信息在系统中的流动、处理和存储情况,数据流程图是逻辑模型。 数据流程则是描述数据的走向,继续以病人为例,这个时候主要画的是病人挂号系统需要那些表,数据改怎么存,医生看病用到那些表,数据改怎么存等。 数据流程图进一步舍去物质要素,收集有关资料,用计算机进行信息管理,为下一步分析做好准备。 数据流图描述的是处理和数据,不重点突出流程的先后,以处理和数据流、数据存储为核心。 数据流图是描述各个子块之间如何进行数据传递:数据字典相当于数据库中的对照表,把你认识的符号和系统中的符号对应起来! 数据字典是记载整个工程的数据。如:格式,数据库中的表格中的字段名,窗口数... 系统流程图是在系统分析员在做系统构架阶段,或者说,在接触实际系统时,对未来构建的信息处理系统的一种描述。这种描述是相对简单且完全的,涉及到未来系统中使用的处理部件,如磁盘,显示器,用户输入以及处理过程的先后顺序表示等,标准的系统流程图应该有10种图元,具体的看国标吧。当然,系统流程图还可以用来表示现有的信息系统处理过程涉及的各个部件以及次序。 数据流程图是在系统分析员在系统设计阶段,对实际构建的系统分析综合后,提取逻辑模型的一个过程,它更关注于过程内数据的处理,而把具体处理数据的物理过程,物理分布忽略。实际上,最初始的数据流程图标准图元只有四个!实体,过程,数据流,数据的存储。并且,数据流的分析过程是逐步对实际过程求精的,从顶层数据流图,到分层数据流图,数据流,过程类型也逐步增加,直到形成最后的数据字典和底层数据流图。有关数据流程图的画法,可以参照软件工程教科书中的描述,可惜的是,教科书中的流程图都不符合国家标准的,不过大体的意思是一致的。 具体在项目设计的时候,上述两个表达方式都是可行的,需要视项目的类型以及规模。如果项目是一般的工程类应用MIS,基于过程的处理,则DFD的分析方法是很管用的,先设计系统流程图,在做系统数据流程图,然后是数据库设计等等等啊;如果是做开发产品级类项目,哈哈,那可就不一定很适用了。authored by fincs [原创]业务流程图与数据流程图的区别 今日突然让我写同一个方案的业务流程图和数据流程图,才想起来很多人已经把业务流程图和数据流程图混为一谈了,上网本想查一下二者的权威性解释,竟然都是作者都糊涂的文章。自己把大学学的知识回忆了一下,大概是这样的: 数据流图中的那些框框是人,或者数据的载体,如数据库,而线记载的是数据,如交货单,数据流图的作用主要是解释一个系统方案中的数据是如何流转的,由谁发出的,流转到哪里去,流转的过程中发生了什么变化。数据流图的读者一般是技术性较强的人,如程序员。数据流图更多的是用于程序设计和开发。

相关主题
相关文档
最新文档