目录
一、字符集
常见字符集
编码、解码操作
二、IO流
FileInputStream
FileOutputStream
FileReader
FileWriter
三、打印流
PrintStream
一、字符集
常见字符集
我们的计算机底层是不可以直接存储字符的,计算机中底层只能存储二进制(0、1),同时二进制是可以转换成十进制的。
结论:计算机底层是可以表示十进制编号。计算机可以给人类字符进行编号存储,这套编号规则就是字符集
ASCll字符集: ASCll(American Standard Code for Information Interchange),美国信息交换标准代码,包括了数字、英文、符号。
ASCll使用1个字节存储一个字符,一个字节是8位,一共可以表示128个字符信息,对于英文,数字是够用的。
GBK:windows系统默认的码表。兼容ASCll码表,也包含了几万个汉字,并支持繁体汉字以及部分日韩文字。
注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字。
Unicode码表:unicode(统一码,万国码)是计算机科学领域里的一项业界字符编码标准,容纳世界上大多数国家的所有常见的文字和符号。
由于Unicode会先通过UTF-8、UTF-16、以及UTF-32编码成二进制在存储到计算机中,最常见的是UTF-8.
注意:
1.Unicode是万国码,以UTF-8编码后一个中文一般以三个字节的形式存储。
2.UTF-8也兼容ASCll编码表
3.我们正常情况下应该使用UTF-8的字符集编码
4.编码前和编码后的字符集需要保持一致,否则会出现乱码
5.英文和数字在任何编码中都不会乱码。
编码、解码操作
String编码:
方法 | 作用 |
---|---|
byte[] getBytes() | 使用平台默认字符集将String编码为字节,存储到数组中 |
byte[] getBytes(String charsetName) | 使用指定字符集将String编码为字节,存储到字节数组中 |
String解码:
方法 | 作用 |
---|---|
String(byte[] bytes) | 使用平台默认编码来解码字节数组来构造String |
String(byte[] bytes,String charsetName) | 通过指定字符集解码指定字节数组来构造String |
public static void main(String[] args) {String name = "abcefg";byte[] bytes = name.getBytes();System.out.println(bytes.length);System.out.println(Arrays.toString(bytes));}
二、IO流
IO流也称为输入,输出流,就是用来读写数据的。
I:表示input,数据从硬盘文件读入到内存的过程,称之输入(读)
O: 表示output,数据从内存写入硬盘文件的过程,称之输出(写)
但是我们这里类都是抽象类,是不能直接用的,于是我们提供了操作文件的实现类
虽然这里的类很多,但是具有非常强的规律性,核心就是四个操作:
1.打开文件(构造对象)
2.关闭文件(close)
3.读文件(read),只针对 InputStream / Reader
4.写文件(write),只针对OutputStream / Writer
FileInputStream
方法 | 作用 |
---|---|
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
File file = new File("D:/temp/java114/abc.txt");
public static void main(String[] args) throws IOException {//创建一个文件字节输入流管道与源文件接通InputStream inputStream = new FileInputStream("./data.txt");//按一次读一个字节的方式读取int a1 = inputStream.read();System.out.println((char)a1);int a2 = inputStream.read();System.out.println((char)a2);int a3 = inputStream.read();System.out.println((char)a3);int a4 = inputStream.read();System.out.println(a4);}
FileOutputStream
我们刚刚介绍了从硬盘读取到内存的文件字节输入流,现在介绍从内存写入到硬盘上的字节输出流。
方法 | 作用 |
---|---|
FileOutputStream(File file) | 创建字节输出流与源文件对象接通 |
FileOutputStream(File file,boolean append) | 创建字节输出流与源文件对象接通,可追加数据 |
FileOutputStream(String filepath) | 创建字节输出流与源文件路径接通 |
FileOutputStream((String filepath),boolean append) | 创建字节输出流与源文件路径接通,可追加数据 |
方法 | 作用 |
---|---|
flush() | 刷新流,还可以继续写数据 |
close() | 关闭流,释放资源,再关闭之前先刷新流。一旦关闭,就不能写数据 |
public class Demo_203_OutputStream {public static void main(String[] args) throws IOException {// 通过文件路径创建一个输出流FileOutputStream outputStream = new FileOutputStream("D:\\temp\\java114\\output_stream.txt");// 写入内容到文件,以字节的形式写入文件outputStream.write(97); // aoutputStream.write(98); // boutputStream.write(99); // coutputStream.write(13);outputStream.write(10);outputStream.write(-26);outputStream.write(-120);outputStream.write(-111);outputStream.write('\n');// 刷新一下缓冲区outputStream.flush();// 关闭流outputStream.close();}
FileReader
字符输入流:我们刚才所介绍的字节流,对于操作中文数据不太友好,我们现在来介绍一个非常针对中文操作的流对象|
方法 | 作用 |
---|---|
FileReader(File file) | 创建字符输人流与源文件对象接通 |
FileReader(File file,Charset charset) | 创建字符输人流与源文件对象接通,指定字符集 |
FileReader(String fileName) | 创建字符输人流与源文件路径接通 |
FileReader(String fileName,Charset charset) | 创建字符输人流与源文件路径接通,指定字符集 |
public class Demo_204_FileReader {public static void main(String[] args) throws IOException {// 创建一个字符流FileReader reader = new FileReader("D:\\temp\\java114\\abc.txt");// 循环读取while (true) {// 读取一个字符int data = reader.read();// 读取完成,达到退出条件if (data == -1) {break;}// 打印结果,一个字符一个字符的打印System.out.println(data);}// 关闭流reader.close();}
}
FileWriter
文件字符输出流
方法 | 作用 |
---|---|
FileWriter(File file) | 创建字符输出流管道与源文件对象接通 |
FileWriter(File file,boolean append) | 创建字符输出流管道与源文件接通,可追加数据 |
FileWriter(String filepath) | 创建字符输出流管道与源文件路径接通 |
FileWriter(String filepath,boolean append) | 创建字符输出流管道与源文件路径接通,可追加数据 |
public class Demo_205_FileWriter {public static void main(String[] args) throws IOException {// 定义一个字符输出流FileWriter writer = new FileWriter("D:\\temp\\java114\\file_writer.txt");// 写入具体的字符writer.write("hello world!!!");writer.write('\n');writer.write("你好世界!!!");// 强制刷新缓冲区writer.flush();// 关闭流writer.close();}
三、打印流
PrintStream
方法 | 作用 |
---|---|
PrintStream(OutputStream os) | 打印流直接通向字节输出流管道 |
PrintStream(File f) | 打印流通向文件对象 |
PrintStream(String filepath) | 打印流通向文件路径 |
print(Xxx xxx) | 打印任意类型的数据 |
PrintWriter
方法 | 作用 |
---|---|
PrintWriter(OutputStream os) | 打印流通向字节输出流管道 |
PrintWriter(Writer w) | 打印流通向字符输出流管道 |
PrintWriter(File f) | 打印流通向文件对象 |
PrintWriter(String filepath) | 打印流通向文件路径 |
print(Xxx xxx) | 打印任意类型数据 |
public class Demo_207_PrintWriter {public static void main(String[] args) throws IOException {// 创建一个输出流FileOutputStream outputStream = new FileOutputStream("D:\\temp\\java114\\print_writer.txt");// 根据输出流,创建一个PrintWriter对象,用于写入字符串PrintWriter printWriter = new PrintWriter(outputStream);// 写入内容printWriter.println("hello world!!!");printWriter.println("这是一个简便方法,你好世界!!!");printWriter.printf("%s:%d", "单价", 5);// 强制刷新缓冲区printWriter.flush();// 关闭资源printWriter.close();outputStream.close();}
}
PrintWriter 和 PrintStream的区别
1.打印数据功能一模一样,使用方便,性能高效
2.PrintStream继承字节输出流OutputStream,支持写字节数据的方法
3.PrintWriter继承字符输出流Writer,支持写字符数据的方法