- 浏览: 169990 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
why240829544:
谢谢
Spring Security 2.0.x中文参考文档.pdf -
lzc879141573:
...
Spring Security 2.0.x中文参考文档.pdf -
zpl:
C:\Documents and Settings\Admin ...
导入word到Fckeditor(java实现) -
zpl:
[img][/img] asdfasdfasdfa
导入word到Fckeditor(java实现) -
zhoutao.temp:
Java文件下载的几种方式
原文出处http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面。照旧,文章依旧以例子为主,因为讲解内容的java书很多了,我觉的学以致用才是真。代码是写出来的,不是看出来的。
最后欢迎大家提出意见和建议。
【案例1】创建一个新文件
1
2
3
4
5
6
7
8
9
10
11
|
import java.io.*;
class hello{
public static void main(String[] args) {
File f= new File( "D:\\hello.txt" );
try {
f.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
} |
【运行结果】:
程序运行之后,在d盘下会有一个名字为hello.txt的文件。
【案例2】File类的两个常量
1
2
3
4
5
6
7
|
import java.io.*;
class hello{
public static void main(String[] args) {
System.out.println(File.separator);
System.out.println(File.pathSeparator);
}
} |
【运行结果】:
\
;
此处多说几句:有些同学可能认为,我直接在windows下使用\进行分割不行吗?当然是可以的。但是在linux下就不是\了。所以,要想使得我们的代码跨平台,更加健壮,所以,大家都采用这两个常量吧,其实也多写不了几行。呵呵、
现在我们使用File类中的常量改写上面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
try {
f.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
} |
你看,没有多写多少吧,呵呵。所以建议使用File类中的常量。
删除一个文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * 删除一个文件
* */ import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
if (f.exists()){
f.delete();
} else {
System.out.println( "文件不存在" );
}
}
} |
创建一个文件夹
1
2
3
4
5
6
7
8
9
10
11
|
/** * 创建一个文件夹
* */ import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator+ "hello" ;
File f= new File(fileName);
f.mkdir();
}
} |
【运行结果】:
D盘下多了一个hello文件夹
列出指定目录的全部文件(包括隐藏文件):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/** * 使用list列出指定目录的全部文件
* */ import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator;
File f= new File(fileName);
String[] str=f.list();
for ( int i = 0 ; i < str.length; i++) {
System.out.println(str[i]);
}
}
} |
【运行结果】:
$RECYCLE.BIN
360
360Downloads
360Rec
360SoftMove
Config.Msi
da
Downloads
DriversBackup
eclipse
java web整合开发和项目实战
Lenovo
MSOCache
Program
Program Files
python
RECYGLER.{8F92DA15-A229-A4D5-B5CE-5280C8B89C19}
System Volume Information
Tomcat6
var
vod_cache_data
新建文件夹
(你的运行结果应该和这个不一样的,呵呵)
但是使用list返回的是String数组,。而且列出的不是完整路径,如果想列出完整路径的话,需要使用listFiles.他返回的是File的数组
列出指定目录的全部文件(包括隐藏文件):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/** * 使用listFiles列出指定目录的全部文件
* listFiles输出的是完整路径
* */ import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator;
File f= new File(fileName);
File[] str=f.listFiles();
for ( int i = 0 ; i < str.length; i++) {
System.out.println(str[i]);
}
}
} |
【运行结果】:
D:\$RECYCLE.BIN
D:\360
D:\360Downloads
D:\360Rec
D:\360SoftMove
D:\Config.Msi
D:\da
D:\Downloads
D:\DriversBackup
D:\eclipse
D:\java web整合开发和项目实战
D:\Lenovo
D:\MSOCache
D:\Program
D:\Program Files
D:\python
D:\RECYGLER.{8F92DA15-A229-A4D5-B5CE-5280C8B89C19}
D:\System Volume Information
D:\Tomcat6
D:\var
D:\vod_cache_data
D:\新建文件夹
通过比较可以指定,使用listFiles更加方便、
判断一个指定的路径是否为目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/** * 使用isDirectory判断一个指定的路径是否为目录
* */ import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator;
File f= new File(fileName);
if (f.isDirectory()){
System.out.println( "YES" );
} else {
System.out.println( "NO" );
}
}
} |
【运行结果】:YES
搜索指定目录的全部内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/** * 列出指定目录的全部内容
* */ import java.io.*;
class hello{
public static void main(String[] args) {
String fileName= "D:" +File.separator;
File f= new File(fileName);
print(f);
}
public static void print(File f){
if (f!= null ){
if (f.isDirectory()){
File[] fileArray=f.listFiles();
if (fileArray!= null ){
for ( int i = 0 ; i < fileArray.length; i++) {
//递归调用
print(fileArray[i]);
}
}
}
else {
System.out.println(f);
}
}
}
} |
【运行结果】:
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\framepages\web4welcome_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\help_005fhome_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\help_005fhome_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\home_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\home_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\index_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\index_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\login_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\login_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\modify_005fuser_005finfo_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\modify_005fuser_005finfo_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\register_005fnotify_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\register_005fnotify_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\sign_005fup_jsp.class
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\sign_005fup_jsp.java
D:\Tomcat6\work\Catalina\localhost\nevel\org\apache\jsp\transit_jsp.class
……
【使用RandomAccessFile写入文件】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 使用RandomAccessFile写入文件
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
RandomAccessFile demo= new RandomAccessFile(f, "rw" );
demo.writeBytes( "asdsad" );
demo.writeInt( 12 );
demo.writeBoolean( true );
demo.writeChar( 'A' );
demo.writeFloat( 1 .21f);
demo.writeDouble( 12.123 );
demo.close();
}
} |
如果你此时打开hello。txt查看的话,会发现那是乱码。
字节流
【向文件中写入字符串】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * 字节流
* 向文件中写入字符串
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
OutputStream out = new FileOutputStream(f);
String str= "你好" ;
byte [] b=str.getBytes();
out.write(b);
out.close();
}
} |
查看hello.txt会看到“你好”
当然也可以一个字节一个字节的写。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 字节流
* 向文件中一个字节一个字节的写入字符串
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
OutputStream out = new FileOutputStream(f);
String str= "你好" ;
byte [] b=str.getBytes();
for ( int i = 0 ; i < b.length; i++) {
out.write(b[i]);
}
out.close();
}
} |
结果还是:“你好”
向文件中追加新内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 字节流
* 向文件中追加新内容:
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
OutputStream out = new FileOutputStream(f, true );
String str= "Rollen" ;
//String str="\r\nRollen"; 可以换行
byte [] b=str.getBytes();
for ( int i = 0 ; i < b.length; i++) {
out.write(b[i]);
}
out.close();
}
} |
【运行结果】:
你好Rollen
【读取文件内容】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * 字节流
* 读文件内容
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
InputStream in= new FileInputStream(f);
byte [] b= new byte [ 1024 ];
in.read(b);
in.close();
System.out.println( new String(b));
}
} |
【运行结果】
你好Rollen
Rollen_
但是这个例子读取出来会有大量的空格,我们可以利用in.read(b);的返回值来设计程序。如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 字节流
* 读文件内容
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
InputStream in= new FileInputStream(f);
byte [] b= new byte [ 1024 ];
int len=in.read(b);
in.close();
System.out.println( "读入长度为:" +len);
System.out.println( new String(b, 0 ,len));
}
} |
【运行结果】:
读入长度为:18
你好Rollen
Rollen
读者观察上面的例子可以看出,我们预先申请了一个指定大小的空间,但是有时候这个空间可能太小,有时候可能太大,我们需要准确的大小,这样节省空间,那么我们可以这样干:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 字节流
* 读文件内容,节省空间
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
InputStream in= new FileInputStream(f);
byte [] b= new byte [( int )f.length()];
in.read(b);
System.out.println( "文件长度为:" +f.length());
in.close();
System.out.println( new String(b));
}
} |
文件长度为:18
你好Rollen
Rollen
将上面的例子改为一个一个读:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 字节流
* 读文件内容,节省空间
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
InputStream in= new FileInputStream(f);
byte [] b= new byte [( int )f.length()];
for ( int i = 0 ; i < b.length; i++) {
b[i]=( byte )in.read();
}
in.close();
System.out.println( new String(b));
}
} |
输出的结果和上面的一样。
细心的读者可能会发现,上面的几个例子都是在知道文件的内容多大,然后才展开的,有时候我们不知道文件有多大,这种情况下,我们需要判断是否独到文件的末尾。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 字节流
*读文件
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
InputStream in= new FileInputStream(f);
byte [] b= new byte [ 1024 ];
int count = 0 ;
int temp= 0 ;
while ((temp=in.read())!=(- 1 )){
b[count++]=( byte )temp;
}
in.close();
System.out.println( new String(b));
}
} |
【运行结果】
你好Rollen
Rollen_
提醒一下,当独到文件末尾的时候会返回-1.正常情况下是不会返回-1的
字符流
【向文件中写入数据】
现在我们使用字符流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/** * 字符流
* 写入数据
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
Writer out = new FileWriter(f);
String str= "hello" ;
out.write(str);
out.close();
}
} |
当你打开hello。txt的时候,会看到hello
其实这个例子上之前的例子没什么区别,只是你可以直接输入字符串,而不需要你将字符串转化为字节数组。
当你如果想问文件中追加内容的时候,可以使用将上面的声明out的哪一行换为:
Writer out =new FileWriter(f,true);
这样,当你运行程序的时候,会发现文件内容变为:
hellohello如果想在文件中换行的话,需要使用“\r\n”
比如将str变为String str="\r\nhello";
这样文件追加的str的内容就会换行了。
从文件中读内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 字符流
* 从文件中读出内容
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
char [] ch= new char [ 100 ];
Reader read= new FileReader(f);
int count=read.read(ch);
read.close();
System.out.println( "读入的长度为:" +count);
System.out.println( "内容为" + new String(ch, 0 ,count));
}
} |
【运行结果】:
读入的长度为:17
内容为hellohello
hello
当然最好采用循环读取的方式,因为我们有时候不知道文件到底有多大。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 字符流
* 从文件中读出内容
* */ import java.io.*;
class hello{
public static void main(String[] args) throws IOException {
String fileName= "D:" +File.separator+ "hello.txt" ;
File f= new File(fileName);
char [] ch= new char [ 100 ];
Reader read= new FileReader(f);
int temp= 0 ;
int count= 0 ;
while ((temp=read.read())!=(- 1 )){
ch[count++]=( char )temp;
}
read.close();
System.out.println( "内容为" + new String(ch, 0 ,count));
}
} |
运行结果:
内容为hellohello
hello
关于字节流和字符流的区别
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的,但是字符流在操作的 时候下后是会用到缓冲区的,是通过缓冲区来操作文件的。
读者可以试着将上面的字节流和字符流的程序的最后一行关闭文件的代码注释掉,然后运行程序看看。你就会发现使用字节流的话,文件中已经存在内容,但是使用字符流的时候,文件中还是没有内容的,这个时候就要刷新缓冲区。
使用字节流好还是字符流好呢?
答案是字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
发表评论
-
转:java分析超大文件
2012-05-16 21:56 1318Java读取大文件 遇 ... -
Java文件下载的几种方式
2009-09-10 20:13 8489Java文件下载 Java文件下载的几种方式 ... -
JAVA上传文件比较与实例
2009-09-10 20:10 5913jsp文件上传大多采用采 ... -
反射的基础用法
2008-11-29 22:30 1061import java.lang.reflect.Array; ... -
Eclipse快捷键大全
2008-10-16 16:02 877Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctr ... -
所有weblogic版本下载
2008-10-14 14:02 3503所有weblogic版本下载 platform & ... -
WebLogic & MyEclipse 配置
2008-10-14 13:50 920安装 WebLogic 比较容易,在这里就不再累述了,大 ... -
Apache Commons工具集简介
2008-10-06 15:17 554Apache Commons包含了很多开源的工具,用于解决平时 ... -
java中的集合的使用
2008-10-06 15:08 1133去掉重复的 import java.util.*; pu ... -
Generics泛型的应用
2008-10-06 14:53 1077Generics泛型的应用 ... -
java对word、excel、pdf等操作
2008-10-06 14:49 7381、一个jacob操作Word的例子,其他操作excel,pd ... -
Log4j基本使用方法
2008-10-05 20:06 1116log4j教程 作者:不详 来源于:【JAVA综合 ... -
表单验证帮助文档
2008-09-30 21:36 773网上找的一个很好的表单验证帮助文档,提供下载。 -
JAVA各种排序方法及改良
2008-09-30 21:22 1280插入排序: package org.rut.util.algo ...
相关推荐
java中的IO整理完整版
此文档是对JAVA 中的 IO 流的整理,其中有大多实用 而平时可以接触到的 IO 基础,对开发工作者有很大的帮助
Java中IO系统总结[整理].pdf
Java中的IO整理完整版
JAVA_IO流整理思维导图.
java IO全面整理,整理了一下关于java 的IO操作,我是直接在测试的时候将关键的测试代码放上去了,并配以简洁的注解,适合有一定基础的朋友!
<%@ page import="java.io.*" %> <%@ page import="java.awt.*" %> <%@ page import="org.jfree.chart.*" %> <%@ page import="org.jfree.chart.plot.*" %> <%@ page import="org.jfree.chart.servlet....
javaIO流整理.txt
此文档属于本人当初学习java基础之IO流,所整理的文档。里面有字节流与字符流的比较,也有总结使用不同方式读取文档的demo。希望对你的学习有帮助,谢谢!
Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。例如,对于一个文件,我们...而到了java 1.1,为了与国际化进行接轨,在java io中添加了许多以字符(Unicode)为单位进行操作的类。
自己整理了一下javaIO流的相关知识点 用xmind软件做了一下
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多...
Java IO流思维导图,主要摘录整理的是java.io.*包下的所有IO对象,其中对应备注里包含各个IO对象的构造方法
Java多线程.drawio
该文档主要整理了Java IO流的相关信息,主要包括IO流的按照不同维度的分类、节点流、处理流、输入输出流的处理过程、抽象基类的使用等细节内容
网上都是不带书签,并且有些地方翻译有歧义。 所以我整理了一个。 特点:带书签 Scalable io in java 中文版,并且对有歧义的语义进行了修改。
DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等。
JavaTwo 2002大會上針對泛型技術給出一個講題,並將內容整理為《Java 泛型技術之發展》一文(http://www.jjhou.com/javatwo-2002.htm)。該文所談的 Java 泛型語法以及 Java泛型技術之內部實作技術,在今天(被 ...
Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2. 原始处理器(适配器)...
Java线程和IO总结[整理].pdf