java总结
File类、字节流字符流、缓冲流转换流序列化流打印流
1.File类
1.1构造方法:
- public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
1.2获取功能的方法:
- public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。
public long length() :返回由此File表示的文件的长度。
1.3判断功能的方法:
- public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile() :此File表示的是否为文件。
1.4创建删除功能的方法
- public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
1.5目录遍历
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
package Demoreview;
import java.io.File;
public class 遍历文件夹 {
public static void main(String[] args) {
File dir = new File("D:\\ideaproject\\basic-code\\test05-code\\src\\cn\\itcast\\test05");
/*System.out.println(file);*/
method(dir);
}
public static void method(File dir){
//获取子文件和目录
File[] files = dir.listFiles();
for (File file:files) {
if (file.isFile()){
System.out.println("文件名:"+ file.getAbsolutePath());
}else{
System.out.println("目录:" + file.getAbsolutePath());
}
method(file);
}
}
}
2.字节流和字符流
- 字节流:InputStream、OutputStream
- 字符流:Reader、Writer
对于文件的字符流和字节流操作一般步骤:
-
根据字节流或字符流的子类实例化父类对象
-
进行数据的读取或写入操作
-
关闭流
字节流是原生的操作,字符流是经过处理后的操作,在对于文件操作时,由于OutputStream和InputStream是一个抽象类,为父类实例化时,必须使用子类FileOutputStream和FileInputStream,同理字符流也一样。
2.1 OutputStream
-
基本功能方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输
出到此输出流。
public abstract void write(int b) :将指定的字节输出流 -
FileOutputStream类
-
构造方法
public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。 -
写出字节数据
1.写出字节: write(int b) 方法,每次可以写出一个字节数据
2.写出字节数组: write(byte[] b) ,每次可以写出数组中的数据
3.写出指定长度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节
4.数据追加续写:
public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据
5.写出换行:
Windows系统里,每行结尾是 回车+换行 ,即\r\n ;
Unix系统里,每行结尾只有 换行 ,即\n ;
Mac系统里,每行结尾是 回车 ,即\r 。从 Mac OS X开始与Linux统一
package Demoreview; import java.io.FileOutputStream; import java.io.IOException; public class DemoFileOutputStream { public static void main(String[] args) throws IOException { //使用文件名称创建流对象 FileOutputStream fos = new FileOutputStream("a.txt"); //定义字符串 String str = "abcde"; //字符串转为字节数组 byte[] bytes = str.getBytes(); fos.write(bytes,2,2); //也可以遍历数组 for (int i = 0; i < bytes.length; i++) { byte aByte = bytes[i]; fos.write(aByte); //写一个换行,换行符转换成数组写出 fos.write("\r\n".getBytes()); } //关闭资源 fos.close(); } }
-
2.2 InputStream
-
基本功能:
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。 -
FileInputStream:
-
构造方法:
FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。 -
读取字节数据
- 读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1
- 使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读
取到末尾时,返回-1
-
package Demoreview;
import java.io.FileInputStream;
import java.io.IOException;
public class DemoFileInputStream {
public static void main(String[] args) throws IOException {
//使用文件名称创建流对象
FileInputStream fis = new FileInputStream("a.txt");
//定义一个变量,作为有效的个数
int len;
//定义字节数组,作为装字节数据的容器
byte[] bytes = new byte[2];
//循环读取
while((len = fis.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
fis.close();
}
}
2.3 Reader
-
为了读取中文字符,采用字符输入流,其基本功能方法有:
- public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 从输入流读取一个字符。
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
- public void close() :关闭此流并释放与此流相关联的任何系统资源。
-
FileReader
-
构造方法
FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称 -
读取字符数据:
- 读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1
- 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,
读取到末尾时,返回-1
-
package Demoreview;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class DemoFileReader {
public static void main(String[] args) throws IOException {
//使用文件名称创建流对象
FileReader fr = new FileReader(new File("D:\\ideaproject\\basic-code\\test-program\\reader.txt"));
//定义一个变量
int len;
//定义字符数组,作为装字符数据的容器
char[] chars = new char[2];
//循环读取
while((len = fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fr.close();
}
}
2.4 Writer
-
基本功能方法:
void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len
写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个
数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。 -
FileWriter
-
构造方法
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。 -
写出数据
1.写出字符: write(int b) 方法,每次可以写出一个字符数据
2.关闭和刷新:若不关闭输出流就无法写出字符到文件中,但若关闭流对象将无法继续写出数据。若既想写出数据又想继续使用数据,就需要flush方法
- flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
- flush :刷新缓冲区,流对象可以继续使用。
-
写出其他数据
1.写出字符数组:write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据
2.写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据,更为方便
3.续写和换行:操作类似于FileOutputStream
-
package Demoreview;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class DemoFileWriter {
public static void main(String[] args) throws IOException {
//使用file对象创建流对象
FileWriter fw = new FileWriter(new File("D:\\ideaproject\\basic-code\\test-program\\writer.txt"));
//将字符串转换成字符数组
char[] chars = "欢迎光临".toCharArray();
//写出字符数组
fw.write(chars);
//写出从索引2开始,2个字节
fw.write(chars,2,2);
fw.flush();
}
}
3.缓冲流
通过缓冲区读写,提高读写效率
字节缓冲流:BufferedInputStream , BufferedOutputStream
字符缓冲流:BufferedReader , BufferedWriter
-
字节缓冲流
-
构造方法:
public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
package Demoreview; import java.io.*; public class DemoBuffere { public static void main(String[] args) { long start = System.currentTimeMillis(); //创建流对象 try ( BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\01.jpg")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\out.jpg")); ){ //读写数据 int len; byte[] bytes = new byte[1024]; while ((len=bis.read(bytes))!=-1){ bos.write(bytes,0,len); } }catch(IOException e){ e.printStackTrace(); } //记录时间 long end = System.currentTimeMillis(); System.out.println(end-start); } }
-
-
字符缓冲流
-
构造方法:
public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。 -
特有方法:
BufferedReader: public String readLine() : 读一行文字。
BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。
-
/*3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉
以咨之,然后施行,必得裨补阙漏,有所广益。
5.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其
咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,
必能使行阵和睦,优劣得所。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不
宜偏私,使内外异法也。
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外
者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以
塞忠谏之路也。*/
package Demoreview;
import java.io.*;
import java.util.HashMap;
public class DemoBuffere02 {
public static void main(String[] args) throws IOException {
//创建map集合,保存文本数据,键为序号,值为文字
HashMap<String, String> map = new HashMap<>();
//创建流对象
BufferedReader br = new BufferedReader(new FileReader("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\out.txt"));
//读取数据
String line = null;
while((line=br.readLine())!=null){
//解析文本
String[] split = line.split("\\.");
//保存到集合
map.put(split[0],split[1]);
}
//释放资源
br.close();
//遍历集合
for (int i = 1; i <= map.size(); i++) {
String key = String.valueOf(i);
//获取map中文本
String value = map.get(key);
//写出拼接文本
bw.write(key+"."+value);
//写出换行
bw.newLine();
}
//释放资源
bw.close();
}
}
4 转换流
常见字符集有ASCII字符集、GBK字符集、Unicode字符集(UTF-8 UTF-16 UTF32编码)等
-
InputStreamReader类
-
构造方法:
InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。
-
-
OutputStreamWriter类
-
构造方法:
OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。
-
//将GBK编码的文本文件,转换为UTF-8编码的文本文件
package Demoreview;
import java.io.*;
public class DemoBuffere02 {
public static void main(String[] args) throws IOException {
//创建流对象
//转换输入流,读取指定GBK文件
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\a.txt"), "GBK");
//转换输出流,默认utf-8
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\ideaproject\\basic-code\\test-program\\src\\Demoreview\\b.txt"));
//读写数据
//定义数组
char[] chars = new char[1024];
//定义长度
int len;
//循环读取
while((len=isr.read(chars))!=-1){
osw.write(chars,0,len);
}
//释放资源
osw.close();
isr.close();
}
}
5.序列化
用一个字节序列表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性
对象——>字节:ObjectOutputStream序列化
字节——>对象:ObjectInputStream反序列化
-
构造方法:
public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。
public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。
-
序列化操作:
- 一个对象要想序列化,必须满足两个条件:
该类必须实现java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰
- 一个对象要想序列化,必须满足两个条件:
2.写出对象方法:public final void writeObject (Object obj) : 将指定的对象写出。
-
反序列化操作:
1.如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream 读取对象的方法:public final Object readObject () : 读取一个对象。
2.当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException 异常。发生这个异常的原因如下:该类的序列版本号与从流中读取的类描述符的版本号不匹配;该类包含未知数据类型;该类没有可访问的无参数构造方法。
Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。private static final long serialVersionUID = 1L;
//1. 将存有多个自定义对象的集合序列化操作,保存到list.txt 文件中。
//2. 反序列化list.txt ,并遍历集合,打印对象信息。
/*1. 把若干学生对象 ,保存到集合中。
2. 把集合序列化。
3. 反序列化读取时,只需要读取一次,转换为集合类型。
4. 遍历集合,可以打印所有的学生信息*/
public class SerTest {
public static void main(String[] args) throws Exception {
// 创建 学生对象
Student student = new Student("老王", "laow");
Student student2 = new Student("老张", "laoz");
Student student3 = new Student("老李", "laol");
ArrayList<Student> arrayList = new ArrayList<>();
arrayList.add(student);
arrayList.add(student2);
arrayList.add(student3);
// 序列化操作
// serializ(arrayList);
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));
// 读取对象,强转为ArrayList类型
ArrayList<Student> list = (ArrayList<Student>)ois.readObject();
for (int i = 0; i < list.size(); i++ ){
Student s = list.get(i);
System.out.println(s.getName()+"‐‐"+ s.getPwd());
}
}
private static void serializ(ArrayList<Student> arrayList) throws Exception {
// 创建 序列化流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));
// 写出对象
oos.writeObject(arrayList);
// 释放资源
oos.close();
}
}
6 打印流
在控制台打印输出,是调用print 方法和println 方法完成的,这两个方法都来自于java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。
-
PrintStream类
-
构造方法
public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流
-
public class PrintDemo {
public static void main(String[] args) throws IOException {
// 调用系统的打印流,控制台直接输出97
System.out.println(97);
// 创建打印流,指定文件的名称
PrintStream ps = new PrintStream("ps.txt");
// 设置系统的打印流流向,输出到ps.txt
System.setOut(ps);
// 调用系统的打印流,ps.txt中输出97
System.out.println(97);
}
}