简单理解
java的io包括输入流InputStream,输出流OutputStream,File类等,具体结构如下图所示:
在网络上的文件传输有两种方式,一种是字符流传输,一种是二进制流传输(这里的字节流就是二进制流,只是起了一个便于区分的名字)。
字符流的样子是这样的:
^&%R%^FR^&%F*^&R^RF^%^&EYD%$^
二进制流的样子是这个样子的:
1011010101010111101010100001
事实上,只是文件传输的途中用到了字符流,真正存储到计算机中的都是二进制流。二进制流的前几位用来描述文件的信息,后面的位数用来记录文件的具体内容。
当我们读取一个文件的时候,是把这个文件的内容从磁盘中拿到内存的我们的程序中再去读取它的数据,这时称作流的输入,对应的就是输入流InputStream
当我们去对一个文件写入数据的时候,是把要输出的内容从内存中的程序中输出到磁盘的文件中,这时称作流的输出,对应的就是输出流OutputStream
所以,我们常常会感到很难受,为什么明明对一个文件写入数据是输出流,而对一个一个文件的读取操作却是输入流,貌似完全反过来了一样,原因就在此。输入输出是相对内存中的程序而言的,而不是相对我们人类而言的。
基本使用方法
1.File类
创建文件夹
使用File类可以创建一个文件夹,创建的方法很简单:
File f= new File("你的路径");
这是给File一个路径值,接着,我们通过File类的mkdir()方法就可以创建一个文件夹
f.mkdir();
读取文件夹中内容
当我们读取文件夹中的内容时,使用list()方法可以直接读取出来这个文件夹中的文件,读取出来的是一个数组,下面的例子用字符串数组接受了文件夹中的子文件,然后遍历输出:
public static void main(String args[]) {
String dirname = "/tmp";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println("目录 " + dirname);
String s[] = f1.list();
for (int i = 0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " 是一个目录");
} else {
System.out.println(s[i] + " 是一个文件");
}
}
} else {
System.out.println(dirname + " 不是一个目录");
}
}
输出结果:
目录 /tmp
bin 是一个目录
lib 是一个目录
demo 是一个目录
test.txt 是一个文件
README 是一个文件
index.html 是一个文件
include 是一个目录
删除目录及内容
我们可以使用File类的delete()方法删除文件,但是必须保证删除的文件目录下没有子文件才行,否则会删除失败。
那么,我们可以通过如下方法把文件夹和文件夹中的内容一起删除:
public static void main(String args[]) {
File folder = new File("/tmp/java/");
File[] files = folder.listFiles();
if (files != null)
{
for (File f : files)
{
if (f.isDirectory())
{
deleteFolder(f);
}
else
{
f.delete();
}
}
}
folder.delete();
}
看着复杂,其实很简单,我们只是将一个文件夹下的东西遍历了一遍然后挨个去删除它们而已。
2.FileInputStream类
该流用于从文件读取数据,使用方法很简单,直接可以new出来
下面的例子可以从已经创建好的文件中读取流:
File f = new File("C:/java/hello");
InputStream out = new FileInputStream(f);
当然,我们也可以直接在构造方法中输入文件的路径:
InputStream f = new FileInputStream("C:/java/hello");
创建好了流对象,我们就可以通过流对象的方法读取数据了,可以使用read()方法读出数据来:
f.read();
注意,无论是使用输入流还是输出流,在使用完成后都要关闭流,否则对于文件来说是不安全的,我们通过调用close()方法关闭流:
f.close();
下面是完整的实例:
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("test.txt");
int b;
while((b = f.read()) != -1) {
System.out.println(b);
}
//关闭流资源
fis.close();
}
3.FileOutputStream类
该流用于向文件中写入数据,使用方法也是直接new出来
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
下面的例子创建了一个文件并且开始向文件中写入数据:
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
写入数据是通过write()方法
下面的完整例子演示了输入输出流的用法:
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite[] = { 11, 21, 3, 40, 5 };
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++)
{
os.write(bWrite[x]); // 向文件中写入
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();//available返回的是一次性可以读取出的字节数
for (int i = 0; i < size; i++)
{
System.out.print((char) is.read() + " ");//读取并打印出数据
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}