IO流
File类:
获取功能的方法
- public String getAbsolutePath() :返回此File的绝对路径名字符串。
- public String getPath() :获取的是构造路径(创建该File对象使用的路径)
- public String getName() :返回由此File表示的文件或目录的名称。
- public long length() :返回由此File表示的文件的字节大小。注意不能获取文件夹的字节大小
判断功能的方法
- public boolean exists() :此File表示的文件或目录是否实际存在。
- public boolean isDirectory() :此File表示的是否为目录。
- public boolean isFile() :此File表示的是否为文件。
创建删除功能的方法
- public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
- public boolean delete() :删除由此File表示的文件或目录。注意不能删除非空文件夹,只能删除空文件夹和文件
- public boolean mkdir() :创建由此File表示的目录。
- public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
目录遍历的方法
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
- public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
注意:调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
注意:调用listFiles方法的File对象,表示的目录如果没有访问权限,就会返回null,无法进行遍历。
字节输出流
OutputStream
--FileOutputStream
---public FileOutputStream(String name)
---public FileOutputStream(File file)
字节输入流
--InputStream
---public FileInputStream(String name)
---public FileInputStream(File file)
字符输入流Reader
--Reader
---public FileReader(String fileName)
---public FileReader(File file)
字符输出流Writer
--Writer
---public FileReader(String fileName)
---public FileReader(File file)
eg:拷贝文件
//字节流拷贝文件
File aFile = new File("exercise\\src\\hong\\练习的包\\Day10_io流\\file\\a.txt");
File zhangFile = new File("exercise\\src\\hong\\练习的包\\Day10_io流\\file\\zhang.txt");
FileOutputStream fileOutputStream = new FileOutputStream(zhangFile);
FileInputStream fileInputStream = new FileInputStream(aFile);
byte[] bytes=new byte[1024];
int read ;
while ((read = fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,read);
}
fileInputStream.close();
fileOutputStream.close();
//字符流拷贝文件
FileReader fileReader = new FileReader("exercise\\src\\hong\\练习的包\\Day10_io流\\file\\char.txt");
FileWriter fileWriter = new FileWriter("exercise\\src\\hong\\练习的包\\Day10_io流\\file\\charCopy.txt");
int len;
char[] chars=new char[1024];
while ((len=fileReader.read(chars))!=-1){
fileWriter.write(chars,0,len);
}
fileWriter.write("zhangyuhong",0,5);
fileWriter.close();
fileReader.close();
try catch finally捕获异常
jdk1.7以后IO异常的处理: try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。---->关闭流的操作就不需要了,自动执行
try(创建流对象的语句,如果多个,使用';'隔开){
读写数据
}catch(异常类型 变量名){
}
eg:
try (
// 1.创建字节输入流对象,关联数据源文件路径
FileInputStream fis = new FileInputStream("day11\\aaa\\hb.jpg");
// 2.创建字节输出流对象,关联目的地文件路径
FileOutputStream fos = new FileOutputStream("day11\\aaa\\hbCopy2.jpg");
) {catch (IOException e) {
}
以前的处理方式
try {
}catch(IOException e){
}finally{
判空,捕获异常,一层finally套一层}
缓存io流
字节缓冲流:BufferedInputStream,BufferedOutputStream(传入一个FileInputStream或FileOutputStream)---》无多余的方法
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("path"));
BufferedOutputStream bis = new BufferedOutputStream(new FileOutputStream("path"));
字符缓冲流:BufferedReader,BufferedWriter(传入一个FileReader或FileWriter)-->多了readLine()和newLine()方法
BufferedReader br = new BufferedReader(new FileReader("path"));
BufferedWrite br = new BufferedWrite(new FileWrite("path"));
字符转换io流
转换输入流InputStreamReader
- InputStreamReader(InputStream in) 创建一个转换输入流,使用平台默认的字符编码 idea默认的是utf8,myeclipse是gbk
- InputStreamReader(InputStream in, String charsetName):创建一个转换输入流,通过参数charsetName指定字符编码编码字符串(utf8)(gbk)
InputStreamReader isr = new InputStreamReader(new FileInputStream("path"))
转换输出流OutputStreamWriter
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("path"))
字节序列化io流
(对象持久化,存在本地)
序列化流ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("path"));
方法:
writeObject(person);
1:person对象必须实现Serializable
2:person最好在成员变量位置增加一句static final long serialVersionUID = 42L;-->防止系列化后又改了报错,加了会根据版本查序列化,改了也不会报错,不会修改的值会为默认值
3.如果想让某个属性不参与序列化加一个关键字(transient)
反序列化流ObjectInputStream:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("path"));
方法:
readObject(); ---》不需要加参数,path路径已经代表序列化的对象
PrintStream打印io流
打印流: java.io.PrintStream 输出流
修改System.out.println输出到文本:
PrintStream ps = new PrintStream("指定输出到的路径");
System.setOut(ps);
commons-io工具包:
org.apache.commons.io.IOUtils:(文件操作)
1. public static int copy(InputStream in, OutputStream out); 把input输入流中的内容拷贝到output输出流中,返回拷贝的字节个数(适合文件大小为2GB以下)
2. public static long copyLarge(InputStream in, OutputStream out);把input输入流中的内容拷贝到output输出流中,返回拷贝的字节个数(适合文件大小为2GB以上)
org.apache.commons.io.FileUtils:(文件操作)
1. public static void copyFileToDirectory(final File srcFile, final File destFile) //复制文件到另外一个目录下。
2. public statisc void copyDirectoryToDirectory(File file1 ,File file2 );//复制file1目录到file2目录下
注意:文件夹没有的话会自动建立
Properties属性集类
继承于Hashtable ,来表示一个持久的属性集
3.1 Properties类实现了Map接口,所以可以当成是Map集合使用
3.2 Properties类当成属性集来使用,键和值的类型是String类型
3.3 Properties类可以与流一起使用,来加载文件中的数据
基本存储方法:
- public Object setProperty(String key, String value) : 保存一对属性。
- public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
- public Set<String> stringPropertyNames() :所有键的名称的集合。
与流相关的方法
- public void load(InputStream inStream): 从字节输入流中读取键值对。
- public void load(Reader reader):从字符输入流中读取键值对。
参数中使用了输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了。
文本数据格式: 键值对的格式
文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。
例如:
usrername=zs
password=123456
-----额外-----
void store(Writer writer, String comments) 把Properties对象中的数据保存到指定文件中,comments-->输入的信息,用#号连接加上