文档库 最新最全的文档下载
当前位置:文档库 › 第七章 文件与数据流讲稿

第七章 文件与数据流讲稿

第七章文件与数据流

文件是用来存储计算机数据的,是计算机软件的重要组成部分。在文件中的数据只是一连串的字节或字符,并没有明显的结构。Java 语言将文件看作字节或字符序列的集合。组成文件的字节或字符序列分别称为字节流或字符流。

Java.io.InputStream与Java.io.OutputStream定义了输入流与输出流的基本操作。

7.1 输入流与输出流

7.1.1 InputStream和FileInputStream

看教材:p182例程

import java.io.InputStream;

import java.io.IOException;

public class J_Echo

{

public static void mb_echo(InputStream in)

{

try

{

while (true) // 接受输入并回显

{

int i = in.read( );//从输入流读入一个字节

if (i == -1) // 输入流结束

break;

char c = (char) i;

System.out.print(c);

} // while循环结束

}

catch (IOException e)

{ System.err.println("发生异常:" + e);

//标准错误输出流,常用作输出错误信息,System.err 是java.io.PrintStream类型的变量(目前输入流对中文的支持并不十分完善,输入中文常无法正常显示)

e.printStackTrace( );

} // try-catch结构结束

System.out.println( );

} // 方法mb_echo结束

public static void main(String args[ ])

{ mb_echo(System.in);

} // 方法main结束

} // 类J_Echo结束

从标准输入中读取数据,并不是每输入一个字母就形成输入流,而是输入回车符之后才开始将一整行字符组成为输入流

InputStream和FileInputStream:因为java.io.InputStream是抽象类,不能构造实例,但是它定义了输入流的基本操作。可以构造抽象类InputStream的子类FileinputStream的实例对象,同样可以调用抽象类的方法。

例题2:

import java.io.FileInputStream;

import java.io.IOException;

public class J_EchoFile

{

public static void main(String args[ ])

{

try

{

FileInputStream f =new FileInputStream("test.txt");

int i;

int b=f.read( );

// f.read( )返回的是所读取的字符在Unicode中的值,如:当读到A是返回65,当读到末尾是返回-1.

for (i=0; b!=-1; i++)

{ System.out.print((char)b);

b=f.read( );

} // for循环结束

System.out.println( );

System.out.println("文件\"test.txt\"字节数为"+i);

f.close( );//关闭输入流,IputStream的成员方法

}

catch (IOException e)

{ System.err.println("发生异常:" + e);

//标准错误输出流

e.printStackTrace( );

/*当try语句中出现异常是时,会执行catch中的语句,java运行

时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象,e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法。e.printStackTrace() ;方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。*/ } // try-catch结构结束

} // 方法main结束

} // 类J_EchoFile结束

对文件内容进行操作的基本步骤如下:

(1)创建该文件所对应的输入输出流或读写器的实例对象,以获得相关的系统资源;

(2)对文件进行读(输入)写(输出)操作;

(3)调用close()成员方法,关闭文件,以释放所占用的系统资源。案例3 字节流文件访问

【案例简介】使用字节流读取一个文本文件,并显示其内容。

【案例目的】掌握字节流的使用方法。

【代码分析】

import java.io.FileInputStream;

import java.io.IOException;

public class ReadFile {

public static void main(String[] args)

{

try { // 创建文件输入流对象

FileInputStream is = new FileInputStream("Hello.java");

int n = 712; // 设定读取的字节数

byte buffer[] = new byte[n]; // 读取输入流

while ((is.read(buffer, 0, n) != -1) && (n > 0)) //将字节读入参数给定的字节数组,返回值是实际读入的字节数或-1(遇到了流结束)。后两个参数分别给出读入的起始位置和读入的最大字节数。

{ System.out.print(new String(buffer));

}

System.out.println();

is.close();// 关闭输入流

}

catch (IOException ioe)

{

System.out.println(ioe);

}

catch (Exception e)

{

System.out.println(e);

}

}

}

【相关知识】

https://www.wendangku.net/doc/164619848.html,ng.Object

|

+--java.io.InputStream(抽象类)

|

+--java.io. FileinputStream

|

+--java.io.PrintStream

从图中可以看出,InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

7.1.2 OutputStream 和FileOutputStream

java.io.OutputStream是用来处理输出流的类(抽象类)。它定义了输出流的各种基本操作,如输出数据(write)和关闭输出流等。下面给出输出流的应用例程:

import java.io.IOException;

import java.io.OutputStream;

public class J_Write

{

public static void mb_write(OutputStream out)

{

String s = "输出流例程";

byte[ ] b = s.getBytes( );

try

{

out.write(b);

out.flush( );

}

catch (IOException e)

{

System.err.println("发生异常:" + e);

e.printStackTrace( );

} // try-catch结构结束

} // 方法mb_write结束

public static void main(String args[ ])

{

mb_write(System.out);

} // 方法main结束

} // 类J_Write结束

抽象类java.io.OutputStream的成员方法:

Public void write(byte[] b) throws IOException

将字节数组b的各个字节写入到当前文件中。(调用write方法之后,常常采用缓存机制:即不将数据直接输出或写入文件,而是暂时保存在缓存中)

抽象类java.io.OutputStream的成员方法:

Public void write(int b) throws IOException

将b低8位组成的1个字节写入到当前文件中。

在调用抽象类java.io.OutputStream的write成员方法时,常常会调用抽象类java.io.OutputStream的强制输出成员方法:

Public void flush() throws IOException

调用成员方法flush()就是强制立即输出数据。

Public void close() throws IOException:

关闭输出流,并释放与该输出流相关的系统资源。FileOutputStream是OutputStream(抽象类)的子类,用于创建实

例对象。可以调用相应的write成员方法将数据写入文件,基本步骤:(1)创建java.io.FileOutputStream的实例对象,以获得相关的文件资源;

(2)通过java.io.FileOutputStream的write成员方法将数据写入文件,在这中间还可通过flush()成员方法强制输出;

(3)最后调用java.io.FileOutputStream的close成员方法关闭文件,以释放占用的系统资源。

例程:“将字符串写入到文件out.txt”

import java.io.FileOutputStream;

import java.io.IOException;

public class J_WriteFile

{

public static void main(String args[ ])

{

String s = "文件输出流例程";

byte[ ] b = s.getBytes( );

try

{

FileOutputStream f = new FileOutputStream("out.txt");

f.write(b);

f.flush( );

f.close( );

}

catch (IOException e)

{

System.err.println("发生异常:" + e);

e.printStackTrace( );

} // try-catch结构结束

} // 方法main结束

} // 类J_WriteFile结束

7.1.3 PrintStream

?类 java.io.PrintStream 是类FilterOutputStream的子类?https://www.wendangku.net/doc/164619848.html,ng.Object

? |

? +--java.io.OutputStream

? |

? +--java.io.FilterOutputStream

? |

? +--java.io.PrintStream

类java.io.PrintStream是非常重要的输出流类。

标准输出System.out是java.io.PrintStream类型的变量。java.io.PrintStream特性:

(1)包含可以用来直接输出多种类型数据的不同成员方法;

(2)它的大部分成员方法不抛出异常;

(3)可以选择是否采用自动强制输出(flush)特性。

创建类java.io.PrintStream的实例对象,可以通过java.io.PrintStream的构造方法:

(1)p ublic PrintStream(outputstream out)

(2)p ublic PrintStream(outputstream out,boolean autoflush) (3)p ublic PrintStream(String fileName) throws FileNotFoundException

参数out或fileName指定输出文件;参数autoflush指定是否采用自动强制输出特性。如果构造方法不含参数autoflush,则不采用自动强制输出特性。

类java.io.PrintStream提供多种数据输出成员方法:

Public void write(int b)

将参数b低8位组成的1个字节写入到当前文件中

类java.io.PrintStream的成员方法:

Public Printstream append(char c)

Public void print(boolean b)

Public void print(char c)

Public void print(int i)

Public void print(long l)

Public void print(float f)

Public void print(double d)

Public void print(char [] s)

Public void print(String s)

Public void print(Object obj)

将参数指定的数据写入到当前文件中。

类java.io.PrintStream的成员方法:

Public void println(boolean x)

Public void println(char x)

Public void println(int x)

Public void println(long x)

Public void println(float x)

Public void println(double x)

Public void println(char [] x)

Public void println(String x)

Public void println(Object x)

将参数指定的数据以及换行符写入到当前文件中。

类java.io.PrintStream的成员方法:

Public void println()

将换行符写入到当前文件中。

printStream f=System.out变换类型见表7.1

类java.io.PrintStream的成员方法:(p190)格式类型输出Public printstream format(String format,object … args) Public printstream printf(String format,object … args)

采用格式字符串指定数据,并将数据写入到当前文件中。

其中参数format指定格式字符串,其它参数指定在格式字符串中对应的具体数据。

“格式字符串”是嵌入若干格式的字符串,格式的基本形式为:

%[参数引用$][字符集类型][宽度][精度]变换类型

7.1.4带缓存的输入流和输出流

带缓存的输入流和输出流对应的类是

java.io.BufferedInputStream和java.io.BufferedOutputStream 当创建java.io.BufferedInputStream

或java.io.BufferedOutputStream的实例对象时,均会在内存中开辟一个字节数组的存储单元(一般成为缓存),用来存放在数据流中的数据。这样借助缓存可以将一个较大的数据块读入内存中,或将在内存中较大的数据块一次写入指定的文件中,从而达到提高读写效率的目的。

创建带缓存的输入流(bufferedInputStream)的实例对象,可以通过java.io.BufferedInputStream的构造方法:

(1)public BufferedInputStream(InputStream in)

(2)public BufferedInputStream(InputStream in,int size)

参数in指定输入流,通常是java.io.FileInputStream实例对象,size缓存大小。

创建带缓存的输出流(bufferedOutputStream)的实例对象,可以通过java.io.BufferedOutputStream的构造方法:

(1)public BufferedOutputStream(OutputStream out)

(2)public BufferedOutputStream(OutputStream out,int size)参数out指定输出流,通常是java.io.FileOutputStream实例对象java.io.BufferedInputStream兼容抽象类java.io.InputStream的成员方法read和close读取数据和关闭输入流; java.io.BufferedOutputStream兼容抽象类java.io.OutputStream的成员方法write、flush和close数据的存储、强制输出和关闭输出流操作。

例程:p193

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.util.Date;

public class J_BufferedInputStream

{

private static String m_fileName = "J_BufferedInputStream.class";

public static void main(String args[ ])

{

try

{

int i, ch;

i = 0;

Date d1= new Date( );

FileInputStream f = new FileInputStream(m_fileName);

while ((ch=f.read( )) != -1) // read entire file i++;

f.close( );

Date d2= new Date( );

long t = d2.getTime( ) - d1.getTime( ); // 单位(毫秒)

System.out.printf("读取文件%1$s(共%2$d字

节)%n",

m_fileName, i);

System.out.printf("不带缓存的方法需要%1$d毫秒%n", t);

i = 0;

d1= new Date( );

f = new FileInputStream(m_fileName);

BufferedInputStream fb = new BufferedInputStream(f);

while ((ch=fb.read( )) != -1) // read entire file i++;

fb.close( );

d2= new Date( );

t = d2.getTime( ) - d1.getTime( ); // 单位(毫秒) System.out.printf("带缓存的方法需要%1$d毫秒%n", t);

}

catch (Exception e)

{

System.err.println("发生异常:" + e);

e.printStackTrace( );

} // try-catch结构结束

} // 方法main结束

} // 类J_BufferedInputStream结束

7.15标准输入输出流的重定向

JAVA中,默认的输入是键盘,输出为显示器,而偶尔我们需要特定的输入流或输出流。标准输入流、输出流和标准错误输出流的重定向就是将这些标准输入流、输出流和标准错误输出流分别与指定的文件建立对应关系:当需要输入数据时,数据将从文件中读取;当需要输出数据时,数据将写入文件。

类https://www.wendangku.net/doc/164619848.html,ng.System提供了这些成员方法。

Public static void setIn(InputStream in)

将标准输入流重定向为参数in指定的输入流。

Public static void setOut(PrintStream out)

将标准输出流重定向为参数out指定的输出流。

Public static void setErr(PrintStream err)

将标准错误输出流重定向为参数err指定的输出流。

重定向例程:p196

7.2随机访问文件

随机读写文件

案例:一个简单的随机文件读写程序

【案例简介】

本案例将演示如何随机读写文件。

【案例目的】

学习读写随机文件的方法。

【技术要点】

构造一个RandomAccessFile对象,利用该对象的方法定位位置和读写数据。

【代码分析】

import java.io.*;

import https://www.wendangku.net/doc/164619848.html,ng.*;

import java.util.*;//实用工具类库包

class RandomAFile{

public static void main(String args[]){

try{

RandomAccessFile

raf=newRandomAccessFile("random.txt","rw");

//创建随机访问的实例对象

raf.writeInt(10);

raf.writeUTF("Wang Jun");

raf.writeBoolean(true);

raf.writeFloat(78.9f);

long position=raf.getFilePointer();

//用于得到当前的文件指针。

raf.writeInt(2);

raf.writeUTF("Zhao Lei");

raf.writeBoolean(false);

raf.writeFloat(98.10f);

raf.seek(0); //回到开始位置

raf.writeInt(1); //重写第一个数据

raf.seek(position); //回到第二组数据开始位置

raf.skipBytes(4); //向前再移动4个字节

raf.writeUTF("Zhao Wei"); //重写数据;

raf.close();

raf=new RandomAccessFile("random.txt","r"); //以读的方式打开

raf.seek(position); //先读第二组数据

System.out.println(raf.readInt());

System.out.println(raf.readUTF());

System.out.println(raf.readFloat());

System.out.println(raf.readBoolean());

raf.seek(0);

System.out.println(raf.readInt());

System.out.println(raf.readUTF());

System.out.println(raf.readFloat());

System.out.println(raf.readBoolean());

raf.close();

}catch(Exception e){e.printStackTrace();}

}

}

【应用扩展】

随机访问文件流实现了DataInput和DataOutput两个接口,因此可以按数据类型读写数据。

在构造RandomAccessFile对象时,如果文件不存在具体出现的异常为FileNotFoundException,读写数据数据时如发生错误,具体出现的异常为IOException。

【相关知识】

对于InputStream 和OutputStream 来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。

随机访问文件则允许对文件内容进行随机读/写。在java中,类RandomAccessFile 提供了随机访问文件的方法。1.RandomAccessFile类

RandomAccessFile类提供了随机访问文件的方法。

类RandomAccessFile的声明为:

public class RandomAccessFile extends Object implements DataInput, DataOutput

接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean()、readInt()、readLine()、readFully()等。

接口DataOutput 中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar()、writeDouble()、write()等。

2. RandomAccessFile类中的方法

(1)构造方法

RandomAccessFile(String name,String mode):name是文件名,mode 是打开方式,例如"r"表示只读,"rw"表示可读写。RandomAccessFile(File file,String mode):file是文件对象。(2)文件指针的操作

long getFilePointer():用于得到当前的文件指针。

void seek(long pos):用于移动文件指针到指定的位置。

int skipBytes(int n):使文件指针向前移动指定的n个字节。

例程:p199

import java.io.IOException;

import java.io.RandomAccessFile;

public class J_RandomAccessFile

{

public static void main(String args[ ])

{

try

{

RandomAccessFile f=new RandomAccessFile("test.txt", "rw");

int i;

double d;

for (i=0; i<10; i++)

f.writeDouble(Math.PI*i);

f.seek(16);

f.writeDouble(0);

f.seek(0);

for (i=0; i < 10; i++)

{

d=f.readDouble( );

System.out.println("[" + i + "]: " + d);

} // for循环结束

f.close( );

}

catch (IOException e)

{

System.err.println("发生异常:" + e);

e.printStackTrace( );

} // try-catch结构结束

} // 方法main结束

} // 类J_RandomAccessFile结束

应用类RandomAccessFile编写程序,实现将两个磁盘文件"input1.txt"和"input2.txt"中的内容合并,并显示在屏幕上。import java.io.*;

public class Ex{

public static void main(String args[]){

String s="";

try{ RandomAccessFile f1=new RandomAccessFile("c:/input1.txt","rw");

RandomAccessFile f2=new RandomAccessFile("c:/input2.txt","rw");

s=f1.readLine()+f2.readLine();

char c[]=s.toCharArray();

for(int i=0;i

System.out.print(c[i]);

System.out.println(); }

catch(Exception e){}

数据流图画法要求

数据流图(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.wendangku.net/doc/164619848.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 [原创]业务流程图与数据流程图的区别 今日突然让我写同一个方案的业务流程图和数据流程图,才想起来很多人已经把业务流程图和数据流程图混为一谈了,上网本想查一下二者的权威性解释,竟然都是作者都糊涂的文章。自己把大学学的知识回忆了一下,大概是这样的: 数据流图中的那些框框是人,或者数据的载体,如数据库,而线记载的是数据,如交货单,数据流图的作用主要是解释一个系统方案中的数据是如何流转的,由谁发出的,流转到哪里去,流转的过程中发生了什么变化。数据流图的读者一般是技术性较强的人,如程序员。数据流图更多的是用于程序设计和开发。

相关文档
相关文档 最新文档