输入输出流和文件
流式输入输出与文件处理

System类中提供了如下方法重新设置标准流对象: • static void setIn(InputStream in) :重新定义标准输入流 • static void setErr(PrintStream err) :重新定义标准错误输出 • static void setOut(PrintStream out) :重新定义标准输出
InputStreamReader InputStream 将面向字节的输入流类Reader的主要子类及说明(续)
FileReader
文件对象或字符串表 文件作为输入源 示的文件名
PipedReader StringReader
PipedWriter的对象 字符串
与另一输出管道相连, 读取另一管道写入的 字符
DataInputStream in=new DataInputStream(file); try { while(true) { int n1=in.readInt(); int n2=in.readInt(); System.out.println(n1+","+n2); } } catch (EOFException e) { in.close();} } catch (IOException e) { } }}
public static void main(String args[]) { int number=0; final int size=Integer.parseInt(args[1]);
byte[] b = new byte[size];
try { FileInputStream infile = new
C语言对文件的输入输出

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以用二进制形式存储。
内存中存储形式 00000000 00000000 00100111 00010000
ASCII形式
00110001 00110000 00110000 00110000 00110000
(1)
(0)
(0)
(0)
其实,带b和不带b只有一个区别,即对换行的处理。由于在C语言用一个′\n′即可实现换行,而在Windows系统中为
实现换行必须要用 “回车”和“换行”两个字符,即′\r′和′\n′。因此,如果使用的是文本文件并且用“w”方式打开,在向文
件输出时,遇到换行符′\n′时,系统就把它转换为′\r′和′\n′两个字符,否则在Windows系统中查看文件时,各行连成
第10章
C语言对文件的输入输出
C文件的有关基本知识
什么是文件
文件有不同的类型,在程序设计中,主要用到两种文件: (1) 程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件 的内容是程序代码。 (2) 数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘 (或其他外部设备)的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据、货物交易的数 据等。
typedef struct
{ short level;
//缓冲区“满”或“空”的程度
unsigned flags;
//文件状态标志
char fd;
//文件描述符
unsigned char hold; //如缓冲区无内容不读取字符
short bsize;
C语言中的输入输出流及其应用

C语言中的输入输出流及其应用C语言是一种广泛应用于软件开发领域的编程语言,其提供了丰富的输入输出(I/O)函数和流(stream)的概念,以帮助开发者实现与用户或环境的交互。
本文将详细介绍C语言中的输入输出流及其应用。
一、输入流输入流用于接收外部数据供程序使用。
C语言提供了丰富的输入函数,包括:1. scanf函数:scanf函数用于从标准输入流(键盘)读取数据,并根据格式化字符串的指定将数据存储到指定的变量中。
例如:```cint age;scanf("%d", &age);```上述代码将从标准输入流读取一个整数,并将其存储到变量age中。
2. fgets函数:fgets函数用于从文件流或标准输入流中读取一行字符串并存储到指定的字符数组中。
例如:```cchar name[100];fgets(name, sizeof(name), stdin);```上述代码将从标准输入流读取一行字符串,并将其存储到字符数组name中。
二、输出流输出流用于向外部输出数据。
C语言提供了多种输出函数,包括:1. printf函数:printf函数用于向标准输出流(屏幕)输出格式化的数据。
例如:```cint num = 10;printf("The number is: %d\n", num);```上述代码将输出"The number is: 10"。
2. fputs函数:fputs函数用于向文件流或标准输出流中输出字符串。
例如:```cchar message[] = "Hello, world!";fputs(message, stdout);```上述代码将字符串"Hello, world!"输出到标准输出流。
三、文件流除了标准输入输出流外,C语言还支持文件流,用于读写文件。
文件流的操作需要使用文件指针,并且需要注意文件的打开和关闭。
基于Java文件输入输出流实现文件上传下载功能

基于Java⽂件输⼊输出流实现⽂件上传下载功能本⽂为⼤家分享了Java实现⽂件上传下载功能的具体代码,供⼤家参考,具体内容如下前端通过form表单的enctype属性,将数据传递⽅式修改为⼆进制”流“的形式,服务端(servlet)通过 getInputStream() 获取流信息,运⽤java I/O 流的基础操作将流写⼊到⼀个服务端临时创建的⽂件temp中,然后再次利⽤⽂件基本操作,读取并截取临时⽂件内容,根据其中信息创建相应的⽂件,将读取出来的具体信息写⼊,下载时,根据提交的⽂件名称,找到服务器端相应的⽂件,然后根据输出流outStream输出到页⾯,同时将servlet的响应类型和响应头进⾏设置。
具体传输流程如下图:流信息的部分为:具体代码如下:前端代码:<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title><script src="Js/jquery.js"></script></head><body><form action="FileUpServlet" method="post" enctype="multipart/form-data"><table><tr><td>请选择上传⽂件:</td><td><input id="myfile" name="myfile" type="file" value="" /></td><td><input type="submit" value="上传"></td></tr><tr><td>${info}</td></tr></table></form>⽂件下载:<a href="FileLoadownServlet?filename=${filename}">${filename}</a></body></html>上传servlet部分(核⼼)@WebServlet("/FileUpServlet")public class FileUpServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public FileUpServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stubdoPost(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stubrequest.setCharacterEncoding("utf-8");InputStream filesource = request.getInputStream();//request获取流信息String tempname = "D:/temp";//tempfile代表临时存放⽂件File tempfile = new File(tempname);//创建临时⽂件FileOutputStream outputStream = new FileOutputStream(tempfile);//输出流对象,指定输出指tempfile⽬录下byte b[] = new byte[1024];int n;while((n = filesource.read(b))!= -1)//从输出流中每次读取1024字节,直⾄读完{outputStream.write(b,0,n);}outputStream.close();filesource.close();//关闭输⼊输出流/*以下为具体的⽂件操作,主要为解析临时产⽣的 temp⽂件,知识多为java输⼊输出流的内容!*/RandomAccessFile randomfile = new RandomAccessFile(tempfile, "r");//随机流,指定要读临时⽂件,只读randomfile.readLine();//读取第⼀⾏,⽆效数据,不需要String str = randomfile.readLine();//读取第⼆⾏int beginIndex = stIndexOf("=")+2;//指定所需数据的开始位置int endIndex = stIndexOf("\"");//指定所需数据截⾄位置String filename = str.substring(beginIndex,endIndex);//截取⽂件名//重新定位⽂件指针,获取⽂件内容randomfile.seek(0);//⽂件指针从头开始long startext = 0;int i = 1;//⽂件内容开始位置while((n=randomfile.readByte()) != -1&&i <= 4){if(n=='\n'){startext = randomfile.getFilePointer();i++;}}startext = randomfile.getFilePointer() - 1;//获取⽂件内容结束位置randomfile.seek(randomfile.length());long endtext = randomfile.getFilePointer();int j = 1;while(endtext >= 0 && j <= 2){endtext--;randomfile.seek(endtext);if(randomfile.readByte()=='\n'){j++;}}endtext = endtext-1;//将临时⽂件保存⾄指定⽬录中String realpath = getServletContext().getRealPath("/")+"images";//设置⽂件保存⽬录System.out.println(realpath);File fileupload = new File(realpath);if(!fileupload.exists()){fileupload.mkdir();//⽬录不存在则创建}File savefile = new File(realpath,filename);RandomAccessFile randomAccessFile = new RandomAccessFile(savefile, "rw");randomfile.seek(startext);while(startext<endtext){randomAccessFile.write(randomfile.readByte());//⽂件写⼊startext = randomfile.getFilePointer();}//关闭各种输⼊输出流randomAccessFile.close();randomfile.close();tempfile.delete();//删除临时⽂件SimpleDateFormat timed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date nowdate = new Date();String time = timed.format(nowdate.getTime());request.setAttribute("info", time+" "+filename+"上传成功!");request.setAttribute("filename", filename);request.getRequestDispatcher("/fildeOp.jsp").forward(request, response);}}下载部分protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stubString filename = request.getParameter("filename");String path = getServletContext().getRealPath("/")+"images/";File file = new File(path+filename);//找到⽂件if(file.exists())response.setContentType("application/x-msdownload"); //设置响应类型,此处为下载类型response.setHeader("Content-Disposition", "attachment;filename=\""+filename+"\"");//以附件的形式打开 InputStream inputStream = new FileInputStream(file);ServletOutputStream outputStream = response.getOutputStream();byte b[] = new byte[1024];int n;while((n = inputStream.read(b)) != -1){outputStream.write(b,0,n);}outputStream.close();inputStream.close();}else{request.setAttribute("result", "⽂件不存在!下载失败!");request.getRequestDispatcher("/fildeOp.jsp").forward(request, response);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
文件的输入和输出

阻止程序继续向下运行,一直到有数据读取为止。常用的两种read方法:
public int read( byte[]b)throws IOException .
此方法的作用是读取当前流对象的数据,并把读取到的数据依次存储到数组b中,流中已经读取过得数据会被删除,后续的
出到数据源。当流关闭时,输出流内部的数据会被强制输出。
在字节输出流outputstream中,常见的方法有:
flush方法:public void flush()throws IOException
该方法的作用是将当前流对象中的缓冲数据强制输出。使用该方法可以实现立即输出。
write的方法常用的有两种:
数据会变成流中的第一个字节。而实际读取的字节数量则作为方法的返回值返回。
public int read(byte[]b,int off,int len)throws IOException
这种方法也是将读取的数据存储到b中,只是将流中第一个数据存储到b中下标为off的位置,最多读取len个数据,而实际
public int write( byte[]b)throws IOException .
该方法的作用是将数组b中的数据依次写入当前的流对象中。
public int write(byte[]b,int off,int len)throws IOException
该方法的作用是将数组b中从下标为off(包含)开始,后续长度为len个的数据依次写入流对象中。
3.字符输出流Writer
字符输出流Writer和字节输出流outputstream功能上类似,不同的是Writer每次写入的最少是一个字符(两个字节)的
拓展知识9-1 标准输入输出设备文件和流

拓展知识9-1 标准I/O设备文件和流C程序中经常有大量对文件的输入输出操作,它构成了程序的重要部分,因而C语言提供了很多输入输出的函数,用于两种类型文件输入输出系统:即由ANSI标准定义的缓冲文件系统(也称标准文件(流)输入输出(I/O)系统);另一类是ANSI标准中没有定义的非缓冲文件系统(也称非标准文件(流)输入输出(I/O)系统)。
我们已经熟悉了通过键盘和显示器进行输入输出的一些函数,如scanf,printf 等等,这些通过控制台(键盘、显示器等)进行I/O的操作,可以看作标准文件输入输出系统的一些特例。
任何C程序执行时,系统都定义了5个标准设备文件供使用。
系统自动打开的5个标准设备文件为:键盘(标准输入)stdin 0显示器(标准输出)stdout 1显示器(标准错误)stderr 2串行口(标准辅助)stdoux 3打印机(标准打印)stdprn 4在C中可将数据的输入输出看作是数据的流入和流出,这样不管是普通(磁盘)文件或者是物理设备(打印机、显示器、键盘等),都可看作一种流的源和目的,视他们为同一种东西,而不管其具体的物理结构,即对他们的操作,就是数据的流入和流出。
这种把数据的输入输出操作,抽象化为一种流,而不管它的具体结构的方法很有利于编程,而涉及流的输入输出操作函数可用于各种对象,与其具体的实体无关,即具有通用性。
在C语言中流可分为两大类,即文本流(text stream)和二进制流(binary stream)。
所谓文本流是指在流中流动的数据是以字符形式出现。
在文本流中,'\n'被换成回车CR和换行LF的代码0DH和0AH。
而当输出时,则0DH和0AH被换成'\n'。
二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。
在流入流出时,对\n符号不进行变换。
【示例】2001这个数,在文本流中用其ASCII码表示为:50 48 48 49共占4字节。
OOP 07章 流式输入输出及文件处理

7.3 Java的字节流处理
• Java字节流处理类集
7.3.1 字节输入流InputStream InputStream抽象类从输入设备或文件中读 取数据使用的字节流 提供下面几个用于读取数据的成员方法:
read() read(byte[] buffer) read(byte buffer[], int offset, int length) skip(long n) close()
2. 检测File对象
File类提供了一整套应用于File对象的成员方法。 exists() 检测File对象所描述的文件或目录是否存 在。 isDirectory() 检测File对象所描述的是否为目录。 isFile() 检测File对象所描述的是否为文件。 isHidden() 检测File对象所描述的是否为一个隐藏 文件。 canRead() 检测File对象所描述的文件是否可读。 canWrite() 检测File对象所描述的文件是否可写。 equals(Object obj) 检测File对象描述的绝对路径 与obj的绝对路径是否相等。
程序ቤተ መጻሕፍቲ ባይዱ
数据
输出设备
数据源
数据目标
当试图将外部的数据输入到程序中时,流中的 数据源是输入设备,数据目标是程序,这个流 被称为输入流(input stream)。
输入设备
数据源
数据
程序
数据目标
用流机制处理I/O的主要好处是:程序
中有关I/O的代码与设备无关,
程序不需知道(/处理)每一种设备的细 节,使程序能够适应各种设备的输入 输出。
从标准输入流读取数据
System.in是原始InputStream对象,需要经过包装才能有效地 读取数据。常用的方法: Import java.io.*; public class TypeInString{ public static void main(String[] args){ BuferedReader in = new Buffered Reader( new InputStreamReader( System.in ) ); String s;
Java第八章 输入输出系统(基础篇)

流与文件
标准输入/输出 流输入/输出
§6.1 流和文件
流:数据从计算机的输入向输出流动,即流的产生。 流有两种:文本流(字符)和二进制流(字节)
在JAVA里,流是一些类。
外部设备
输入流
计算机内部
பைடு நூலகம்
输出流 外部设备
文件也是一个逻辑概念。计算机的所有设备都可理解 为一个文件。流可与文件建立联系。(File)
§6.3 文件File
5.
文件属性设置
public boolean setLastModified(long time):设 置指定目录或文件的最后修改时间; public boolean setReadOnly():设置指定目录或文 件的只读属性;
§6.3 文件File
6.
其他
public URL toURL() throws MalformedURLException:将相对路径名存入URL 文件; public int compareTo(Object o):与另一个对象比 较名字; public boolean equals(Object obj):与另一个对 象比较名字;
public boolean isDirectory():指定的文件是否是目录;
§6.3 文件File
3.
一般文件信息和工具
public long lastModified():返回文件最后被修改的 时间; public long length():返回文件的字节长度; public boolean delete():删除指定的文件,若为目 录必须为空才能删除; public void deleteOnExit():当虚拟机执行结束时, 删除指定文件或目录;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16
6.1.2 预定义的I/O流类概述(续)
——标准输入输出
标准I/O重新导向
输
setIn(InputStream): 设置标准输入流
入
输
setOut(PrintStream):设置标准输出流
出
setErr(PrintStream):设置标准错误输出流
流
/
17
6.1.2 预定义的I/O流类概述(续)
入 包括
输
System.in: InputStream类型的,代表标准
出
输入流,这个流是已经打开了的,默认状态
流
对应于键盘输入。
System.out:PrintStream类型的,代表标准 输出流,默认状态对应于屏幕输出
System.err:PrintStream类型的,代表标准 错误信息输出流,默认状态对应于屏幕输出
从流的方向划分
输入流 输出流
从流的分工划分
节点流
处理流
从流的内容划分
面向字符的流
面向字节的流
7
/
6.1.2 预定义的I/O流类概述(续)
——java.io包的顶级层次结构
面向字符的流:专门用于字符数据 输 面向字节的流:用于一般目的
入 输 出 流
8
6.1.2 预定义的I/O流类概述(续)
——面向字符的流
/
面向字符的抽象类——Reader和Writer
java.io包中所有字符流的抽象基类
输 入
Reader提供了输入字符的API
输
Writer提供了输出字符的API
出
它们的子类又可分为两大类
流
节点流:从数据源读入数据或往目的地写出数据
处理流:对数据执行某种处理
多数程序使用这两个抽象类的一系列子类来读 入/写出文本信息
流
new InputStreamReader(System.in));
String s;
while((s = in.readLine()).length() != 0)
System.out.println(s); 运行结果
}
Hello!
}
Hello!
18
6.1.2 预定义的I/O流类概述(续)
——例6_1说明
例如FileReader/FileWriter用来读/写文本文件
11
/
6.1.2 预定义的I/O流类概述(续)
——面向字符的流
输 入 输 出 流
阴影部分为节点流 12
6.1.2 预定义的I/O流类概述(续)
——面向字节的流
数据源或目标中含有非字符数据,必
输 须用字节流来输入/输出 入 通常被用来读写诸如图片、声音之类
入
序使用这两个类的子类来读写8位的字节
输
信息
出 流
分为两部分
节点流
处理流
/
14
/
6.1.2 预定义的I/O流类概述(续)
——面向字节的流
输 入 输 出 流
阴影部分为节点流 15
6.1.2 预定义的I/O流类概述(续)
——标准输入输出
/
标准输入输出流对象
输
System类的静态成员变量
——例6_1
/
从键盘读入信息并在显示器上显示
import java.io.*;
输
public class Echo {
入
public static void main(String[] args) throws IOException {
输 出
BufferedReader in = new BufferedReader(
通过调用close方法,可以显式关闭任何一个流,
如果流对象不再被引用,Java的垃圾回收机制
也会隐式地关闭它
/
3
6.1.1 I/O流的概念(续)
输入流
为了从信息源获取信息,程序打开一个输入流,程序可
输
从输入流读取信息
入
输 出 流 输出流
当程序需要向目标位置写信息时,便需要打开一个输出 流,程序通过输出流向这个目标位置写信息
5
6.1.1 I/O流的概念(续)
——读写数据的方法
不论数据从哪来,到哪去,也不论数据本
输 入
身是何类型,读写数据的方法大体上都是 一样的:
输
出
读
写
流
打开一个流
打开一个流
读信息
写信息
关闭流
关闭流
/
6
6.1.2 预定义的I/O流类概述
/
输入/输出流可以从以下几个方面进行分类
输 入
输 出 流
——面向字符的流
面向字符的流
输 针对字符数据的特点进行过优化,提供
入
一些面向字符的有用特性
输
出 源或目标通常是文本文件
流
/
9
6.1.2 预定义的I/O流类概述(续)
——面向字符的流
实现内部格式和文本文件中的外部格式
之间转换
输 入
内部格式:16-bit char 数据类型
输 外部格式:
出
UTF(Universal character set Transformation
流
Format):很多人称之为"Universal Text
Format"
包括ASCII 码及非ASCII 码字符,比如: 斯拉 夫(Cyrillic)字符, 希腊字符,亚洲字符等
/
10
6.1.2 预定义的I/O流类概述(续)
System.in
程序启动时由Java系统自动创建的流对象,它是
输 入
原始的字节流,不能直接从中读取字符,需要对 其进行进一步的处理
输 出 流
InputStreamReader(System.in)
/
4
6.1.1 I/O流的概念(续)
——源和目标的类型
/
对象
输
disk file
入
running program
输 出
monitor
流
keyboard
Internet connection
image scanner
mouse
源? 目标? 或两者? Both Both
Destination Source Both Source Source
输 的二进制数据
出 流
绝大多数数据是被存储为二进制文件 的,世界上的文本文件大约只能占到
2%,通常二进制文件要比含有相同
数据量的文本文件小得多
/
13
6.1.2 预定义的I/O流类概述(续)
——面向字节的流
InputStream和OutputStream
输
是用来处理8位字节流的抽象基类,程
目录 6.1 输入/输出流 源自6.2 文件读写 6.3 本章小结
1
6.1.1 I/O流的概念
I/O流(Input/Output)
在Java中将信息的输入与输出过程抽象为I/O流
输 入
输入是指数据流入程序 输出是指数据从程序流出
输 出
一个流就是一个从源流向目的地的数据序列
流
IO流类一旦被创建就会自动打开