字符编码:
英国字符集:ISO8859-1:26个英文字母和十个数字
中国字符集:(简体中文)GBK GB2312 繁体中文:BIG5
全球通用:UTF-8,占用资源比较少
一、文件操作
⒈ C、d、e、盘相当于大文件夹
⒉ Java中的java.io.File类表示一个目录(文件夹)或者一个文件
⒊ File的构造方法:file(路径(egc:/windows))
⒋盘符:windows:‘\’;unix或max os:’/’,Windows兼容unix中的盘符,但当\与后面字符构成转义字符时,要用“\\”来表示'\',File.separator会判断你的系统,当为unix翻译为‘/’,当为windows翻译为‘\’
⒌File常用方法:
① isFile():判断是否为文件
② isDirectory():判断是否为文件夹
③ canRead():是否可读
④ canWrite():是否可写
⑤ execute():是否为可执行文件
⑥ ishidden():是否为隐藏文件
⑦ getName():获得文件名
⑧ getParent():获得路径名根目录(盘)
⑨ getpath():获得文件完整路径
⑩ exists():文件是否存在
⑪ length():字节大小
⑫ delete():删除空文件夹
⑬ LastModifid():返回最后一次修改时间 返回long型
⑭ Long startTimecurrentTimeMillis():显示当前时间
⑮ mkdir():建一个文件夹只有一层极
⑯ createNewFile();创建文件(当文件不存在时会自动创建)
⑰ mkdirs():创建一个多层级的文件夹(egc:/hehe/haha/lala)
⑱ list():返回目标下所有文件、文件夹名字,但没法读出子文件、子文件夹,返回的是String[]
⑲ ListFiles():返回目标路径下所有文件、文件夹对象,返回File[]
注意:File file=new File(路径);当路径不存在时,不会报错,所以一般要先判断是否存在
二、递归算法
三、设计模式:装饰者模式(JAVA中I/O里的),装饰后会增强功能
对于输入流:inputStream是抽象组件,FileInputStream是被装饰者包裹起来的具体组,BufferedInputStream、dataInputStream、ObjectInputStream就是装饰者
输出流、字符流类似
流的分类:1、字节流、字符流 2、输入流、输出流
字节流 字符流
输入流 父→inputStream 父→Reader
子→FileInputStream 子→InputStreamReader
孙→BufferedInputStream 孙→FileReader
孙→dataInputStream 子→BufferedReader(读时末尾返回null)
子→ObjectInputStream
输出流父→OutputStream 父→Writer
子→FileOutputStream 子→OutputStreamReader
(有追加FileOutputStream(file,boolean)) 孙→FileWriter(有追加FileWriter(outputStream,boolean)),FileWriter(writer,boolean))
孙→BufferedOutputStream
孙→DataOutputStream 子→bufferedWriter
子→ObjectOutputStream 子→PrintWriter(有追加,PrintWriter(outputStream,boolean),PrintWriter(writer,boolean))
字节流
Ⅰ、inputStream:1、抽象类2、是所有字节输入流类的超类。
常用方法:
Close():关闭流并释放与该流关联的所有系统资源
read():从输入流中读取数据的下一个字节,一个字节一个字节的读(返回0
到255
范围内的int
字节值。达流末尾而没有可用的字节,则返回值-1,
因是Abstract所以子类必须提供此方法的一个实现)
read(byte[] b): 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
(eg byte[51]是缓存,在硬件允许的条件下,数组的元素数越大速度越快,但同一数运行多次结果不一致)
int read(byte[] b,int off, int len) :将输入流中最多len 个数据字节读入 byte 数组。
Ⅱ、OutputStream :
close(): 关闭此输入流并释放与该流关联的所有系统资源。
flush():刷新此输出流并强制写出所有缓冲的输出字节(压缩文件打不开是因没传完而缺少字节,flush的作用就是在流关闭前间所有缓存里的东西写到硬盘上)
write(byte[] b) :将b.length 个字节从指定的 byte 数组写入此输出流。
write(byte[] b,int off, int len) :将数组b
从b[off]开始 len 个字节按顺序写入此输出流,元素b[off]是此操作写入的第一个字节(如果b 为null,则抛出NullPointerException。
如果off 为负,或len 为负,或者off+len 大于数组b 的长度,则抛出IndexOutOfBoundsException)。
write(int b): 将指定的字节写入此输出流,是Abstract方法OutputStream 的子类必须提供此方法的实现
Ⅲ、FileInputStream:从文件系统中的某个文件(诸如图像数据之类)中获得输入字节。哪些文件可用取决于主机环境。
主要构造方法:
FileInputStream(File file) : 通过打开一个到实际文件(由File对象 file 指定)的连接(即路径)来创建一个FileInputStream ,作用是来表示此文件连接
如果指定文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取,则抛出 FileNotFoundException。
主要方法:
Close():关闭流并释放与该流关联的所有系统资源
及继承InputStream的方法
Ⅳ、FileOutputStream:用于写入诸如图像数据、压缩文件之类的原始字节的流
主要构造方法:
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
主要方法继承OutputStream
****************************************************************************************************************************************************************************************************************************
Ⅴ、BufferedInputStream:为另一个输入流添加一些功能即缓冲功能,在创建BufferedInputStream 时,会创建一个内部缓冲区数组。
主要构造方法:
BufferedInputStream(InputStream in) :创建一个 BufferedInputStream并保存其参数,即输入流in,以便将来使用。
主要方法: read(byte[] b, int off, int len)返回 int型
read():返回int型
Ⅵ、BufferedOutputStream:本身带有缓冲功能
主要构造方法:
BufferedOutputStream(OutputStream out): 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
主要方法:close(), flush(),write(byte[] b),write(byte[] b,int off, int len)
****************************************************************************************************************************************************************************************************************************
package yaoxia.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyTest1 {
public static void main(String[] args) throws IOException {
File file=new File("F:/tom.txt");
File toFile=new File("d:/xia.sql");
InputStream input=new FileInputStream(file);
OutputStream output=new FileOutputStream(toFile);
BufferedInputStream bis=new BufferedInputStream(input);
BufferedOutputStream bos=new BufferedOutputStream(output);
int len;
byte[] buffer = new byte[4096];
long time=System.currentTimeMillis();
while((len=bis.read(buffer))!=-1){
bos.write(buffer, 0, len);
}
bos.flush();
bos.close();
bis.close();
System.out.println(System.currentTimeMillis()-time);
}
}
****************************************************************************************************************************************************************************************************************************
Ⅶ、dataInputStream:DataInputStream(InputStream in)使用指定的底层InputStream 创建一个 DataInputStream,作用是可进行基本数据类型转换
主要方法:
int read(byte[]b) ,int read(byte[] b, intoff, int len), boolean readBoolean() bytereadByte(),char readChar() ,double readDouble(), float readFloat() ,readUTF()返回字符串
Ⅷ、DataOutputStream:
构造方法:DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流。
方法:writer基本数据类型()
注意:在读取时,要按照写入的顺序读,不然会报错
****************************************************************************************************************************************************************************************************************************
package yaoxia.io;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class DataInputStreamTest {
public static void main(String[] args) throws IOException {
//读出
DataInputStream dataInputStream=new DataInputStream(new FileInputStream(new File("d:/lily.txt")));
boolean isOk=dataInputStream.readBoolean();
char age=dataInputStream.readChar();
String name=dataInputStream.readUTF();
System.out.println("isOk:"+isOk+"\tage:"+age+"\tname:"+name);
dataInputStream.close();
//写入
/*OutputStream output=new FileOutputStream("d:/lily.txt");
DataOutputStream dataOutputStream=new DataOutputStream(output);
//注意不能输入2个相同类型的数据,不然在读取时会报错
dataOutputStream.writeBoolean(true);
dataOutputStream.writeChars("lalalla");
dataOutputStream.writeUTF("lily");
dataOutputStream.flush();
dataOutputStream.close();
*/
}
}
****************************************************************************************************************************************************************************************************************************
Ⅸ、ObjectInputStream :反序列化
构造方法:
ObjectInputStream(InputStream in) :创建从指定InputStream 读取的 ObjectInputStream。
方法: read()
read(byte[] buf, int off, int len)
readBoolean() :读取一个 boolean值。
readByte() :读取一个 8 位的字节。
readUTF()
Ⅹ、ObjectOutputStream:序列化,将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
主要方法:
write(byte[] buf)
write(byte[] buf, int off, int len) :写入字节的子数组。
write(int val) :写入一个字节。
writeBoolean(boolean val) :写入一个 boolean值。
writeByte(int val) :写入一个 8 位字节。
writeBytes(String str) :以字节序列形式写入一个String。
writeChar(int val) :写入一个 16 位的 char 值。
writeChars(String str) :以 char 序列形式写入一个String。
writeDouble(double val) :写入一个 64 位的 double 值。
writeFloat(float val) :写入一个 32 位的 float 值。
writeInt(int val) :写入一个 32 位的 int 值。
writeLong(long val) :写入一个 64 位的 long 值。
writeObject(Object obj) :将指定的对象写入Object
writeUTF(String str) :以 UTF-8 修改版格式写入此 String 的基本数据。
注意:1、NotSerializableException:代表对象无法进行序列化(反序列化)操作
2、ObjectOutputStream 和ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。只有支持 java.io.Serializable接口的对象才能从流读取。
3、.Serializable接口:无构造方法、方法、属性,就是一个标签,由此标签就可进行序列化、反序列化
4、若果父类是一个支持序列化的类,则子类也是支持序列化的操作
5、如果类中包含有不可序列化的对象,那么依然不能进行序列化
6、强烈建议所有序列化类添加javastatic final long .SerialversionUID=×××L;
7、transient:使用该修饰符的属性,不参加序列化和反序列化
PrintStream→FileOutputStream→OutputStream→Object
PrintStream:为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出IOException
将一个实体类的一个对象写入或读出
****************************************************************************************************************************************************************************************************************************
实体类
package yaoxia.io;
import java.io.Serializable;
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String sex;
private int age;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
***************************************************************************************************
package yaoxia.io;
import java.io.Serializable;
public class Address implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
}
****************************************************************************************************
package yaoxia.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/alex.txt"));
Student stu=(Student)ois.readObject();
System.out.println("age:"+stu.getAge()+"\tname:"+stu.getName()+"\tsex:"+stu.getSex()+"\taddress"+stu.getAddress());
ois.close();
/*ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/alex.txt"));
Student stu=new Student();
Address add=new Address();
stu.setAge(20);
stu.setName("alex");
stu.setSex("female");
stu.setAddress(add);
oos.writeObject(stu);
oos.flush();
oos.close();
*/
}
}
****************************************************************************************************************************************************************************************************************************
System.in System.outI
字段解析:in:标准输入即键盘输入 Out:屏幕输出
1、 System.in的返回值是inputStream
2、Scanner input=newScanner(file);和Scanner input=new Scanner(System.in)的区别
Scannerinput=new Scanner(file):从文件里以空格、回车、换行为间隔符,每next()下在控制台上显现一个文件里的内容
Scanner input=new Scanner(System.in):程序一直等到你输入即阻塞式操作或同步操作;但是他是以行为基准,只要是在一行上都会输出(即使有空格)
2、 System.out返回的是printStream,所以System.out就相当于printStream
3、System.setOut(new PrintStream(File):更改文件里的内容,改变以往的将键盘输入写在控制台上,这里是写在文件里
****************************************************************************************************************************************************************************************************************************
package yaoxia.io;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class OtherTest {
public static void main(String[] args) throws IOException {
//从文件里以空格、回车、换行为间隔符,每next()在控制台上显现一个文件里的内容
/* Scanner input=new Scanner(new File("d:/tom.txt"));
String str=input.next();
System.out.println(str);
String str1=input.next();
System.out.println(str1);
*/
//更改文件里的内容,改变以往的将键盘输入写在控制台上,这里是写在文件里
/*System.setOut(new PrintStream(new File("d:/tom.txt")));
System.out.println("春眠不觉晓");*/
/*一直等到你输入:阻塞式操作或同步操作;但是他是一行为基准,
只要是在一行上都会输出(即使有空格)*/
//system.in 返回的是inputStream
/*Scanner input=new Scanner(System.in);
String str=input.nextLine();
System.out.println(str);*/
//System。out 返回的是printStream,所以System.out就相当于printStream
PrintStream ps=new PrintStream("d:/tom.txt");
ps.println(10);
}
}
****************************************************************************************************************************************************************************************************************************
字符流
字符流操作的整体思路是:将字节流转换为字符流,然后对字符流进行装饰;但FileWriter不用将将字节流转换成字符流,直接将文件转换为字符流
Ⅰ、Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以便利用。
主要构造方法:
Reader(): 创建一个新的字符流 reader,其重要部分将同步其自身的 reader。
主要方法:
close():关闭该流并释放与之关联的所有资源。是abstract的
read():读取单个字符。返回int型
read(char[] cbuf):将字符读入数组。返回int型
read(char[] cbuf,int off, int len) :将字符读入数组的某一部分,是abstract的
Ⅱ 、Writer:写入字符流的抽象类。子类必须实现的方法write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以便利用。
主要构造方法:
Writer():创建一个新的字符流 writer,其关键部分将同步 writer 自身。
主要方法:
close() :关闭此流,但要先刷新它,是abstract的
flush() :刷新该流的缓冲,是abstract的。
write(char[]cbuf) :写入字符数组。
write(char[]cbuf, int off, int len) :写入字符数组的某一部分。是abstract的
write(intc) :写入单个字符。
write(Stringstr) :写入字符串。
write(Stringstr, int off, int len) :写入字符串的某一部分。
Ⅲ、InputStreamReader:是字节流通向字符流的桥梁
主要构造方法:
InputStreamReader(InputStream in) :创建一个使用默认字符集的InputStreamReader。
主要方法:
close() :关闭该流并释放与之关联的所有资源。
read() :读取单个字符,返回int型
read(char[]cbuf, int offset, int length) :将字符读入数组中的某一部分,返回int 型
Ⅳ、OutputStreamWriter :是字符流通向字节流的桥梁
主要构造方法:
OutputStreamWriter(OutputStream out) :创建使用默认字符编码的OutputStreamWriter。
注意:有时在写入汉字时会出现乱码,为避免此现象用new OutputStreamWriter(out,“UTF-8”)
主要方法:
close() :关闭此流,但要先刷新它。
flush() :刷新该流的缓冲。
write(char[]cbuf, int off, int len) :写入字符数组的某一部分。
write(intc) :写入单个字符。
write(Stringstr, int off, int len) :写入字符串的某一部分。
Ⅴ、FileReader:用来读取字符文件的便捷类
主要构造方法:
FileReader(File file) :在给定File 的情况下创建一个新 FileReader。
方法继承Reader、InputStreamReader和Object
Ⅵ、FileWriter:用来写入字符文件的便捷类
主要构造方法:
FileWriter(File file) :根据给定的 File 对象构造一个新的FileWriter 对象。
FileWriter(Filefile, boolean append) :根据给定的 File 对象构造一个新的 FileWriter 对象。当append是false时,值与FileWriter同;当为true时,在文件的末尾追加写入一些内容。而其他写入是覆盖。
主要方法继承Writer,InputStreamWriter和Object
****************************************************************************************************************************************************************************************************************************
package yaoxia.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) throws IOException {
/*FileWriter fw=new FileWriter("d:/tom.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("llaalallallall");
bw.flush();
bw.close();*/
FileReader fr=new FileReader("d:/tom.txt");
BufferedReader br=new BufferedReader(fr);
String str;
while((str=br.readLine()) != null){
System.out.println(str);
}
}
}
****************************************************************************************************************************************************************************************************************************
Ⅶ、BufferedReader:在从字符输入流中读取文本时缓冲各个字符即提供缓存,从而实现字符、数组和行的高效读取
主要构造方法:
BufferedReader(Reader in) :创建一个使用默认大小输入缓冲区的缓冲字符输入流。
主要方法:
close() :关闭该流并释放与之关联的所有资源。
read() :读取单个字符返回int
read(char[]cbuf, int off, int len) :将字符读入数组的某一部分返回int
readLine():读取一个文本行返回String,一次读一行,末尾返回null
注意:换行\n,回车\r,但在windows xp中\r\n是换行
Ⅷ、BufferedWriter:将文本写入字符输出流,具有缓冲各个字符的作用,从而使单个字符、数组和字符串的高效写入。
主要构造方法:
BufferedWriter(Writer out) :创建一个使用默认大小输出缓冲区的缓冲字符输出流。
主要方法:
close() :关闭此流,但要先刷新它。
flush() :刷新该流的缓冲。
newLine():写入一个行分隔符。
write(char[]cbuf, int off, int len) :写入字符数组的某一部分。
write(intc) :写入单个字符。
write(Strings, int off, int len) :写入字符串的某一部分。
****************************************************************************************************************************************************************************************************************************
package yaoxia.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.util.Scanner;
public class BufferedRWTest {
public static void main(String[] args) throws IOException {
/*Scanner input=new Scanner(System.in);
System.out.println("请输入文本");
String str=input.next();
FileOutputStream fos=new FileOutputStream(new File("d:/poliy.txt"));
OutputStreamWriter ow=new OutputStreamWriter(fos);
BufferedWriter br=new BufferedWriter(ow);
br.write(str);
br.flush();
br.close();*/
FileInputStream fis=new FileInputStream("d:/poliy.txt");
Reader reader=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(reader);
String str;
while((str=br.readLine())!=null){
System.out.println(str);
}
br.close();
}
}
****************************************************************************************************************************************************************************************************************************
Ⅸ、PrintWriter:向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法
主要构造方法:
PrintWriter(Filefile) :用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(OutputStreamout) :据现有的 OutputStream 创建不带自动行刷新的PrintWriter。
PrintWriter(OutputStreamout, boolean autoFlush) :追加创建
PrintWriter(StringfileName) :建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter(Writerout) :建不带自动行刷新的新 PrintWriter。
PrintWriter(Writerout, boolean autoFlush) :建新 PrintWriter。
主要方法:
close() ,flush(),
write(char[]buf) :写入字符数组。
write(char[]buf, int off, int len) :写入字符数组的某一部分。
write(intc) :写入单个字符。
write(Strings) :写入字符串。
write(Strings, int off, int len) :写入字符串的某一部分。
****************************************************************************************************************************************************************************************************************************
package yaoxia.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class SumTest {
public static void main(String[] args) throws IOException {
/* FileOutputStream fos=new FileOutputStream("d:/tom.txt",true);
OutputStreamWriter os=new OutputStreamWriter(fos);
BufferedWriter bw=new BufferedWriter(os);
for(int i=0;i<10;i++){
bw.write("\n*************\r\n");
}
bw.flush();
bw.close();
FileInputStream fi=new FileInputStream("d:/tom.txt");
InputStreamReader is=new InputStreamReader(fi);
BufferedReader br=new BufferedReader(is);
String str;
//在读出是根据写入形式读出的
while((str=br.readLine())!=null){
System.out.println(str);
}
br.close();*/
/*PrintWriter pw=new PrintWriter("d:/tom.txt");
BufferedWriter bw=new BufferedWriter(pw);
bw.write("hehhehheh ");
bw.flush();
bw.close();*/
FileWriter fw=new FileWriter("d:/tom.txt",true);
BufferedWriter bw=new BufferedWriter(fw);
bw.newLine();//用来换行的
bw.write("xix9xiixixixixixiix");
bw.flush();
bw.close();
}
}