IO的使用

版权声明:啥是版权,感觉都是侵权必究。我也会究的。 https://blog.csdn.net/Scan_13286/article/details/87862917

IO流的使用



IO流 即 InputStream 和OutputStrean


File类

File的构造

//表示创建一个文件类,而所需参数为 文件的地址
File file = new File("e:"+File.separator+"abc.txt");

File的方法

File.separator      //表示一个目录的分隔符“/”(斜杠)
file.isDirectory()  //判断file对象是否是目录
file.isFile()       //判断file对象是否是文件
file.length()       //获取file内容长度;如果是目录的话返回0
file.getName()      //获取file的文件名或目录名
file.exists()		//判断File对象对应的文件或文件夹是否存在
file.getAbsolutePath() //获取file的绝对路径
file.listFiles()	//获取当前file下的子文件夹或子文件【以数组形式】

file.createNewFile()  //创建文件file
file.delete()		//删除文件file(删除文件夹不一定成功,依赖于系统规定)

遍历某个目录下的文件和文件夹

public static void Print(File file){
	if(file.isDirectory()){
        if(file.listFiles() != null){
            for(File files:file.listFiles()){
                System.out.println((files.isFile()?"子文件:":"子文件夹:")+files.getName());
                Print(files);
            }
        }
    }
}

InputStream对象和OutputStream对象

这两个对象属于字节流,以字节的方式读取和写入

构造:

//InputStream创建一个输入流,参数可用File对象或path(文件地址)
InputStream is = new FileInputStream(file);
//OutputStream创建一个输出流,参数可用File对象或path(文件地址)
OutputStream os = new FileOutputStream("f:"+File.separator+"temp.txt");

方法

InputStream的方法:

is.read()           		//按照一个一个字节的方式读取文件,直到读到结束返回 -1.
is.read(byte[])				//按照byte的大小读取文件,直到读到结束返回 -1
is.read(byte[] ,off,len)	//按照byte的大小读取文件,中间的值表示偏移量,最后的值表示读取长度
is.close()					//关闭流


OnputStream的方法
os.write()							//按照一个一个字节的方式写文件到目标文件
os.write(byte[])					//将byte的内容写到目标文件
os.write(byte[],off,len)			//将byte的内容写到目标文件,参数意义同上
os.close()							//关闭流

实现将目标文件进行复制

public static void exp3(){
        String fileName = "f:"+File.separator+"abc.txt";
        String fileName2 = "f:"+File.separator+"temp.txt";
        FileInputStream is = null;
        FileOutputStream os = null;
        try{
            is = new FileInputStream(fileName);     //创建输入流对象
            os = new FileOutputStream(fileName2);   //创建输出流对象
            int data = -1;
            while((data=is.read())!= -1){
                os.write(data);
            }
            is.close();
            os.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

Reader对象和Writer对象

这两个对象属于字符流,以字符的方式读取和写入

构造

//创建一个输入字符流,参数可为File对象,以可为path(文件路径)
Reader reader = new FileReader(fileName);
//创建一个输出字符流,参数可为File对象,以可为path(文件路径)
Writer writer = new FileWriter(filename);

方法

//Reader的方法
reader.read()           		//按照两个个字节(一个字符)的方式读取文件,直到读到结束返回 -1.
reader.is.read(char[])			//按照char的大小读取文件,直到读到结束返回 -1
reader.read(char[] ,off,len)	//按照char的大小读取文件,中间的值表示偏移量,最后的值表示读取长度
reader.close()					//关闭流


//Writer的方法
writer.write(str)						//将字符串直接写入到目标文件
writer.write(char[])					//将char[]内容直接写入到目标文件
writer.write(char[],off,len)			//将char[]内容直接写入到目标文件,参数意义同上
writer.write(str,off,len)				//将字符串直接写入到目标文件,参数意义同上
writer.close()							//关闭流

替换文件中的内容:

原文件内容
在这里插入图片描述

public static void ChangeStr(){
        String filename = "f:" + File.separator + "abc.txt";
        try {
            Reader reader =  new FileReader(filename);
            char[] cbuf = new char[2];
            String str = "";
            while(reader.read(cbuf) != -1){
                str += String.copyValueOf(cbuf);
            }
            str = str.replace("{name}","admin");
            str = str.replace("{sex}","no");
            str = str.replace("{city}","地球");
            //System.out.println(str);
            Writer writer = new FileWriter(filename);
            writer.write(str);
            reader.close();
            writer.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行ChangeStr()方法后 - ->
在这里插入图片描述


BufferedReader对象和BufferedWriter对象

输入字符缓冲流和输出字符缓冲流

构造方法

//创建输入字符缓冲流,参数要是Reader对象
BufferedReader br = new BufferedReader(new FileReader(filename))
//创建输出字符缓冲流,参数要是Writer对象
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));

方法

//BufferedReader的方法
br.readLine()			//按照读取行的方式读取文件内容,放在内存中
br.skip(n)				//跳过n个字符后读取,返回实际跳过的字符数
br.read()				//按照读取字符的方式读取文件内容,放在内存中
br.read(char[])			//同Reader,读取内容放在内存中
br.close()				//关闭流


//BufferedWriter的方法
bw.write(str)			//将str写入内存中
bw.write(char[])		//将char中内容写入内存中
bw.newLine()			//写入换行符
bw.flush()				//刷新流,真实写入文件中。
bw.close()				//关闭流

替换文件内容:

原文件内容
在这里插入图片描述

public static boolean exp2(String name,String sex,String city){
        try {
            BufferedReader br = new BufferedReader(new FileReader(filename));
            BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
            String str = null;
            while ((str = br.readLine()) != null){      //读取文件行
                str = str.substring(0,str.indexOf(":")+1)+(str.substring(3,str.indexOf(":")).equals("姓名")?name:((str.substring(2,str.indexOf(":")).equals("性别"))?sex:city));
                bw.write(str);
                bw.newLine();
            }
            bw.flush();
            br.close();
            bw.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

执行exp2("aaa","男","火星");
在这里插入图片描述


小结:

字节流和字符流的区别:

字节流表示每次只读取一个字节,字符流表示每次读取两个字节(也就是一个字符),中文字符都是以两个字节组成的,如果使用字节流来读取中文,则会先读取一半,再读取另一半,可能造成乱码。

从两者read()方法也可以看出,一个可以将读取的内容放在byte[]中,而一个是放在char[]中。

字符流和字符缓冲流的区别:

字符流是从硬盘中一个一个读取,【而缓冲流是将文件内容放在内容中,从内存中读取】,相比较而言,缓冲流的速度是比字符流快的。

缓冲流有readLine()方法,可以直接按行读取,而字符流没有。

缓冲流的注意点:

缓冲流写入后,要调用flush()方法,对流进行刷新,将流中的内容传输到文件中。

要避免错误调用flush()方法造成的文件覆盖。

猜你喜欢

转载自blog.csdn.net/Scan_13286/article/details/87862917