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的文件操作的更多相关文章

  1. VBA二次学习笔记(1)——文件操作

    说明(2018-9-1 11:20:46): 1. 上班三个月了,累的一逼,真的是钱少事多离家远,每天早上六点起,晚上八点回.哎,少壮不努力啊! 2. 三个月没写博客了,上一篇已经是5.29的了,真的 ...

  2. python学习笔记(二)文件操作和集合

    集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...

  3. python学习笔记——(三)文件操作

    ·集合操作及其相应的操作符表示集合中没有插入,只有添加,因为毕竟无序 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Vergil Zhan ...

  4. python 基础学习笔记(5)--文件操作

    **python 的文件操作** - [ ] 使用python来读写文件是非常简单的操作,我们使用open()来打开一个文件,获取到文件的语柄,然后通过文件语柄就可以进行各种各样的操作了. - [ ] ...

  5. 02-Node.js学习笔记-系统模块fs文件操作

    2.1.什么是系统模块 Node 运行环境提供的API,因为这些API都是以模块化的方式进行开发的,所有我们又称Node运行环境提供的API为系统模块 3.1系统模块fs文件操作 //f :file ...

  6. python学习笔记(五)文件操作和集合

    文件基本操作: 现有文件file.txt f=open('file.txt','r')#以只读方式打开一个文件,获取文件的句柄,如果是读的话,r可以不写,默认就是只读:文件不存在时,会报错 first ...

  7. python学习笔记(11)文件操作

    一.读文件 读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直 ...

  8. Nodejs学习笔记(4) 文件操作 fs 及 express 上传

    目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...

  9. python学习笔记(八)——文件操作

    在 windows 系统下,我们通过 路径+文件名+扩展名的方式唯一标识一个文件,而在 Linux 系统下通过 路径+文件名唯一标识一个文件. 文件分类:文件主要可以分为文本文件和二进制文件,常见的如 ...

  10. Go语言学习笔记(五)文件操作

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 文件读取 os.File 封装了文件相关操作 type File File代表一个打开的文件对象. func Cr ...

随机推荐

  1. Lerning Entity Framework 6 ------ Introduction to TPT

    Sometimes, you've created a table for example named Person. Just then, you want to add some extra in ...

  2. 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)

    传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /* mail: mleautom ...

  3. iOS-项目开发1-图片浏览器

    FFBrowserImageViewController 自定义的图片浏览器:支持图片双击放大,单击取消,拖动取消. 重点: 1:在iOS11之后再布局是要将UIScrollViewContentIn ...

  4. jzoj4229

    按照題意暴力模擬即可 #include<bits/stdc++.h> using namespace std; int m; typedef long long ll; ll a1,q,n ...

  5. 修改windows远程默认端口

    修改windows远程默认端口 windows端口修改rdp 1 远程服务器运行窗口调出注册表编辑器 注册表编辑器regeidt 2 修改两个注册表 1,在注册表HKEY_LOCAL_MACHINE\ ...

  6. ssm中返回中文字符串时出现乱码?

    问题:返回json格式时,前端ajax请求,响应数据接收正常:     返回String时,响应数据是乱码? 解决:@RequestMapping注解中添加:produces = "text ...

  7. iOS,Android,WP, .NET通用AES加密算法

    这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果,Android则可以,后来使用了通用的AES256加密算 ...

  8. 使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法

    使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法 效果展示 一个很简单的组件脚本 运行状态在Inspector面板可以随便修改字段和调用方法 方法调用日志 设计由来 最近在 ...

  9. xamarin android 需要获取apk签名工具

    请打开vs 扩展 搜索 android keystore signature tool 如果是Release 记得查找对应的keystore 文件然后进行获取签名

  10. ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法

    1) 端口错 client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, ...