JAVA.Io总结

 

字符编码:

英国字符集: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():从输入流中读取数据的下一个字节,一个字节一个字节的读(返回0255 范围内的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();









}


}

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值