[Java] 纯文本查看 复制代码
FileInputStream(String name)[/align] FileInputStream(File file)6
读取数据的原理(硬盘 --> 内存)
FileInputStream:
使用步骤:
创建FileInputStream对象,构造方法中绑定要读取的数据源
使用FileInputStream对象中的方法read,读取文件
释放资源
[Java] 纯文本查看 复制代码
public static void main(String[] args) throws IOException {[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] long start = System.currentTimeMillis();[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] FileInputStream fis = new FileInputStream("practise-code\\src\\whatever\\1.jpg");[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] FileOutputStream fos = new FileOutputStream("practise-code\\src\\whatever\\1copy.jpg");[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] byte[] bytes = new byte[1024*10];[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] int len;[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] while((len = fis.read(bytes)) != -1) {[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] fos.write(bytes, 0, len);[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] }[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] fos.close();[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] fis.close();[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] long end = System.currentTimeMillis();[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] System.out.println(end - start);[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] }
字符流
Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
字符输入流【Reader】
java.io.Reader 抽象类是表示用于读取字符流的所有类的超类
基本共性功能方法。
public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 从输入流读取一个字符。
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
FileReader类
java.io.FileReader 类是读取字符文件的便利类,。构造时使用系统默认的字符编码和默认字节缓冲区。
java.io.FileReader extends InputStreamReader extends Reader (多继承关系)
字符编码:字节与字符的对应规则。
Windows系统的中文编码默认是GBK编码表。idea中UTF-8
构造方法
FileReader(File file) 一个文件 : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) 文件路径: 创建一个新的 FileReader ,给定要读取的文件的名称。
使用字符数组读取: read(char[] cbuf) ,每次读取一个字节
代码使用演示:
[Java] 纯文本查看 复制代码
public class FRRead {[/size][/align][align=left]
[font=微软雅黑][size=3][color=#000000] [/color][/size][/font][/align][font=微软雅黑][size=3][color=#000000][align=left]public static void main(String[] args) throws IOException {[/align]
[/color][/size][/font][font=微软雅黑][size=3][color=#000000]
[align=left]1.// 使用文件名称创建流对象[/align]
[align=left]FileReader fr = new FileReader("read.txt");[/align][/color][/size][/font][align=left][font=微软雅黑][size=3][color=#000000]
[/color][/size][/font]
[/align][align=left][size=3]2.// 定义变量,保存有效字符个数 [/size][/align]
[font=微软雅黑][size=3][color=#000000][align=left]int len ;[/align]
[align=left]char[] cbuf = new char[2];[/align]
[align=left]3.//定义字符数组,作为装字符数据的容器 ,数组起缓冲作用,读取内容存储到数组,下一次读取内容覆盖上一次在数组中存储的内容!数组长度建议是1024的整数倍 [/align]
[align=left]4.//循环读取[/align]
[align=left]while ((len = fr.read(cbuf))!=‐1) { [/align]
[align=left]System.out.println(new String(cbuf , 0 , len));[/align]
[align=left]}[/align]
[align=left]5.// 关闭资源[/align]
[align=left]fr.close();[/align][/color][/size][/font][align=left][font=微软雅黑][size=3][color=#000000]
[/color][/size][/font]
[/align][align=left][font=微软雅黑][size=3][color=#000000]6. // 关闭资源[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000]fr.close();[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000] }[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000]}[/color][/size][/font][/align][align=left][font=微软雅黑][size=3][color=#000000]}[/color][/size][/font][/align]
[font=微软雅黑][size=3][color=#000000][align=left]}
字符输出流【Writer】
方法:
[AppleScript] 纯文本查看 复制代码
void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
Abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,o 数组的开始索引,len写的字符个数。
void write(String str, int off, int len) 写入字符串的某一部分,o 字符串的开始索引,len写的字符个数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。
FileWriter类
java.io.FileWriter 类是写出字符到文件的便利类。
构造方法
[Java] 纯文本查看 复制代码
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。
虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
flush close 两个的区别
flush :刷新缓冲区,流对象可以继续使用。
close : 先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
写出其他数据
写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream,代码使用演示:
[Java] 纯文本查看 复制代码
public class FWWrite {[/size][/align]
[font=微软雅黑][size=3][color=#000000][align=left]public static void main(String[] args) throws IOException {[/align]
[align=left]// 使用文件名称创建流对象[/align]
[align=left]FileWriter fw = new FileWriter("fw.txt"); // 字符串转换为字节数[/align]
[align=left]char[] chas = "黑马程序员".toCharArray();// 写出字符数组 [/align]
[align=left]fw.write(chars); // 黑马程序员[/align]
[align=left]Fw.write(b,2,2); // 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。[/align]
[align=left]// 关闭资源 [/align]
[align=left]fos.close();[/align]
[align=left]}[/align]
[align=left]}
写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据,更为方便,代码使用演示:
[Java] 纯文本查看 复制代码
public class FWWrite {[/size][/align]
[size=3][align=left]public static void main(String[] args) throws IOException { [/align]
[font=微软雅黑][color=#000000][align=left]1.// 使用文件名称创建流对象[/align]
[align=left]FileWriter fw = new FileWriter("fw.txt"); // 字符串[/align]
[align=left]String msg = "黑马程序员";[/align]
[align=left]2.// 写出字符数组[/align]
[/color][/font][/size][font=微软雅黑][size=3][color=#000000]
[align=left]fw.write(msg); [/align]
[align=left]3.//黑马程序员[/align]
[align=left]4.// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。[/align]
[align=left]fw.write(msg,2,2); // 程序[/align]
[align=left]5. // 写出换行[/align]
[align=left]fw.write("\r\n");[/align][/color][/size][/font][align=left][font=微软雅黑][size=3][color=#000000]
[/color][/size][/font]
[/align][align=left][size=3]6.// 关闭资源 [/size][/align]
[font=微软雅黑][size=3][color=#000000][align=left]fos.close();[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]
缓冲流,转换流
缓冲流
字节缓冲流
[AppleScript] 纯文本查看 复制代码
|_ BufferedInputStream # 缓冲字节输入流
|_ BufferedOutputStream # 缓冲字节输出流
java.io.BufferedOutputStream类: 缓冲字节输出流
// 构造方法
[Java] 纯文本查看 复制代码
BufferedOutputStream(OutputStream out): 使用基本流创建一个缓冲字节输出流
BufferedOutputStream(OutputStream out, int size): 使用基本流创建一个缓冲字节输出流, 设置缓冲区大小
BufferedOutputStream使用步骤:
1.创建FileOutputStream对象, 构造方法中绑定要输出的目的地
2.创建BufferedOutputStream对象, 构造方法中传递FileOutputStream对象, 提高FileOutputStream效率
3.使用BufferedOutputStream对象中的方法 write(), 把数据写入到内部缓冲区中
4.使用BufferedOutputStream对象中的方法 flush(), 把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先调用flush方法刷新数据, 第4步可以省略)
java.io.BufferedInputStream类: 缓冲字节输入流
// 构造方法
[Java] 纯文本查看 复制代码
BufferedInputStream(InputStream in): 使用基本流创建一个缓冲字节输入流
BufferedInputStream(InputStream in, int size): 使用基本流创建一个缓冲字节输入流, 设置缓冲区大小
使用步骤:
1.创建FileInputStream对象, 构造方法中绑定要读取的数据源
2.创建BufferedInputStream对象, 构造方法中传递FileInputStream对象, 提高FileInputStream效率
3.使用BufferedInputStream对象中的方法 read(), 读取文件
字符缓冲流
[AppleScript] 纯文本查看 复制代码
|_ BufferedReader # 缓冲字符输入流
|_ BufferedWriter # 缓冲字符输出流
java.io.BufferedWriter类:缓冲字符输出流
// 构造方法
[Java] 纯文本查看 复制代码
BufferedWriter(Writer out): 使用基本流创建一个缓冲字符输出流
BufferedWriter(Writer out, int size): 使用基本流创建一个缓冲字符输出流,设置缓冲区大小
// 特有方法
[Java] 纯文本查看 复制代码
void newLine(): 写入一个换行符, 换行符自动根据当前系统确定
java.io.BufferedReader类: 缓冲字符输入流
// 构造方法
[Java] 纯文本查看 复制代码
BufferedReader(Reader in): 使用基本流创建一个缓冲字符输入流
BufferedReader(Reader in, int size): 使用基本流创建一个缓冲字符输入流, 设置缓冲区大小
// 特有方法
String readLine(): 一次读一行字符串, "不包含换行符". 读到文件末尾返回null
转换流
字符编码和字符集
编码表: 字符和二进制数字的对应规则
字符集和编码表: 字符集包含编码表
ASCII字符集
ASCII编码表
ISO-8859-1字符集:
ANSI: 表示使用系统默认编码表
乱码原理: 字符流和转换流的关系
java.io.Reader
|_ InputStreamReader: 转换字符输入流 读 char char[] byte -> char 97 -> 'a'
|_ FileReader byte -UTF-8-> char
java.io.Writer char char[] String
|_ OutputStreamWriter: 转换字符输出流 char char[] String -> byte
|_ FileWriter char -UTF-8-> byte
FileReader=InputStreamReader+FileInputStream, 只不过固定按照IDEA中的UTF-8来将读取的字节转换为字符
FileWriter=OutputStreamWriter+FileOutputStream, 只不过固定按照IDEA中的UTF-8来将写出的字符转换为字节
字符流 = 字节流 + 编码表
转换流InputStreamReader, OutputStreamWriter在读写时, 可以指定按照哪个编码表来进行转
java.io.OutputStreamWriter类: 输出转换流. 字符流通往字节流的桥梁
// 构造方法
[AppleScript] 纯文本查看 复制代码
OutputStreamWriter(OutputStream out): 使用默认编码表创建转换流
OutputStreamWriter(OutputStream out, String charsetName): 使用指定编码表创建转换流
write('a') -> "GBK" -> 97 OutputStream out -> 文件
// 使用默认UTF-8
[AppleScript] 纯文本查看 复制代码
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"));
// 使用指定的GBK
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"), "GBK");
o.write("你") -> GBK -> 7676 -> 文件
写数据: 字符流 -------> 字节流
[AppleScript] 纯文本查看 复制代码
java.io.InputStreamReader类: 输入转换流. 字节流通往字符流的桥梁
// 构造方法
[Java] 纯文本查看 复制代码
InputStreamReader(InputStream in): 使用默认编码表创建转换流
InputStreamReader(InputStream in, String charsetName): 使用指定编码表创建转换流
// 使用默认UTF-8
[Java] 纯文本查看 复制代码
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"));
// 使用指定的GBK
[AppleScript] 纯文本查看 复制代码
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
bbb int ch = r.read() <------GBK----------- 字节byte 989898
r.read(chs)
序列化流(对象流)
1.ObjectOutputStream类: 对象字节输出流
构造方法:
ObjectOutputStream(OutputStream out)
参数:
OutputStream out:字节输出流
特有成员方法:
void writeObject(Object obj): 将对象写出
使用步骤:
1.创建ObjectOutputStream流对象,构造方法中传递字节输出流
2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
3.释放资源
使用步骤:
1.创建ObjectInputStream对象,构造方法中传递细节输入流
2.使用ObjectInputStream对象的readObject方法读取保存对象的文件
3.释放资源
4.使用读取出来的对象
readObject()声明抛出了ClassNotFoundException(class文件找不到异常)
当不存在对象的class文件时抛出此异常
反序列化的前提:
1.类必须实现Serializable
2.必须存在类对应的class文件
3.对象序列化的前提:
1.该类要实现java.io.Serializable接口以启用启序列化功能。未实现此接口的类将无法使其进行任何序列化或反序列化。
2.该类的所有属性必须是可序列化的(实现了java.io.Serializable接口)。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
Serializable接口:
也叫做标记型接口
序列化和反序列化的时候,如果不实现此接口,则会抛出NotSerializableException没有序
打印流
1.PrintStream类: 字节打印流
构造方法:
[Java] 纯文本查看 复制代码
PrintStream(File file): 创建字节打印流, 输出到一个文件[/align] PrintStream(Output tream out): 创建字节打印流, 输出到一个字节输出流
PrintStream(String fileName): 创建字节打印流, 输出到一个文件路径
PrintStream特点:
1. 只有输出流, 没有输入流
2. PrintStream永远不会抛出IOException
3. 有特殊方法 print(), println(), 可以输出任意类型的值
2.java.lang.System类:
静态方法:
[AppleScript] 纯文本查看 复制代码
static void setOut(PrintStream out): 设置System.out的输出目的地为参数的打印流