1.File类

  File类被定义为“文件和目录路径名的抽象表示形式”,这是因为File类既可以表示“文件”也可以表示“目录”,他们都通过对应的路径来描述。通过构造函数创建一个File类对象,则该对象就是指定文件的引用,可以通过该对象对文件操作。通过File对象,可以获取文件的属性值(文件大小,能否读写,最后修改时间等)。File对象不能对文件进行读取和写入的操作,如果想要对文件进行读写,那么要使用IO流。

  以下函数是File类使用示例。它的功能是,将一个文件的路径传入函数,函数判断此路径是否有文件,如果此路径没有指向任何文件或目录,那么判断这个路径里是否有".",如果有,那么创建这个路径的文件,如果没有,创建这个目录。如果有文件,则判断此路径是文件还是目录,如果是文件,则显示它的一系列属性,如果是目录,那么后续用递归的方式显示它及其子目录下的文件。文件路径有两种表示方法,一种是绝对路径,一种是相对路径。绝对路径是带盘符的,相对路径是相对于当前目录的路径。

 public void testFile(String path){
File file = new File(path);
if(file.exists()){
//如果文件存在,再获取属性值
//TODO:获取文件大小
if(file.isFile()){
System.out.println("文件大小"+file.length()); //TODO:文件是否可读,可写
System.out.println("是否能写:"+file.canWrite());
System.out.println("是否可读:"+file.canRead());
//TODO:获取最后修改时间
//Date date = new Date();
SimpleDateFormat sfm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = sfm.format(file.lastModified());
System.out.println("文件最后修改时间:"+str); }
else if(file.isDirectory()){
System.out.println("sdfsf");
this.listFiles(file);
//这个函数递归列出所有子目录及文件,在后续会有提及
}
}else{
System.out.println("文件不存在"+path);
if(path.contains(".")){
try {
//创建文件
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{ //创建目录:file.mkdir(); 创建单目录
//file.mkdirs();循环创建目录,没有的话可以创建上层目录
file.mkdirs();
}
}
}

  以下是递归调用listFiles(file)重载递归的函数实现。思想是先用listFiles获取当前目录下的所有列表,显示所有列表的名字,如果当前列表还是个目录,那么调用自身,进行子目录的遍历输出。

 public void listFiles(File file){
File [] files = file.listFiles();//获取当前目录下所有列表
for(File one :files){
System.out.println("名字:" + one.getName());
//TODO:如果是目录,继续遍历列出
if(one.isDirectory()){
listFiles(one);
}
}
}

2.字节流

  字节流抽象类是InputStream和OutputStream,它们的实现的子类是FileInputStream和FileOutputStream。此处我们使用FileInputStream和FileOutPutStream解决文件读写问题。读入的思想是当需要把文件的内容读入程序时,要申明一个Byte字节数组,将FileInputStream对象读入数组。当没读完的时候,返回读取的长度。当读完的时候,返回-1。当使用完流的时候,要记得关闭流。FileOutputStream写的时候也是需要将写的东西转换为Byte数组写入文件,写完关闭流。

 public static void Input(String path) throws IOException {
//构建一个InputStream对象 1、打开流
FileInputStream fin = new FileInputStream(path);
byte[] buf = new byte[1024];
int iread = 0;//读取的实际长度
//TODO:2、读取文件内容
while((iread = fin.read(buf)) != -1){
System.out.println(new String(buf));
System.out.println("*****************我已读"+iread+"**************");
}
//TODO:3、关闭流
fin.close();
}
public static void Output(String path) throws IOException {
//1.打开
FileOutputStream oup = new FileOutputStream(path);
String string = "道可道非常道";
//2.写
oup.write(string.getBytes());
//3.关闭
oup.close();
}

  当读完文件之后立刻要写的时候,我们要注意一个问题,就是最后一次存入的时候,可能已经数组里的内容比最后一次读入的多,那么就会最后一次多输出一些上一次读入数组时存的数据。为了解决这个问题,我们采用三个参数的write方式,避免出现乱码。

public static void ReadAndWrite() throws IOException{
//1、打开
FileInputStream fin = new FileInputStream("d:\\uft.txt");
FileOutputStream fout = new FileOutputStream("d:\\www.txt");
//一个读一个写,一块一块操作
int iread = 0;
byte [] buf = new byte[200];
while((iread = fin.read(buf))!=-1){
fout.write(buf,0,iread);
System.out.println(new String(buf));
}//关闭
fin.close();
fout.close();
}

3.字符流

  字符流:操作的数据单元是16位字符,Reader、Writer  文本文件。思想跟字节流类似,不同的是我们使用的字符流FileReader类继承于Reader接口,字符流FileWriter类继承于Writer接口。具体的操作步骤也是打开流,操作流,关闭流的步骤。

 public static void Fileread(String path) throws IOException{
//1、打开流
FileReader fin = new FileReader(path);
//2、
char[] buf = new char[100];//读取的数据
int iread = 0;
while((iread = fin.read(buf)) !=-1){
String str = new String(buf);
System.out.println("[读了"+iread+"]"+str.substring(0, iread));
}
//3、
fin.close();
}
public static void testOut(String path,String str) throws IOException{
FileWriter fr = new FileWriter(path,true);
fr.write(str);
fr.close();
System.out.println("*******************输出完毕!!!*********************");
}

  当需要读完了立马就输入文件的时候也是需要注意之前字节流的那个问题,写的时候要用那个三个参数的write函数,不然会将数组里的所有东西存入文件,会存入多余数据。

public static void testIO(String inPath,String outPath) throws Exception{
//d:\红鲤鱼.txt ->d:\红鲤鱼.out2.txt
//
FileReader fin = new FileReader(inPath);
FileWriter fout = new FileWriter(outPath);
//
char[] buf = new char[100];//读取的数据
int iread = 0;
while((iread = fin.read(buf))!=-1 ){
String str = new String(buf);
fout.write(buf,0,iread);
System.out.println("["+iread+"]"+str.substring(0, iread));
}
//
fin.close();
}

4.带缓冲的字符流

  BufferedReader和BufferedWriter建立的时候需要传入一个Writer或者Reader,构造函数也可以指定缓冲区大小。也就是,BufferedReader是高层流,FileReader是底层流。最后要关闭的时候,要先关闭高层流再关闭底层流。

public static void testOut2() throws IOException{
StringWriter out = new StringWriter();
BufferedWriter fout = new BufferedWriter(out,3);
String string = "ABCDEFG哈哈哈";
for(char c:string.toCharArray()){
fout.write(c);
System.out.println(out.getBuffer().toString());
}
} public static void testIoBuffer(String path1,String path2) throws Exception{
FileReader in = new FileReader(path1);
BufferedReader fin = new BufferedReader(in);
FileWriter out = new FileWriter(path2,true);
BufferedWriter fout = new BufferedWriter(out);
String s;
while((s =fin.readLine())!=null){
fout.write(s);
fout.newLine();
System.out.println(s);
}
//关闭
fout.close();
fin.close();
out.close();
in.close();
}

Java File类与文件IO流总结的更多相关文章

  1. File类与常用IO流第四章——IO字节流

    一切文件在存储时,都是以二进制数字的形式保存的,都是一个一个字节.无论使用什么样的流对象,底层传输的始终是二进制数据. 字节输出流 OutputStream java.io.OutputStream ...

  2. File类与常用IO流第八章——缓冲流

    第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类:   输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...

  3. File类与常用IO流第七章——Properties集合

    Properties概述 java.util.Properties extends Hashtable<k,v> implements Map<k,v> Properties类 ...

  4. File类与常用IO流第五章——IO字符流

    字符流,只能操作文本文件,不能操作图片.视频等非文本文件 字符输入流 java.io.Reader 字符输入流中一些共性的成员方法 int read():读取单个字符并返回. int read(cha ...

  5. File类与常用IO流第二章过滤器

    在第一章中,有一个练习使用递归搜索文件 1 public static void main(String[] args) { 2 File f=new File("E:\\aaa" ...

  6. File类与常用IO流第一章File类

    第一章:File类 一.1个重点单词: file:文件:directory:文件夹/目录:path:路径(绝对路径:absolutePath) 二.4个静态成员变量: 1.static String ...

  7. File类与常用IO流第三章IO流概述

    一:以内存为基准,按照数据的流动方向,流向内存为输入(读取数据),流出内存为输出.IO流有四大顶级父类: IO流四大顶级父类   输入流 输出流 字节流 字节输入流 InputStream 字节输出流 ...

  8. File类与常用IO流第十一章——打印流

    第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...

  9. File类与常用IO流第十章——序列化流

    第十章.序列化流 序列化流和反序列化流概述 序列化:用一个字节序列表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等等信息.字节序列写出到文件后,相当于文件中持久保存了一个对象的 ...

随机推荐

  1. Form-encoded method must contain at least one @Field.

    https://blog.csdn.net/liunian823/article/details/80290855 记得之前遇到过这个问题,并且记录笔记了,这次再翻笔记,却没有找到...搜索 了下. ...

  2. 深入理解C++11【4】

    [深入理解C++11[4]] 1.基于范围的 for 循环 C++98 中需要告诉编译器循环体界面范围.如for,或stl 中的for_each: int main() { ] = { , , , , ...

  3. svn仓库迁移

    注意事项 1.仅迁移代码.日志.版本信息,(用户.权限.配置即conf目录需要手动移动或重新配置) 2.新仓库需无代码,即新建仓库后不要进行上传操作,否则迁移可能造成冲突,导致迁移失败 操作步骤 1. ...

  4. sql yog出现2013错误

    首先用telnet检查一下你的防火墙端口,如果连接失败,配置防火墙. 配置防火墙,开启3306端口 find -name iptables vim /etc/sysconfig/iptables -A ...

  5. ABAP开发相关事务代码

    事务代码 事务描述 事务代码 事务描述 SE37 ABAP/4函数编辑器 BAPI BAPI 浏览器 SE38 ABAP编辑器 LSMW 数据导入工具 SE39 ABAP分屏编辑器 PFCG 权限管理 ...

  6. promise之我见

    在我们平时的方法中有很多方法是promise封装的, 有些函数后边跟的then和catch 就是promise的方法,先看一下pormise的特点 (1)对象的状态不受外界影响.Promise对象代表 ...

  7. route的简单使用

    route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If] add : 添加一条路由规则del : 删除一条路由规则-net ...

  8. 2018-2019-2 20175234 实验二《Java面向对象程序设计》实验报告

    目录 实验内容 实验要求 实验步骤 实验收获 参考资料 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 解设计模式 实验 ...

  9. Python+Selenium 自动化实现实例-处理分页(pagination)

    场景 对分页来说,我们最感兴趣的是下面几个信息 总共有多少页 当前是第几页 是否可以上一页和下一页 代码 下面代码演示如何获取分页总数及当前页数.跳转到指定页数 #coding:utf-8 from ...

  10. kubernetes + istio进行流量管理

    实验目的: 本文介绍如何通过istio实现域名访问k8s部署的nginx服务 前提: 已经安装了kubernetes的服务器 了解 kubernetes 基本命令如何使用 (kubectl creat ...