------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、概论
在java中,对于数据的输出输入控制称值为流。大部分流都在java.io包中,位于java.io包内的类都分别继承自四种抽象流类型
字节输入流InputStream、字节输出流OutputStream、字符输入流Reader、字节输出流Writer。
流的分类
按流向分:
输入流: 程序可以从中读取数据的流,都拥有基本方法read()。
输出流: 程序能向其中写入数据的流,都拥有基本方法write()。
按数据传输单位分:
字节流: 以字节为单位传输数据的流,字节流处理的单元为一个字节。
字符流: 以字符为单位传输数据的流,字符流一次可以处理两个单元。
大部分流都是以成对出现。
二、File类
File代表文件和目录路径名的抽象表示形式,它的实例对象创建后不能修改,新new出来的File对象,可能在硬盘上并不存在。
File的常用方法
import java.io.*;
class FileDemo{
public static void main(String[] args) {
File f = new File("d:\\java\\io.txt");
if(f.exists() ){
if( f.isFile() ){
System.out.println( "这是一个文件");
Long l = f.length();
System.out.println( "文件长度" + l);
}
else if ( f.isDirectory()){
System.out.println( "这是一个文件夹");
}
}
else{
f.createNewFile() ;
System.out.println( "创建一个文件"+f.toString());
}
f.delete();
System.out.println( "删除一个文件"+f.toString());
}
}
三、流的一些使用
字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符。字符流类有两个基类Reader和Writer,继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符。继承自Writer的流都是用于输出单位为字符的数据。
使用字符流来复制一个txt文件
import java.io.*;
class Demo{
public static void main (String []args) throws Exception{
File f = new File("d:\\java\\num.txt");
if(f.exists() &&f.toString().endsWith(".txt")&&f.isFile() ){
BufferedReader br = new BufferedReader (new FileReader(f));
BufferedWriter bw = new BufferedWriter (new FileWriter("d:\\a.txt"));
String line = null ;
while( (line = br.readLine())!=null ){
bw.write(line);
bw.flush();
}
System.out.println("复制完成!");
br.close();
bw.close();
}
else
System.out.println("输入的文件名错误!");
}
字节流相对于字符流,还可以对音频等其他文件进行处理
class Demo{
public static void main (String []args) throws Exception{
File f = new File("d:\\java\\num.txt");
if(f.exists() &&f.isFile() ){
InputStream in = new FileInputStream(f);
OutputStream out = new FileOutputStream("d:\\a.mp3");
byte[] buf = new byte[1024*1024];
int len = 0;
while( (len = in.read(buf))!=-1 ){
out.write(buf,0,len);
}
System.out.println("复制完成!");
in.close();
out.close();
}
else
System.out.println("输入的文件名错误!");
}
转换流,转换流可以将字节流转换成字符流。何时使用转换流呢。如:
1.如果使用非默认编码保存文件或者读取文件时,需要用到转换流,因为字节流的重载构造方法中有指定编码格式的参数,而FielReader 与 FileWriter 是默认编码的文本文件
2.流是字节流,但里面都是字符,转换成字符流可以使用bufferedReader、bufferedWriter独有方法。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in) );
合并流, 合并流SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
Vector v = new Vector();
v.add(new FileInputStream ("f:\\1.txt"));
v.add(new FileInputStream ("f:\\2.txt"));
v.add(new FileInputStream ("f:\\3.txt"));
v.add(new FileInputStream ("f:\\4.txt"));
Enumeration en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream d = new FileOutputStream ("f:\\测试.txt")
Print流:
Print流:Pirnt流为打印流,用作输出,有PrintWrite与PrintStresm。System.out就是PrintStream的一个实例。Print流中的方法不会抛出 I/O 异常.
class Demo{
public static void main (String []args) throws Exception{
FielOutputStream fo = new FielOutputStream("f:\\1.txt");
PrintStream ps = new PrintStream(fo );
for(int x = 0; x <= 100; c++){
ps.print(x);
ps.close();
}
}
Print流:
Print流:Pirnt流为打印流,用作输出,有PrintWrite与PrintStresm。System.out就是PrintStream的一个实例。Print流中的方法不会抛出 I/O 异常.