IO流(重点)
流的分类:
按数据流的方向可以分为,输入流 和 输出流
按处理数据的单位可以分为 字节流 和 字符流
按功能不同可以分为 节点流 和 处理流
输入流:程序从文件读取内容
输出流:程序向文件写入内容
输入流,输出流都是站在程序角度
字节流:一个字节一个字节的读写
字符流:一个 字符一个字符的读写
节点流:直接从一个特定数据源(节点)读写数据
处理流:是在已存在的流(节点流或者处理流)之上,通过对数据的处理为程序提供更强大的读写功能
JDK所提供的所有流的类型位于包 java.io 内,分别继承以下四种抽象类型
(以 Stream 结尾的都是字节流)
InputStream:
OutputStream:
Reader:
Writer:
节点流类型:
处理流类型:
缓冲流:
转换流:
数据流:
Print流:
Object(对象序列化)流:
序列化机制允许将实现序列化的java对象转换为字节序列,这些字节序列可以被保存在磁盘上,或者通过网络传输,以备以后恢复成原来对象。序列化机制使得对象可以脱离程序的运行而独立存在。
对象的序列化指将一个java对象写入IO流中,与此对应的是,对象的反序列化将从IO流中恢复该java对象
如果要让某个对象支持序列化机制,就必须让它的类可序列化,为了让类可以序列化,就要实现:Serializable接口 和 Externalizable接口
Serializable 接口 是一个标记接口,没有任何方法
Externalizable 接口 只有两个方法:
1.保存内容方法 :writeExternal( ObjectOutput out ) 抛出 IOException 异常
2.恢复内容方法:readExternal( ObjectInput in ) 抛出 IOExeption 和 ClassNotFoundException 异常
关于IO流的一些操作:
1:创建一个新文件
import java.io.*;
class testio{
public static void main(String[]args)throws Exception {
File f = new File("C:\\Documents and Settings\\Administrator\\Desktop\\lianxi\\testjava\\test.txt");
f.createNewFile(); //createNewFile(); 方法判断是否存在该文件,不存在就创建
}
}
2:File 类的四个常量
File.separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 File.separatorChar。
File.separatorChar:与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。
File.pathSeparator :与系统有关的路径分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 pathSeparatorChar
File.pathSeparatorChar:与系统有关的路径分隔符。此字段被初始为包含系统属性 path.separator 值的第一个字符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上,此字段为 ':';在 Microsoft Windows 系统上,它为 ';'。
import java.io.*;
class testio{
public static void main(String[]args)throws Exception {
String s = File.separator; //指定系统分隔符,使程序移植性更强
File f = new File("C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt");
f.createNewFile(); //createNewFile(); 方法判断是否存在该文件,不存在就创建
}
}
3:删除文件
import java.io.*;
class testio{
public static void main(String[]args)throws Exception {
String s = File.separator;//指定系统分隔符,使程序移植性更强
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
if(f.exists()){ //exists( );检测这个路径下的文件或者目录是否存在
f.delete(); //delete( );删除这个路径下的文件或者目录
}else{
System.out.println("文件不存在!");
}
}
}
4:创建文件夹
import java.io.*;
public class testiocj {
public static void main(String[]args) {
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test";
File f = new File(fileName);
f.mkdir(); //mkdir(); 创建此抽象路径名指定的目录。当且仅当已创建目录时,返回 true;否则返回 false
}
}
5:列出指定目录的全部文件(包括隐藏文件):
import java.io.*;
public class testiom {
public static void main(String[]args) {
String s = File.separator;
String fileName = "D:"+s;
File f = new File(fileName);
File [] str = f.listFiles(); //listFiles();返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
for(int i=0;i
6:判断一个指定的路径是否为目录
import java.io.*;
public class testiop {
public static void main(String[]args) {
String s = File.separator;
String fileName = "D:"+s;
File f = new File(fileName);
if(f.isDirectory()) { //isDirectory()测试此抽象路径名表示的文件是否是一个目录。当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false
System.out.println("YES");
}else {
System.out.println("No");
}
}
}
7:搜索指定目录的全部内容
import java.io.*;
public class testioq {
public static void main(String[] args) {
String s = File.separator;
String fileName = "D:"+s;
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
字节流
8:向文件中写入字符串(一个字节数组的写入)
import java.io.*;
public class testiozxs {
public static void main(String[]args)throws IOException {
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
OutputStream out = new FileOutputStream(f);
String str = "你好";
byte[] b = str.getBytes();
out.write(b); //OutputStream 的 write()方法只能接受byte数组
out.close();
}
}
字节流
9:向文件中写入字符串(一个字节一个字节的写入)
import java.io.*;
public class testiozxs2{
public static void main(String[]args) throws IOException{
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f= new File(fileName);
OutputStream out = new FileOutputStream(f);
String str = "你好!";
byte[] b = str.getBytes();
for(int i=0;i
字节流
10:向文件中追加新内容
import java.io.*;
public class testiozjz {
public static void main(String[]args)throws IOException{
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
OutputStream out = new FileOutputStream(f,true); // new FileOutputStream(f,true);加上true,就可以在文件后面追加内容,如果没有true就会覆盖原来的内容
String str = "\n\nHello!";
byte[] b = str.getBytes();
for(int i=0; i
字节流
11:读取文件内容
import java.io.*;
public class testiozd {
public static void main(String[] args)throws IOException{
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
InputStream in = new FileInputStream(f);
byte[] b = new byte[(int)f.length()]; //(int)f.length() 读取文件的长度
in.read(b);
System.out.println("文件长度:"+f.length());
in.close();
System.out.println(new String(b));
}
}
字符流
12:向文件中写入数据
import java.io.*;
public class testiofx {
public static void main(String[] args)throws IOException {
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
Writer out = new FileWriter(f);
String str = "nihao!";
out.write(str);
out.close();
}
}
字符流
13:向文件追加内容
import java.io.*;
public class testiofx {
public static void main(String[] args)throws IOException {
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
Writer out = new FileWriter(f,true); //追加内容
String str = "nihao!";
out.write(str);
out.close();
}
}
字符流
14:读取内容
import java.io.*;
public class testiofd {
public static void main(String[] args)throws IOException {
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
File f = new File(fileName);
char[] ch = new char[(int)f.length()]; //(int)f.length() 文件总长度
Reader read = new FileReader(f);
int count = read.read(ch);
read.close();
System.out.println("读取的长度"+count);
System.out.println("内容"+new String(ch,0,count));
}
}
关于字节流和字符流的区别
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的,但是字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件的。
可以试着将字节流和字符流的程序的最后一行关闭文件的代码注释掉,然后运行程序看看。就会发现使用字节流的话,文件中已经存在内容,但是使用字符流的时候,文件中还是没有内容的,这个时候就要刷新缓冲区。
15:文件复制
import java.io.*;
public class testiocopy {
public static void main(String[] args)throws IOException {
String s = File.separator;
String fileName = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test.txt";
String fileName2 = "C:"+s+"Documents and Settings"+s+"Administrator"+s+"Desktop"+s+"lianxi"+s+"testjava"+s+"test2.txt";
int b = 0;
FileReader in = new FileReader(fileName);
FileWriter out = new FileWriter(fileName2);
while((b=in.read())!=-1){ //in.read() != -1 ,检测文件内容是否读取到最后
out.write(b);
}
out.close();
in.close();
System.out.println("文件已复制");
}
}