输入和输出处理(一)
文件是相关记录或放在一起的数据的集合
File:文件和目录路径名的抽象表示:
1. 文件和目录是可以通过File封装成对象的
2. 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
File类
File类继承Object类,实现Serializable、comparable
java程序访问文件属性:JAVA API:java.io.File类
File file = new File(String pathname);
//String pathname指 "c\\teast.txt"或者"c:/test.txt"
3种构造方法:
-
File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public static void main(String[] args){ File f1 = new File("E:\\xx\\java.txt"); System.out,print(f1); //输出目录,重写了方法 }
-
File(String parent,String child):从父路径名字符串和子路径名字符串创建新的File实例。
File f1 = new File("E:\\xx","java.txt"); System.out,print(f2);
-
File(File parent,String child):从父抽象路径名和子路径名字符串创建新的 File实例。
File f3 = new File("E:\\xx"); File f4 = new File("java.txt"); System.out,print(f4);
File类的常用方法:
方法名称 | 说明 |
---|---|
boolean exists( ) | 判断文件或目录是否存在 |
boolean isFile( ) | 判断是否是文件 |
boolean isDirectory( ) | 判断是否是目录 |
String getPath( ) | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath( ) | 返回此对象表示的文件的绝对路径名 |
String getName( ) | 返回此对象表示的文件或目录的名称 |
boolean delete( ) | 删除此对象指定的文件或目录 |
boolean createNewFile( ) | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 |
long length() | 返回文件的长度,单位为字节,如果文件不存在,则返回 0L |
boolean mkdir() | 创建由此抽象路径名命名的目录。存在目录返回false,不存在创建目录,返回true |
Boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录(多级目录) |
-
给出了文件名.txt,若调用mkdir()方法,,创建的还会是一个目录。创建啥用什么方法,与使用的方法有关,与路径名无关
-
文件夹下有目录xxxx.txt,在创建xxxx.txt文件,返回false,不可同名,哪怕类型不一样
-
创建文件之前要先创建目录;如果要删除目录,目录下有内容,要先删除里面的文件或目录,在删除最外面的
File f = new File("盘:\\根目录");
//public String[] list():返回此抽象路径名表示的目录中的文件、目录的名称字符串数组
String[] strArray = f.list();
for(String str : strArray){
System.out.println(str);
}
//public File[] listFiles():返回此抽象路径名表示的目录中的文件、目录的File对象数组
File[] fileArray = f.listFiles();
for(File file : fileArray){
Syste.out.println(file); //输出所有文件绝对路径
Syste.out.println(file.getName()); //只得到内部文件和目录名
if(file.isFile()){ //先判断是否是文件
Syste.out.println(file.getName()); //只要文件名
}
}
流
通过流来读写文件:
- 流是一组有序的数据序列
- 以先进先出方式发送信息的通道
InputStream------------------------------------------>OutputStream
流的划分
按照流向分类:
-
输出流:OutputStream和Writer作为基类
-
输入流:InputStream和Reader作为基类
输入输出流是相对于计算机内存来说的
按照处理数据单元划分:
- 字节流
- 字节输入流InputStream基类
- 字节输出流OutputStream基类
- 字符流
- 字符输入流Reader基类
- 字符输出流Writer基类
字节流是8位通用字节流,字符流是16位Unicode字符流
InputStream类常用方法:
InputStream类抽象类,使用要找其子类
- int read()
- int read(byte[] b)
- int read(byte[] b, int off, int len)
- void close()
- int available():可以从输入流中读取的字节数目, available是表示在不阻塞的情况下,还可以读取多少个字节。而不是指这个流还有多长
子类FileInputStream常用的构造方法:
- FileInputStream(File file):指定的File对象表示的文件
- FileInputStream(String name) :指定的名称读取文件
FileInputStream读文本文件步骤:
-
引入相关的类
-
import java.io.IOException; import java.io.FileInputStream;
-
-
构造文件输入流FileInputStream对象
-
FileInputStream fis = new FileInputStream("c:\\test.txt");
-
-
读取文本文件的数据
-
fis.available(); fis.read();
-
-
关闭文件流对象
-
fis.close();
-
OutputStream类常用方法:
- void writer(int c)
- void write(byte[] buf)
- void write(byte[] b, int off, int len)
- void close()
- void flush():强制把缓冲区的数据写到输出流中
子类FileOutputStream常用的构造方法:
-
FileOutputStream (File file)
-
FileOutputStream(String name) :创建输出流以指定的名称写入文件
-
FileOutputStream(String name,boolean append):追加写入
-
第二个参数为true,则字节将追加写入文件的末尾(而不是开头)
FileOutputStream fos = new FileOutputStream("E:\\fos.txt",true);
-
前两种构造方法在向文件写数据时将覆盖文件中原有的内容
创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
FileOutputStream写文本文件步骤:
-
引入相关的类
-
import java.io.IOException; import java.io.FileOutputStream;
-
-
构造文件输入流FileOutputStream对象
-
FileOutputStream fos = new FileOutputStream("test.txt");
-
-
读取文本文件的数据
-
String str = "好好学习java" byte[] words = str.getBytes(); fos.write(words,0,words.length);
-
-
关闭文件流对象
-
fos.close();
-
复制文本文件:
// 1、创建输入流对象,负责读取D:\我的青春谁做主.txt文件
FileInputStream fis = new FileInputStream("D:\\我的青春谁做主.txt");
//2、创建输出流对象,负责将文件内容写入到C:\myFile\my Prime.txt中
FileOutputStream fos = new FileOutputStream("C:\\myFile\\myPrime.txt",true);
// 3、创建中转站数组,存放每次读取的内容
byte words [] = new byte[1024];
// 4、通过循环实现文件读写
while((fis.read())!=-1){ //读取文件
fos.write(words, 0, words.length); //写入文件
}
fos.close();
fis.close()
-
读写数据:复制文本文件一次读取一个字节,一次写入一个字节
int by; while((by=fis.read()!=-1)){ fos.write(by); }
-
一次读取一个字节数组
byte[] bys = new byte[1024];//1024及其整数倍 int len; while((len = fis.read(bys))!=-1){ System.out.println(new String(bys,0,len)); } //len = fis.read(bys)不是定义的长度,而是实际读取的长度
换行:
//换行
fos.write("\r\n".getBytes()); // \r\n:windows换行
fos.write("\n".getBytes()); // \n:linux换行
fos.write("\r".getBytes()); //mac
字节流写数据加异常:
**finally:**在异常处理时提供finally快块来执行所有清楚操作,比如说IO流中的释放资源(xxx.close),被finally控制的语句一定会执行,除非JVM退出
try{
可能出现异常的代码
}catch(异常类名 变量名){
异常的代码处理
}finally{
执行所有的清除操作
}
FileOutputStream fos = null;
try{
fos = new FileOutputStream("存在的目录");
fos.write("hello".getBytes());
}catch(IOException){
e.printStakTrace();
}finally{
if(fos != null){ //判断是否为空,避免空指针
try{
fos.close();
}catch(IOException){
e.printStakTrace();
}
}
}