JSP学习笔记(7)-JSP的文件操作
1.File类
File对象用来获取文件本身的一些信息,例如文件所在目录,文件的长度,文件读写权限等,不涉及文件的读写操作。
创建一个File对象的构造方法有3个:
File(String filename);//filename是文件名或文件的绝对路径
File(String directoryPath,String filename);//文件路径和文件名
File(File f,String filename);使用第一种构造方法创建File对象时,filename是文件名会被认为与当前应用程序在同一个目录中。
File类常用方法
public String getName 获取文件名 public boolean canRead() 判断文件是否可读 public boolean canWrite() 判断文件是否可写 public boolean exists() 判断文件是否存在 public long length() 获取文件的长度(单位是字节) public String getAbsolutePath() 获取文件的绝对路径 public String getParent() 获取文件的父目录 public boolean isFile() 判断文件是否是一个正常文件,而不是目录 public boolean isDirectory() 判断文件是否是一个目录 public boolean isHidden() 判断文件是否是隐藏文件 public long lastModified() 获取文件最后修改的时间(时间从1970年午夜到文件最后修改时刻的毫秒数)
1.1.创建目录
- File对象调用public boolean mkdir()创建一个目录,成功返回true,失败返回false。
1.2.列出目录中的文件
- public String[] list()用字符串形式返回目录下的全部文件
- public File[] listFiles()用File对象形式返回目录下全部文件
1.3.列出指定类型文件
- public String[] list(FilenameFilter obj)用字符串形式返回目录下指定类型的所有文件
- public File[] listFiles(FilenameFilter obj)用File对象返回目录下指定类型的所有文件
1.4.删除文件和目录
- public boolean delete()可以删除当前对象代表的文件或目录;如果是目录,目录必为空;成功返回true。
2.读写文件的常用流
java.io包提供了大量的流类,其中InputStream、OutputStream、Reader、Writer是最重要的四个抽象类。
InputStream类及其子类对象为字节输入流;
OutputStream类及其子类对象为字节输出流;
Reader类及其子类对象为字符输入流;
Writer类及其子类对象为字符输出流。
使用输入流的4个步骤:
(1)设定输入流的源
(2)创建指向源的输入流
(3)让输入流读取源中的数据
(4)关闭输入流
使用输出流的4个步骤:
(1)给出输出流的目的地
(2)创建指向目的地的输出流
(3)让输出流吧数据写入到目的地
(4)关闭输出流
2.1.字节输入流
创建
FileInputStream(String name);
fileInputStream(File file);
//可能出现I/O错误try{
FileInputStream in=new FileInputStream("hello.txt");//创建指向源的输入流
}
catch(IOException e){
System.out.print(e);
}或
File f=new File("hello.txt");//指定输入流的源
try{
FileInputStream in = new FileInputStream(f);//创建指向源的输入流
}
catch(IOException e){
System.out.print(e);
}读取字节
字节输入流的read方法以字节为单位读取源中的数据。
int read() 读取单个字节的数据,返回字节值(0~255之间的一个整数),如未读出字节就返回-1 int read(byte b[]) 读取b.length个字节到字节数组b中,返回实际读取的字节数目,如到达文件的末尾,返回-1 int read(byte b[],int off,int len) 读取len个字节到字节数组b中,并返回实际读取字节数目,如到达文件末尾,返回-1;off指定b中存放读取数据的开始位置 关闭流
使用完之后应该关闭流,close()
2.2.字节输出流
创建
FileOutputStream(String name);
FileOutputStream(File file);try{
//创建指向目的地的输出流
FileOutputStream out=new FileOutputStream("hello.txt");
}
catch(IOException e){
System.out.peint(e);
} 或 File f=new File("hello.txt");
try{
FileOutputStream out=new FileOutputStream(f);
}
catch(IOException e){
System.out.print(e);
}具有刷新功能的输出流FileOutputStream(String name,boolean append);
FileOutputStream(File file,boolean appemd);如果参数append取值为true,输出流不会刷新指向的文件(假设文件已存在),输出流的write方法将从文件的末尾开始向文件写入数据;参数append取值false,输出流将刷新所指向的文件(假设文件已存在)。
写字节
字节输出流的write方法以字节单位向目的地写数据:
void write(int n) 向目的地写数据 void write(byte b[]) 向目的地写入单个字节 void write(byte b[],int off,int len) 从给定字节数组中起始于偏移量off处获取len个字节写到目的地 关闭流
close();
2.3.字符流
字节流是使用字节读取数据,不能很好的操作Unicode字符,比如汉字在文件中占两个字节,如果使用字节流,可能会出现乱码。这里我们就要使用字符流了。
FileReader文件字符输入流:
FileReader(String filename);
FileReader(File file);
FileWriter文件字符输出流:
FileWriter(String filename);
FileWriter(File file);
FileWriter(String filename,boolean append);
FileWriter(File file,boolean append);
FileReader和FileWriter分别是Reader和Writer的子类。
字符输入流和输出流的read和write方法使用字符数组读写数据,就是以字符为基本单位处理数据。
2.4.缓冲流
BufferedReader和BufferedWriter类创建的对象称为缓冲输入、输出流,二者增强了读写文件的能力。他们的源和目的地必须是字符输入流和字符输出流。通过字符输入流和BufferedReader的配合使用,使用readLine()方法可实现按行读取数据,字符输入流原本不能按行读取数据。
BufferedReader和BufferedWriter的构造方法:
BufferedReader(Reader in);
BufferedWriter(Writer out);
FileReader in = new FileReader("hi.txt");
BufferedReader buin = BufferedReader(in);
String strLine = buin.readLine(); FileWriter out = new FileWriter("hi.txt");
BufferedWriter buout = BufferedWriter(out);
buout.write("pinnsvin",3,4);
//向hi.txt中写入"nsvi"
readLine() 读取文本行 write(String s,int off,int len) 字符串s从off处开始写入len个字符 newLine() 向文件中写入回行符 flush() 刷新缓存 close() 关闭流
3.RandomAccessFile类
RandomAccessFile类不是InputStream或OutputStream的子类,习惯上称RandomAccessFile创建的对象为一个流,它的指向既可以是源也可以是目的地。
对文件进行读写操作时,就可以创建一个RandomAccessFile对象。
RandomAccessFile类的构造方法:
- RandomAccessFile(String name,String mode) 参数name是文件名,给出创建的流的源或目的地,mode文件的访问权限,取r(只读)或rw(可读写)
- RandomAccessFile(File file,String mode)参数file是一个File对象,创建对象时应该捕获IO异常
RandomAccessFile类常用方法
方法名 功能 getFilePointer() 获取当前流在文件中的读写位置 length() 获取文件的长度 readByte() 从文件读取一个字节 readDouble() 从文件读取一个双精度浮点值(8个字节) readInt() 从文件读取一个int值(4个字节) readLine() 从文件读取一个文本行 readUTF() 从文件读取一个UTF字符串 seek(long a) 定位到当前流距离文件开头a个字节数的位置 write(byte b[]) 向文件写入b.length个字节 writeDouble(double v) 向文件写入一个双精度浮点值 writeInt(int v) 向文件写入一个int值 writeUTF(String s) 向文件写入一个UTF字符串
4.文件上传
要上传文件到服务器,JSP页面必须有File类型的表单,并且表单中必须将ENCTYPE的属性值设为“multipart/form-data”
<form action="接受文件上传页面" method="post" ENCTYPE="multipart/form-data">
<input type="file" name="test"/>
</form>JSP引擎可以让内置对象request调用getInputStream()方法获取一个输入流,通过这个输入流读入用户上传的全部信息。
upload.jsp
<%@ page contentType="text/html;charset=utf-8" %>
<HTML><BODY>
<P>选择要上传的文件:<BR>
<FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data">
<INPUT type=FILE name="boy" size="38"> <BR>
<INPUT type="submit" name ="g" value="提交">
</BODY></HTML>
accept.jsp
<%@ page contentType="text/html;charset=utf-8" %> <%@ page import ="java.io.*" %> <HTML><BODY> <%try{ InputStream in=request.getInputStream(); File f=new File("d:/story","B.txt"); FileOutputStream o=new FileOutputStream(f); byte b[]=new byte[1000]; int n; while((n=in.read(b))!=-1) {o.write(b,0,n); } o.close(); in.close(); } catch(IOException ee){} out.print("文件已上传"); %> </BODY></HTML>
5.文件下载
JSP内置对象response调用getOutputStream()方法可以获取一个指向用户的输出流,服务器将文件写入这个流,用户就可以下载这个文件了。当提供下载功能时,应该使用response对象向用户发送HTTP头消息,浏览器就会调用相应的外部程序打开下载的文件。
response调用setHeader方法添加下载头的格式:
response.setHeader(“Content-disposition”,”attachment;filename=”下载文件名”);
download.jsp
<%@ page contentType="text/html;charset=utf-8" %>
<HTML>
<BODY>
<P>点击超链接下载Zip文档book.Zip
<BR> <A href="loadFile.jsp">下载book.zip
</Body>
</HTML>
loadFile.jsp
<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="java.io.*" %>
<HTML>
<BODY>
<% //获得响应客户的输出流:
OutputStream o=response.getOutputStream();
//输出文件用的字节数组,每次发送500个字节到输出流:
byte b[]=new byte[500];
//下载的文件:
File fileLoad=new File("d:/story","book.zip");
//客户使用保存文件的对话框:
response.setHeader("Content-disposition","attachment;filename="+"book.zip");
//通知客户文件的MIME类型:
response.setContentType("application/x-tar");
//通知客户文件的长度:
long fileLength=fileLoad.length();
String length=String.valueOf(fileLength);
response.setHeader("Content_Length",length);
//读取文件book.zip,并发送给客户下载:
FileInputStream in=new FileInputStream(fileLoad);
int n=0;
while((n=in.read(b))!=-1)
{ o.write(b,0,n);
}
%>
</BODY></HTML>
JSP学习笔记(7)-JSP的文件操作的更多相关文章
- VBA二次学习笔记(1)——文件操作
说明(2018-9-1 11:20:46): 1. 上班三个月了,累的一逼,真的是钱少事多离家远,每天早上六点起,晚上八点回.哎,少壮不努力啊! 2. 三个月没写博客了,上一篇已经是5.29的了,真的 ...
- python学习笔记(二)文件操作和集合
集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...
- python学习笔记——(三)文件操作
·集合操作及其相应的操作符表示集合中没有插入,只有添加,因为毕竟无序 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Vergil Zhan ...
- python 基础学习笔记(5)--文件操作
**python 的文件操作** - [ ] 使用python来读写文件是非常简单的操作,我们使用open()来打开一个文件,获取到文件的语柄,然后通过文件语柄就可以进行各种各样的操作了. - [ ] ...
- 02-Node.js学习笔记-系统模块fs文件操作
2.1.什么是系统模块 Node 运行环境提供的API,因为这些API都是以模块化的方式进行开发的,所有我们又称Node运行环境提供的API为系统模块 3.1系统模块fs文件操作 //f :file ...
- python学习笔记(五)文件操作和集合
文件基本操作: 现有文件file.txt f=open('file.txt','r')#以只读方式打开一个文件,获取文件的句柄,如果是读的话,r可以不写,默认就是只读:文件不存在时,会报错 first ...
- python学习笔记(11)文件操作
一.读文件 读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直 ...
- Nodejs学习笔记(4) 文件操作 fs 及 express 上传
目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...
- python学习笔记(八)——文件操作
在 windows 系统下,我们通过 路径+文件名+扩展名的方式唯一标识一个文件,而在 Linux 系统下通过 路径+文件名唯一标识一个文件. 文件分类:文件主要可以分为文本文件和二进制文件,常见的如 ...
- Go语言学习笔记(五)文件操作
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 文件读取 os.File 封装了文件相关操作 type File File代表一个打开的文件对象. func Cr ...
随机推荐
- Flask系列05--Flask的配置config
一.flask配置 示例说明, 就是使用config进行配置 from flask import Flask app = Flask(__name__) # type:Flask app.conf ...
- dapper视频
dapper是dotnet下的一种小巧快捷的ORM框架,本视频主要讲解了dapper的多库使用,以及常见的操作,如:对象查询.多集合查询,关联查询等,添加.修改.删除等. 视频地址:https://w ...
- Swift5 语言指南(二十三) 协议
甲协议定义的该适合特定任务或片的功能的方法,属性和其他要求的蓝图.然后,可以通过类,结构或枚举来采用该协议,以提供这些要求的实际实现.任何满足协议要求的类型都被认为符合该协议. 除了指定符合类型必须实 ...
- drf-序列化器的理解
序列化器作用: 1.进行数据的校验 2.对数据对象进行转换 序列化: 模型类对象 -----> python字典 用于输出, 返回给前端使用 反序列化: 前端传送的数据 --- ...
- MySQL查询50例
创建表和关系 /* 创建表 */ /*年级表*/ DROP TABLE IF EXISTS `class_grade`; CREATE TABLE `class_grade` ( `gid` int( ...
- php获取全选checkbox多个值
<form name="myform" action="index2.php" method="post"> ...
- 分步理解 Promise 的实现
一个 Promise 的运用: var firstPromise = new Promise(function(resolve,reject){ setTimeout(function(){ var ...
- linux和docker的capabilities介绍
验证环境:centos7 x86/64 内核版本4.19.9 在linux 2.2版本之前,当内核对进程进行权限验证的时候,可以将进程划分为两类:privileged(UID=0)和unprivile ...
- haproxy+keepalived原理特点
所有的系统,都是先经历一个单台机器搞所有业务的时代,一个程序+一个mysql数据库,就可以满足开发及第一个版本上线的要求.随着,数据的增加以及业务的增长,这些应用就面临一个访问量的扩大以及扩展的问题. ...
- 系统启动时队列自动下单--ServletContextListener
package com.liying.pear.queue; import javax.servlet.ServletContextEvent; import javax.servlet.Servle ...