流是指一连串流动的字符,以先进先出的方式发送信息。
按照不同的分类方式,可以将流分为不同的类型,下面从不同的角度分类:1.输入流和输出流:按照流的流向来分,可以分为输入流和输出流
输入流:只能从中读取数据,而不能向其中写入数据
输出流:只能向其中写入数据,而不能从中读取数据
java的输入流主要由InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类。
2.字节流和字符流:按照操作的数据单元来分,可以分为字节流和字符流
字节流:字节流操作的最小数据单元为8位的字节
字符流:字符流操作的最小数据单元是16位的字符
java的字节流由Inputstream和Outputstream作为基类,而字符流则主要由Reader和Writer作为基类。
分类
|
字节输入流
|
字节输出流
|
字符输入流
|
字符输出流
|
抽象基类
|
InputStream
|
OutputStream
|
Reader
|
Writer
|
访问文件
|
FileInputStream
|
FileOutputStream
|
FileReader
|
FileWriter
|
访问字符串
|
|
|
StringReader
|
StringWriter
|
缓冲流
|
BufferedInputStream
|
Buffered
OutputStream
|
BufferedReader
|
BufferedWriter
|
转换流
|
|
|
InputStreamReader
|
OutputStreamReader
|
特殊流 | DataInputStream | DataOutputStream | ||
对象流 | ObjectInputStraam | ObjectOutputStream |
代码操作例子:
1.读取文本文件
//字符读取
FileReader frr=new FileReader("d://lianxi//s1.txt");//读取指定文件
BufferedReader brr=new BufferedReader(frr);
String line=null;
while ((line=brr.readLine())!=null) {
System.out.println(line );// 按行输出
}
frr.close();
brr.close();
2.复制文本文件
FileReader fr=new FileReader("d://lianxi//s1.txt");//
BufferedReader br=new BufferedReader(fr);
FileWriter fw=new FileWriter("d://lianxi//s3.txt");//
BufferedWriter bw=new BufferedWriter(fw);
//逐行读取并写入文件
while (br.ready()) {
bw.write(br.readLine()+"\n");
}
bw.flush();
bw.close();
fw.close();
fr.close();
br.close();
3.二进制文件复制
DataInputStream dis = new DataInputStream(new FileInputStream("d://lianxi//XML符号的用途.PNG"));
DataOutputStream dos = new DataOutputStream(new FileOutputStream("d://lianxi//XML.PNG"));
//-1表示读取完
byte[]bytes=new byte[1024];
int get=-1;
while ((get=dis.read(bytes))!=-1) {
dos.write(bytes, 0, get);
}
dos.close();
dis.close();
4.创建文件
try {
//构造文件
File file =new File("d:/lianxxxi/test.txt");
//判断file是否是一个文件
if (!file.exists()) {
//得到父级目录
String parent =file.getParent();
System.out.println("父级目录:"+parent);
File directory=new File(parent);
if (!directory.exists()) {
directory.mkdirs();
}
}
//创建文件
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5.字节流的读取
try {
//创建文件流
FileInputStream fis=new FileInputStream("d:/lianxxxi/test.txt");
int size=fis.available();
System.out.println("可读取字节数为:"+size);
//方法二
int line;
while ((line=fis.read())!=-1) {
char a=(char) line;
System.out.println(line+" "+a);
}
//方法一
byte[]bytes=new byte[size];
fis.read(bytes);
for (byte b : bytes) {
char a=(char) b;
System.out.println(a);
}
//关闭流
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
6.以特定的编码格式读写
FileInputStream fis=new FileInputStream("d:/lianxxxi/hahacopy.txt");
InputStreamReader isr=new InputStreamReader(fis, "gbk");
int line1;
while ((line1=isr.read())!=-1) {
char a=(char) line1;
System.out.print (a);
}
fis.close();
isr.close();
//写
FileOutputStream fos=new FileOutputStream("d:/lianxxxi/hapy.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos, "gbk");
String str="haha";
osw.write(str);
fos.close;
osw.flush;
osw.close;
7.复制特定后缀文件名的方法
public class Test {
public static void main(String[] args) throws Exception {
// 得到源目录
File srcDir=new File("F:/java");
if (!(srcDir.exists()&&srcDir.isDirectory())) {
throw new Exception("目录不存在!");
}else {
//得到目录下所有java文件
File [] files=srcDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 返回后缀名为java的文件
return name.endsWith(".java");
}
});
System.out.println(files.length);
//目标目录
File destDir=new File("F:/jad");
if (!destDir.exists()) {
destDir.mkdir();
}
for (File file : files) {
FileInputStream fis=new FileInputStream(file);
String destFileNameString=file.getName().replaceAll("\\.java$", ".jad");
FileOutputStream fos=new FileOutputStream(new File(destDir, destFileNameString));
System.out.println("更改名字后:"+destFileNameString);
copy(fis,fos);//调用方法
fis.close();
fos.close();
}
System.out.println(" 复制完毕!");
}
}
private static void copy(FileInputStream fis, FileOutputStream fos) throws IOException {
int len = 0;
byte[] buf = new byte[1024];
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
}
}