package com.li.AIO流;
import java.io.*;
/**
* @author LiWL
* @data 2021/12/9 0:39
*/
public class Test1 {
/**
* 1、字节流 字节流读取单个字节 一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节
* InputStream OutputStream
* <p>
* 2、字符流 字符流读取单个字符 字符流用来处理文本文件
* Reader Wirter
* <p>
* 读取和写入,其实就是获取(输入)数据和输出数据。
*/
// ==============================================读取控制台中的输入=============================================================
/**
* BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
* InputStreamReader:将一个字节的输入流转换为字符的输入流
* OutputStreamWriter:将一个字符的输出流转换为字节的输出流
* 作用:提供字节流与字符流之间的转换
*/
public static void test01() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个字符");
char c;
c = (char) bufferedReader.read();
System.out.println("你输入的字符为" + c);
}
/**
* do-while是while的特殊种类,do-while会先运行一次do里的代码,
* 然后进行while的Boolean判定,然后返回按照do里的方法重新运行。
* (先执行,后判断的while)
*/
public static void test02() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个字符,按 q 键结束");
char c;
do {
c = (char) bufferedReader.read();
System.out.println("你输入的字符为" + c);
} while (c != 'q');
System.out.println("结束输出");
}
public static void test03() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一行字符");
String str = bufferedReader.readLine();
System.out.println("你输入的字符为" + str);
}
// ==============================================二进制文件的写入和读取======================================================
/**
* FileOutputStream流是指文件字节输出(写入)流,专用于输出原始字节流如图像数据等
* FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等
*/
public static void test04() throws IOException {
byte[] bytes = {12, 21, 34, 11, 21};
//没有则会创建
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\").getAbsolutePath() + "/测试.txt");
// 写入二进制文件,直接打开会出现乱码
fileOutputStream.write(bytes);
fileOutputStream.close();
}
public static void test05() throws IOException {
FileInputStream fileInputStream = new FileInputStream(new File("D:\\").getAbsolutePath() + "/测试.txt");
int c;
// 读取写入的二进制文件,输出字节数组
while ((c = fileInputStream.read()) != -1) {
System.out.print(c);
}
}
// ====================================================文本文件的写入和读取=====================================================
/**
* FileWriter
* 如果这个文件不存在,那么就会帮我们自动创建一个
* 如果这个纯文本文件已经存在,并且里面有内容,此时我们再添加内容,就会覆盖掉这个纯文本文件已有的内容
* 那我不想覆盖,想追加内容可以做到吗?
* 当然可以,我们只需要在创建对象的时候,选择另外一个构造方法就可以追加而不是覆盖。创建对象的时候我们这样创建:
* FileWriter fw = new FileWriter("file01.txt",true);
* 我发现写到纯文本文件里头的数据都是在同一行的,能不能换行呢? + \n
* write() 方法和 append() 方法并不是像方法名那样,一个是覆盖内容,一个是追加内容,
*/
public static void test06() throws IOException {
//默认覆盖,追加 + true
FileWriter fileWriter = new FileWriter(new File("D:\\").getAbsolutePath()+"/测试.txt",true);
fileWriter.write("Hello,world!\n欢迎来到 java 世界\n");
fileWriter.write("不会覆盖文件原本的内容\n");
// fileWriter.write(null); 不能直接写入 null
fileWriter.append("并不是追加一行内容,不要被方法名迷惑\n");
fileWriter.append(null);
fileWriter.flush();
System.out.println("文件的默认编码为" + fileWriter.getEncoding());
fileWriter.close();
}
public static void test07() throws IOException {
// 关闭追加模式,变为覆盖模式
FileWriter fileWriter = new FileWriter(new File("D:\\").getAbsolutePath()+"/测试.txt", false);
fileWriter.write("Hello,world!欢迎来到 java 世界\n");
fileWriter.write("我来覆盖文件原本的内容");
fileWriter.append("我是下一行");
fileWriter.append("追加成功");
fileWriter.flush();
System.out.println("文件的默认编码为" + fileWriter.getEncoding());
fileWriter.close();
}
public static void test08() throws IOException {
FileReader fileReader = new FileReader(new File("D:\\").getAbsolutePath()+"/测试.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String str;
while ((str = bufferedReader.readLine()) != null) {
System.out.println(str);
}
fileReader.close();
bufferedReader.close();
}
public static void test09() throws IOException {
FileReader fileReader = new FileReader(new File("D:\\").getAbsolutePath()+"/测试.txt");
int c;
while ((c = fileReader.read()) != -1) {
System.out.print((char) c);
}
}
//===========================================================================================================================
/**
* 使用字节流和字符流的转换类
* InputStreamReader 和 OutputStreamWriter 可以指定文件的编码,使用 Buffer 相关的类来读取文件的每一行。
*/
public static void test10() throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\").getAbsolutePath()+"/测试.txt");
// 使用 GBK 编码文件
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
outputStreamWriter.write("Hello,world!\n欢迎来到 java 世界\n");
outputStreamWriter.append("另外一行内容");
outputStreamWriter.flush();
System.out.println("文件的编码为" + outputStreamWriter.getEncoding());
outputStreamWriter.close();
fileOutputStream.close();
}
public static void test11() throws IOException {
FileInputStream fileInputStream = new FileInputStream(new File("D:\\").getAbsolutePath()+"/测试.txt");
// 使用 GBK 解码文件
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str;
while ((str = bufferedReader.readLine()) != null) {
System.out.println(str);
}
bufferedReader.close();
inputStreamReader.close();
}
}
IO流练习
最新推荐文章于 2022-05-16 00:14:24 发布