字节和字符的桥梁
- package IO流.字符流;
- /*
- InputStreamReader是从字节流到字符流的桥梁:
- 它读取字节,并使用指定的charset将其解码为字符。
- 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
- OutputStreamWriter是从字符流到字节流的桥梁:
- 使用指定的charset将写入的字符编码为字节。
- 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
- */
-
- import java.io.*;
-
- public class 字节和字符的桥梁 {
- public static void main(String[] args) throws IOException {
- //OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
- //OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。
- OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("idea_text\\osw.txt"));
- osw.write("中国");
- osw.close();
-
-
- //InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
- //InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
- InputStreamReader isr = new InputStreamReader(new FileInputStream("idea_text\\osw.txt"));
- //一次读取一个字符数据
- int ch;
- while ((ch = isr.read()) != -1) {
- System.out.println((char)ch);
- }
-
- isr.close();
-
- }
- }
字符串中的编码解码问题
- package IO流.字符流;
- /*
- 字符串中的编码解码问题
- 编码:
- byte[]getBytes():
- 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
- byte[]getBytes(String charsetName):
- 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
- 解码:
- String(byte[]bytes):
- 通过使用平台的默认字符集解码指定的字节数组来构造新的String
- String(byte[]bytes,String charsetName):
- 通过指定的字符集解码指定的字节数组来构造新的String
- */
-
-
- import java.io.UnsupportedEncodingException;
- import java.util.Arrays;
-
- public class 字符串中的编码解码问题 {
- public static void main(String[] args) throws UnsupportedEncodingException {
- //定义一个字符串
- String s="中国";
-
- //编码:
- //byte[]getBytes():
- byte[] bys=s.getBytes();//[-28, -72, -83, -27, -101, -67]
- //byte[]getBytes(String charsetName):
- byte[] bytes=s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
- byte[] bytess=s.getBytes("GBK");//[-42, -48, -71, -6]
-
- // System.out.println(Arrays.toString(bytess));
-
-
- //解码:
- //String(byte[]bytes):
- String ss=new String(bys);//中国
- //String(byte[]bytes,String charsetName):
- String sss=new String(bys,"UTF-8");//中国
- String ssss=new String(bys,"GBK");//涓浗
-
-
- // System.out.println(ssss);
-
- }
- }
字符流写数据的5种方式
- package IO流.字符流.字符流写数据的5种方式;
-
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
-
- /*
- 构造方法:
- OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
- 写数据的5种方式
- void write(int c) 写一个字符
- void write(char[] cbuf) 写一个字符数组。
- void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
- void write(String str) 写一个字符串。
- void write(String str, int off, int len) 写一个字符串的一部分。
- void close() 关闭流,先刷新。
- void flush() 刷新流。
- */
- public class Demo {
- public static void main(String[] args) throws IOException {
- //OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
- OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("idea_text\\osw.txt"));
- /*
- //void write(int c) 写一个字符
- osw.write("97");//无显示
- //void flush() 刷新流。
- osw.flush();//有显示97
- osw.write("98");
- osw.flush();
- osw.write("99");
- //释放资源
- osw.close();//直接释放,不用刷新了,99也会显示
- // osw.write("100");//IOException: Stream closed
- */
-
- //void write(char[] cbuf) 写一个字符数组。
- char[] chs = {'a', 'b', 'c', 'd', 'e'};
- // osw.write(chs);
- // void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
- // osw.write(chs,0,chs.length);
- // osw.write(chs,1,3);
-
- //void write(String str) 写一个字符串。
- osw.write("abcde");
- //void write(String str, int off, int len) 写一个字符串的一部分。
- osw.write("abcde",0,"abcde".length());
- osw.write("abcde",1,3);
-
- //释放资源
- osw.close();
-
-
- }
- }
字符流读数据的2种方式
- package IO流.字符流.字符流读数据的2种方式;
- /*
- 构造方法
- InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
- 2种方式
- int read() 一次读一个字符数据
- int read(char[] cbuf) 一次读一个字符数组数据
- */
-
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStreamReader;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
- InputStreamReader isr = new InputStreamReader(new FileInputStream("idea_text\\osw.txt"));
- /*
- //int read() :一次读一个字符数据
- int ch;
- while ((ch = isr.read()) != -1){
- System.out.println((char) ch);
- }
- */
-
-
- //int read(char[] cbuf) 一次读一个字符数组数据
- char[] chs=new char[1024];
- int len;
- while ((len = isr.read()) != -1){
- System.out.println(new String(chs, 0, len));
- }
-
- //释放资源
- isr.close();
-
- }
- }
字符缓冲流
- package IO流.字符流.字符缓冲流;
- /*
- 字符缓冲流:
- BufferedWriter:
- 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
- 可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
- BufferedReader:
- 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
- 可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
- 构造方法:
- BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
- BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。
- */
-
- import java.io.*;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- /*
- //BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
- BufferedWriter bw=new BufferedWriter(new FileWriter("idea_text\\bw.txt"));
- bw.write("hello\r\n");
- bw.write("world\r\n");
- bw.close();
- */
-
- //BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。
- BufferedReader br=new BufferedReader(new FileReader("idea_text\\bw.txt"));
- int ch;
- while ((ch = br.read()) != -1){
- System.out.println((char)ch);
- }
-
- char[] chs=new char[1024];
- int len;
- while ((len = br.read()) != -1){
- System.out.println(new String(chs,0,len));
- }
-
- //释放资源
- // bw.close();
- br.close();
- }
- }
特有功能
- package IO流.字符流.字符缓冲流;
- /*
- BufferedWriter:
- void newLine(): 写一行行分隔符,行分隔符字符串由系统属性定义
- BufferedReader:
- void String readLine(): 读一行文字,结果包含行的内容的字符串,不包括任何行终止字符
- 如果过流的结尾已经到达,则为null
- */
-
- import java.io.*;
-
- public class 特有功能 {
- public static void main(String[] args) throws IOException {
- //创建字符缓冲流
- /*
- BufferedWriter bw=new BufferedWriter(new FileWriter("idea_text\\bw.txt"));
- //写数据
- for (int i=0; i<10;i++){
- bw.write("hello"+i);
- bw.newLine();
- bw.flush();
- }
- */
-
- BufferedReader br = new BufferedReader(new FileReader("idea_text\\\\bw.txt"));
-
- //读数据
- String line;
- while ((line = br.readLine()) != null){
- System.out.println(line);
- }
-
-
- br.close();
- }
- }
复制java文件改进版
- package IO流.字符流;
- /*
- 需求:
- 把模块目录下的“ConversionStreamDemo.java”复制到模块目录下的“Copyjava
- 分析:
- 1,转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化书写,转换流提供了对应的子类
- 2,FileReader:用于读取字符文件的便捷类
- FileReader(String fileName)
- 3,FileWriter:用于写入字符文件的便捷类
- FileWriter(String fileName)
- 4,数据源和目的地的分析
- 数据源:
- myCharStream\\ConversionStreamDemo.java---读数据---Reader---InputStreamReader---FileReader
- 目的地:
- myCharStream\\Copy.java---写数据---Writer---OutputStreamWriter-FileWriter
- 思路
- 1,根据数据源创建字符输入流对象
- 2,根据目的地创建字符输出流对象
- 3,读写数据,复制文件
- 4,释放资源
- */
-
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
-
- public class 复制java文件改进版 {
- public static void main(String[] args) throws IOException {
- //根据数据源创建字符输入流对象
- FileReader fr=new FileReader("myCharStream\\\\ConversionStreamDemo.java");
- //根据目的地创建字符输出流对象
- FileWriter fw=new FileWriter("myCharStream\\\\Copy.java");
-
- //读写数据,复制文件
- int ch;
- while ((ch = fr.read())!=-1){
- fw.write(ch);
- }
-
- char[] chs=new char[1024];
- int len;
- while ((len = fr.read(chs))!=-1){
- fw.write(chs,0,len);
- }
-
-
-
- //释放资源
- fr.close();
- fw.close();
-
- }
- }
复制java文件字符缓冲流改进版
- package IO流.字符流;
- /*
- 需求:
- 把模块目录下的“ConversionStreamDemojava”复制到模块目录下的“Copyjava
- 思路:
- 1,根据数据源创建字符缓冲输入流对象
- 2,根据目的地创建字符缓冲输出流对象
- 3,读写数据,复制文件
- 4,释放资源
- */
-
- import java.io.*;
-
- public class 复制java文件字符缓冲流改进版 {
- public static void main(String[] args) throws IOException {
- //根据数据源创建字符缓冲输入流对象
- BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
- //根据目的地创建字符缓冲输出流对象
- BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));
- //读写数据,复制文件
- // 一次读写一个字符数据
- int ch;
- while ((ch = br.read()) != -1) {
- bw.write(ch);
- }
- //一次读写一个字符数组数据
- char[] chs = new char[1024];
- int len;
- while ((len = br.read(chs)) != -1) {
- bw.write(chs, 0,len);
- }
- //释放资源
- bw.close();
- br.close();
- }
- }
复制java文件字符缓冲流特有功能改进版
- package IO流.字符流;
- /*
- 需求:
- 把模块目录下的“ConversionStreamDemojava”复制到模块目录下的“Copyjava
- 思路:
- 1,根据数据源创建字符缓冲输入流对象
- 2,根据目的地创建字符缓冲输出流对象
- 3,读写数据,复制文件
- 使用字符缓冲流特有功能实现
- 4,释放资源
- */
-
- import java.io.*;
-
- public class 复制java文件字符缓冲流特有功能改进版 {
- public static void main(String[] args) throws IOException {
- //根据数据源创建字符缓冲输入流对象
- BufferedReader br =new BufferedReader(new FileReader("myCharStreamlConversionStreamDemo.java"));
- //根据目的地创建字符缓冲输出流对象
- BufferedWriter bw=new BufferedWriter(new FileWriter("myCharStreamCopy.java"));
- //读写数据,复制文件
- //使用字符缓冲流特有功能实现
- String line;
- while((line=br.readLine())!=null){
- bw.write(line);
- bw.newLine();
- bw.flush();
- }
- //释放资源
- bw.close();
- br.close();
- }
- }
复制单级文件夹
- package IO流.字符流;
-
- import java.io.*;
-
- public class 复制单级文件夹 {
- public static void main(String[] args) throws IOException {
- //创建数据源目录File对象,路径是D:\\AAA
- File srcFolder=new File("D:\\AAA");
- //获取数据源目录File对象的名称 AAA
- String srcFolderName= srcFolder.getName();
- //创建目的地目录File对象,路径名是模块名+AAA组成
- File destFolder =new File("idea_text",srcFolderName);
- //判断目的地目录对应的File是否存在,如果不存在,就创建
- if (!destFolder.exists()){
- destFolder.mkdir();
- }
- //获取数据源目录下的所有文件的File数组
- File[] listFiles=srcFolder.listFiles();
- //遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件
- for (File srcFile:listFiles){
- //获取数据源文件对象的名称
- String srcFileName = srcFile.getName();
- //创建目的地文件File对象
- File destFile=new File(destFolder,srcFileName);
- //复制文件
- copyFile(srcFile,destFile);
- }
- }
-
- private static void copyFile(File srcFile, File destFile) throws IOException {
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
- BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
-
- byte[] bys = new byte[1024];
- int len;
- while ((len = bis.read(bys)) != -1) {
- bos.write(bys, 0, len);
- }
- bos.close();
- bis.close();
- }
- }
点名器
- package IO流.字符流;
- /*
- 需求:
- 我有一个文件里面存储了班级同学的姓名,每个姓名占一行,通过程序实现随机点名器具
- 思路:
- 1,创建字符缓冲输入流对象
- 2,创建ArrayList集合对象
- 3,调用字符缓冲输入流对象的方法读数据
- 4,把读取到的字符串数据存储到集合中
- 5,释放资源
- 6,使用Random产生一个随机数,范围在【0,集合长度)
- 7,把第6步产生的随机数作为索引到ArrayList集合中获取值
- 8,把第7步得到的数据输出在控制台
- */
-
- import java.io.*;
- import java.util.ArrayList;
- import java.util.Random;
-
- public class 点名器 {
- public static void main(String[] args) throws IOException {
- //创建字符缓冲输入流对象
- BufferedReader br = new BufferedReader(new FileReader("idea_text\\osw.txt"));
- //创建ArrayList集合对象
- ArrayList<String> array = new ArrayList<String>();
- //调用字符缓冲输入流对象的方法读数据
- String line;
- while ((line = br.readLine()) != null) {
- array.add(line);
- }
- //释放资源
- br.close();
- //使用Random产生一个随机数,范围在【0,集合长度)
- Random r = new Random();
- int index = r.nextInt(array.size());
- //把第6步产生的随机数作为索引到ArrayList集合中获取值
- String name = array.get(index);
- //把第7步得到的数据输出在控制台
- System.out.println("幸运者是:" + name);
-
- }
- }