什么情况使用字节流:读取到数据不需要经过编码或者解码的情况下使用字节流,比如:图片数据
字符流 = 字节流 + 编码(解码)
Reader,所有输入字符流的基类,抽象类 FileReader,读取文件字符的输入字符流BufferedReader,缓冲输入字符流,它内部维护了一个8192个长度的字符数组,该类出现的目的是为了提高读取文件字符的效率并且拓展了功能(BufferedReader.readLine())Writer,所有输出字符流的基类,抽象类 FileWriter,向文件输出字符数据的输出字符流BufferedWriter,缓冲输出字符流,它内部维护了一个8192个长度的字符数组,该类出现的目的是为了提高写文件字符的效率并且拓展了功能(BufferedWriter.newLine())什么情况下使用字符流:如果读写需要编码和解码的数据(字符数据),这时候我们就使用字符流
OutputStreamWriter,输出字节流 -> 输出字符流
/** 字节流转字符流 */ public static void testOutput() throws Exception{ Socket socket = new Socket(InetAddress.getLocalHost(),9090); //获取到socket的输出字节流 OutputStream outputStream = socket.getOutputStream(); //把输出字节流转换成输出字符流 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); outputStreamWriter.write("不饿!"); }转换流的作用:
可以把对应的字节流转换成字符流使用。
/** 将输入控制台的一行字符数据显示出来 */ public static void testInput() throws Exception{ InputStream in = System.in; //int content = in.read();//read()方法每次只会读取到一个字节的数据 //创建转换流,把输入字节流转成输入字符流 InputStreamReader inputStreamReader = new InputStreamReader(in); //创建缓冲输入字符流,使用readLine()方法进行整行数据的读取 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); System.out.println(bufferedReader.readLine()); }可以指定码表进行读写文件的数据。因为FileReader和FileWriter这两个类默认是使用的是gbk编码,不能指定读写文件数据的编码。
/** 指定utf-8码表把数据写出到文件上 */ public static void writeFile() throws IOException{ FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.txt"); //创建转换流,将输出字节流转成输出字符流,并制定utf-8码表进行编码 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8"); outputStreamWriter.write("大家好");//中文在utf-8码表中占三个字节 outputStreamWriter.close(); } /** 指定utf-8码表进行读取文件上的数据 */ public static void readFile() throws IOException{ FileInputStream fileInputStream = new FileInputStream("F:\\a.txt"); //创建转换流,将输入字节流转成输入字符流,并制定utf-8码表进行解码 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8"); int content = 0; while((content = inputStreamReader.read())!=-1){ System.out.println((char)content); } inputStreamReader.close(); }