对于I/O流一直有种云里雾里的感觉,感觉学习的不深入,用的也不是很好,今天写这篇学习笔记,也没有深入的剖析,仅仅是加深一下用法体会。
我相信很多人一开始都会有这样一个迷惑,到底什么是输入流什么输出流,什么样的情况用输入流,什么时候又要用的是输出流呢?以FileInputStream和FileOutputStream为例,就我而言,用一个笨办法来分清输入输出,out是往外出,取它的反义,那FileOutputStream对应的就是写入情况,即往一个文件中写入内容;in是进入,取反义就是出去,那FileInputStream对应的就是读取的情况,即从一个文件中读取内容。同理以read和write结尾的也是这样区分;当然按照正常的思维,这个图应该帮助大家更形象的理解。
一、首先了解一下File类
了解一下File类中的基本方法和常量
1)File中常用的两个常量File.separator(输出为\) 和File.pathSeparator(输出为;)
定义一个路劲一般就直接定义比如:String str = "D:\\Hello.txt",但是这种在不同的系统中不通用,跨平台性能有局限性,但是使用File自带的常量就可以解决这种跨平台问题比如:
Strign str = "d:"+File.separator+"Hello.txt";
2)创建一个新的文件
public class Hello{
public static void main(String[] args){
String fileName = "F:"+File.separator+"Hello.txt";
File f = new File(fileName);
try{
f.createNewFile();
}catch(Exception e){
e.printStackTrace;
}
}
}
3)删除一个文件
public class Hello{
public static void main(String[] args){
String fileName = "F:"+File.separator+"Hello.txt";
File f = new File(fileName);
if(f.exists()){
f.delete();
}else{
System.out.println("文件不存在");
}
}
}
4)创建一个文件夹
public static void Method(){
String fileName = "f:"+File.separator+"Hello";
File f = new File(fileName);
f.mkdir();
}
5)列出指定目录的全部文件
public static void Method5(){
String fileName = "f:"+File.separator;
File f = new File(fileName);
//String[] str = f.list();//列出的不是完成路劲,返回的是String数组
File[] str = f.listFiles();//这个列出的是完整路劲,返回的是File数组
if(str.length>0){
for(int i = 0;i
}
}
}
6)判断一个文件是否是文件夹
public void method(){
String fileName = "f:"+File.separator;
File f = new File(fileName);
if(f.isDirectory){
System.out.println("是文件夹);
}else{
System.out.println("不是文件夹");
}
}
7)搜索指定目录下的全部内容
public static void Method6(){
String fileName = "f:"+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.length>0){
for(int i = 0; i
}
}
}else{
System.out.println(f);
}
}
}
二、I/O流
从流的方向,可以分为输入流(inputStream,reader)和输出流(outputStream,writer)
从流的应用,可以分为字节流(inputStream,outputStream)和字符流(reader,writer)
1)字节流写入文件
public void method(){
String fileName = "F:"+File.separator+"Hello.txt";
File f = new File(fileName);
OutputStream out = new FileOutputStream(f);
String str = "你好";
byte[] b = str.getBytes();
out.write(b);//这里也可以一个一个字节的写
/**
for(int i = 0;i
out.write(b[i]);
}
*/
out.close();
}
2)字节流读取文件
public void method(){
String fileName = "f:"+File.separator+"Hello.txt";
File f = new File(fileName);
InputStream in = new FileInputStream(f);
byte[] b = new byte((int)f.length);//跟文件的大小一样的内存,这样避免浪费
int temp = 0;
int count = 0;
while((temp = in.read())!=-1){
b[count++] = (byte)temp;
}
in.close();
System.out.println(new String(b));
}
3)字符流写文件
public void method(){
String fileName = "F:"+File.separator+"Hello.txt";
File f = new File(fileName);
Writer out = new FileWriter(f);
String str = "你好";
out.write(str);
}
4)字符流读文件
public void method(){
String fileName = "f:"+File.separator+"Hello.txt";
File f = new File(fileName);
Reader in = new FileReader(f);
char[] c = new char[(int)f.length()];
int temp = 0;
int count = 0;
while((temp = in.read())!=-1){
c[count++] = (char)temp;
}
in.close();
System.out.println(new String(b));
}
==>字符流写文件和字节流效果没什么区别,只不过字符流在写入的时候需要先转换成字节文件,而字符流可以直接读取字符。对于输入流的read()方法,
Reader read = new FileReader(fileName);
char[] c = new char[100];
read.read(c);//当以这种方式一次性读取的时候,read()方法返回的是数组的长度
------------------------------------------------------------
int temp = 0;
int count = 0;
while((temp = in.read())!=-1){
c[count++] = (char)temp;
}
当以这种一个一个的读取的方式,read()返回的是每个每个字符对应的int型整数5)使用程序复制文件
public void method(){
String fileName1 = "d:"+File.separator+"Hello.txt";
String fileName2 = "f:"+File.separator+"Hello.txt";
File f1 = new File(fileName1);
File f2 = new File(fileName2);
if(!f2.exists()){
System.out.println("被复制的文件不存在");
}
InputStrean in = new FileInputStream(f2);
OutputStream out = new FileOutputStream(f1);
int tem = 0;
while((tem = in.read())!=-1){
out.write(tem);
}
in.close();
out.close();
}
6)将字节输出流转换成字符输出流
public void method(){
String fileName = "f:"+File.separator+"Hello.txt";
File f = new File(fileName);
Writer out = new OutputStreamWriter(new FileOutputStream(f));
out.write("你好");
out.close();
}
7)将字节输入流转换成字符输入流
public void method(){
String fileName = "f:"+File.separator+"Hello.txt";
File f = new File(fileName);
Reader in = new InputStreanReader(new FileInputStrean(f));
char[] c = new char[(int)f.length];
in.read(c);
System.out.println(new String(c));
in.close()
}