赞
踩
编码: 就是把字符串转换成字节数组
public byte[] getBytes();
public byte[] getBytes(String charsetName)
解码: 把字节数组转换成字符串
public String(byte[] bytes):
public String(byte[] bytes, String charsetName)
A: 案例演示: 字符流出现的原因:由于字节流操作中文不是特别方便,所以,java就提供了字符流。
B: 码表
C:字符流: 字符流 = 字节流 + 编码表
import java.io.UnsupportedEncodingException; public class Demo1 { public static void main(String[] args) throws UnsupportedEncodingException { //编码:把看得懂的,变成看不懂的,即把中文字符转成字节 //解码:把看不懂的,变成看的懂的,即把字节变成中文 //编码 byte[] bytes = "八千里路云和月".getBytes();//默认的字符集是GBK的 //解码 String s = new String(bytes); //使用平台的默认字符集将此 String编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 System.out.println(s); //编解码:码表必须一致 /*UTF-8(8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码 由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。 UTF-8用1到6个字节编码Unicode字符。 用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。 */ //如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节 byte[] bytes1 = "我真的是个好人".getBytes("utf-8"); //使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 //解码 String s1 = new String(bytes1, "utf-8"); System.out.println(s1); } }
OutputStreamWriter(OutputStream out):
根据默认编码(GBK)把字节流的数据转换为字符流
OutputStreamWriter(OutputStream out,String charsetName):
根据指定编码把字节流数据转换为字符流
A: 方法概述
public void write(int c) 写一个字符
public void write(char[] cbuf) 写一个字符数组
public void write(char[] cbuf,int off,int len) 写一个字符数组的 一部分
public void write(String str) 写一个字符串
public void write(String str,int off,int len) 写一个字符串的一部分
B:案例演示: OutputStreamWriter写出数据,字符流的5种写数据的方式
import java.io.*; public class Demo2 { public static void main(String[] args) throws IOException { //字符流的命名特点:结尾都有 writer Reader // OutputStreamWriter //是字符流通向字节流的桥梁:可以使用指定的码表把要写入流中的字符编码成字节。 //它使用的字符集可以由名称指定或者显示给定,否则默认为平台的字符集 //构造方法 /* * OutputStreamWriter(OutputStream out):根据默认编码(GBK)把字节流的数据转换为字符流 OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流 */ // 输出流所关联的文件,如果不存在,会自动创建 OutputStreamWriter out = new OutputStreamWriter( new FileOutputStream("z.txt")); out.write("你"); out.write("\r\n");//换行 out.flush(); out.write("你好"); out.write("\r\n"); out.flush(); out.write("你且迷这风浪永远二十赶朝暮", 0, 6);//从第一个字符开始,写入6个字符 out.write("\r\n"); out.flush(); out.write(new char[]{'a', '9', 98, 'e'}); out.write("\r\n"); out.flush(); // 字符流,需要将数据从缓冲区刷新过去 out.close(); } }
z.txt里面写入的内容:
你
你好
你且迷这风浪
a9be
InputStreamReader(InputStream is):
用默认的编码(GBK)读取数据
InputStreamReader(InputStream is,String charsetName)
:用指定的编码读取数据
public int read() 一次读取一个字符
public int read(char[] cbuf) 一次读取一个字符数组 如果没有读到 返回-1
案例演示: 字符流的2种读数据的方式
public class Demo3 { public static void main(String[] args) throws IOException { /*InputStreamReader是字节流通过字符流的桥梁; * 它使用指定的charset读取字节并将其解码为字符。 * 它使用的字符集可以是由名称指定或者显示给定, * 默认为平台的字符集*/ //构造方法 /*InputStreamReader(InputStream in) * 创建一个使用默认字符集的 InputStreamReader。 * InputStreamReader(InputStream in, Charset cs) * 创建使用给定字符集的 InputStreamReader。*/ // 输入流所关联的文件,如果不存在 就会报错 InputStreamReader in = new InputStreamReader(new FileInputStream("z.txt")); //public int read () 一次读取一个字符 //读取文件中的数据,返回对应的编码值 // 如果读取不到就返回-1 int len = in.read();//一次读取一个字符 System.out.println(len); //public int read ( char[] cbuf)一次读取一个字符数组 如果没有读到 返回 - 1 int index = 0; while((index = in.read())!=-1){ System.out.println((char)index); } in.close(); } }
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class Demo3_1 { public static void main(String[] args) throws IOException { InputStreamReader in = new InputStreamReader(new FileInputStream("z.txt")); char[] chars = new char[1024]; //int len = in.read(chars); //for (char aChar : chars) { // System.out.println(aChar); //} //System.out.println(new String(chars)); int len1 = in.read(chars,0,100); System.out.println(len1);//21 String s = new String(chars, 0, len1); System.out.println(s); in.close(); } }
import java.io.*; public class Demo4 { public static void main(String[] args) throws IOException { //字符流读取文本文件 //字符流只能复制文本文件,文本文件就是可以用Windows自带的笔记本打开的文件。 //我们现在来赋值Demo1 InputStreamReader in = new InputStreamReader(new FileInputStream("E:\\Demo1.java")); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("D:\\Demo_compile.java")); char[] chars = new char[100]; int len = 0; while ((len = in.read(chars))!=-1){ out.write(chars); out.flush(); } in.close(); out.close(); } }
字符流便捷类: 因为转换流的名字太长了,并且在一般情况下我们不需要制定字符集, 于是java就给我们提供转换流对应的便捷类:
B:案例演示: FileWriter和FileReader复制文本文件
import java.io.*; public class Demo5 { public static void main(String[] args) throws IOException { // 便捷类:FileReader和FileWriter // 通常情况下,我们不需要指定字符集,但是转换流的名字太长 // java给我们提供了转换流对应的便捷类 /* 转换流 便捷类 * OutputStreamWriter ------- FileWriter * InputStreamReader ------- FileReader*/ //构造方法: //FileReader (String filePath) filePath 是一个文件的完整路径 //FileReader(File fileObj) fileObj 是描述该文件的File对象 // FileWriter (String filePath) filePath 是一个文件的完整路径 // FileWriter(String filePath, boolean append) // 如果append为true ,输出是附加到文件尾的。 // FileWriter(File fileObj) 是描述该文件的File对象 FileReader fr = new FileReader("z.txt"); FileWriter fw = new FileWriter("z_1.txt"); int len = 0; while ((len = fr.read()) != -1) { System.out.println("11"); fw.write(len); fw.flush(); } fr.close(); fw.close(); } }
BufferedWriter写出数据 高效的字符输出流
BufferedReader读取数据 高效的字符输入流
案例演示: 字符缓冲流复制文本文件
import java.io.*; public class Demo6 { public static void main(String[] args) throws IOException { /* 高效的字符输出流: BufferedWriter 构造方法: public BufferedWriter(Writer w) 高效的字符输入流: BufferedReader 构造方法: public BufferedReader(Reader e) */ //字符缓冲流复制文本文件 BufferedReader br = new BufferedReader(new FileReader("E:\\JavaSE——Day20\\src\\IO流_字符流\\Demo2.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("DEMO2.java")); char[] chars = new char[100]; int len = 0; while ((len = br.read(chars)) != -1) { bw.write(chars); bw.flush(); } br.close(); bw.close(); } }
BufferedWriter: public void newLine():
根据系统来决定换行符 具有系统兼容性的换行符
BufferedReader: public String readLine():
一次读取一行数据 是以换行符为标记的 读到换行符就换行 没读到数据返回null
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
案例演示: 字符缓冲流的特殊功能
import java.io.*; public class Demo7 { public static void main(String[] args) throws IOException { /* A: 字符缓冲流的特殊功能 BufferedWriter: public void newLine ():根据系统来决定换行符 具有系统兼容性的换行符 BufferedReader: public String readLine ():一次读取一行数据 是以换行符为标记的 读到换行符就换行 没读到数据返回null 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null*/ BufferedReader br = new BufferedReader(new FileReader("DEMO2.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("DEMO2_00.java")); // 采用读取一行,写入一行的方式来复制文本文件 String line = null; while((line=br.readLine())!=null){ bw.write(line); bw.newLine(); bw.flush(); } br.close(); bw.close(); } }
import java.io.*; import java.util.ArrayList; public class Demo8 { public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new FileWriter("name.txt")); ArrayList<String> s_names = new ArrayList<>(); s_names.add("张三"); s_names.add("李四"); s_names.add("王五"); s_names.add("赵六"); s_names.add("鬼脚七"); for (String name : s_names) { bw.write(name+"\r\n"); bw.flush(); } bw.close(); } }
import java.io.*; import java.util.ArrayList; public class Demo9 { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new FileReader("name.txt")); ArrayList<String> names = new ArrayList<>(); String c = null; while ((c = bf.readLine()) != null) { names.add(c); } for (String name : names) { System.out.println(name); } bf.close(); } }
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Random; public class Demo10 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("name.txt")); ArrayList<String> name = new ArrayList<>(); String c = null; while ((c = br.readLine()) != null) { name.add(c); } Random random = new Random(); int i = random.nextInt(name.size());//指定类型和范围 System.out.println(name.get(i)); } }
import java.io.*; public class Demo11 { public static void main(String[] args) throws IOException { File file = new File("D:\\course"); File file1 = new File("E:\\course"); file1.createNewFile();//判断是否存在,如果不存在就是创建一个目录 //public File[] listFiles ():获取指定目录下的所有文件或者文件夹的File数组 File[] files = file.listFiles(); for (File afile : files) { copy(afile,file1); } } private static void copyFiles(File file, File aimFile) throws IOException { BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(aimFile)); int len = 0; byte[] bytes = new byte[1024]; while ((len = in.read(bytes))!=-1){ out.write(len); out.flush(); } in.close(); out.close(); } }
import java.io.*; public class Demo12 { public static void main(String[] args) throws IOException { File fileA = new File("D:\\demo"); File fileB = new File("E:\\demo"); fileB.mkdir(); copyFile2(fileA, fileB); //更改名称 File[] files = fileB.listFiles(); for (File file : files) { String curretnFileName = file.getName(); curretnFileName=curretnFileName.replace(".java",".jad"); File destfile = new File(fileB, curretnFileName); file.renameTo(destfile); } } /** * Copy file * * @param fileA this file is the one which u want to copy * @param fileB this file is the one which u want to put the new file */ private static void copyFile2(File fileA, File fileB) throws IOException { //获取所有以.java为结尾的文件,返回一个文件对象数组 File[] files = fileA.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return new File(dir, name).isFile() && name.endsWith(".java"); } }); //遍历数组,把文件复制到目标目录中 for (File file : files) { String currentFileName = file.getName(); File fileB_0 = new File(fileB, currentFileName); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileB_0)); int len = 0; byte[] bytes = new byte[1024]; while ((len = in.read(bytes)) != -1) { out.write(len); out.flush(); } in.close(); out.close(); } } }
import java.io.*; import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo13 { public static void main(String[] args) throws IOException { //因为要排序,就选择TreeSet来储存学生对象 TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { // 比较总分 double num = s2.getTotal() - s1.getTotal(); // 比较姓名 //如果参数字符串等于此字符串,则返回值 0; //如果此字符串小于字符串参数,则返回一个小于 0 的值; //如果此字符串大于字符串参数,则返回一个大于 0 的值。 double num2 = (num == 0) ? s2.getName().compareTo(s1.getName()) : num; return (int) num2; } }); // 键盘录入学生信息,把学生信息封装成一个学生对象加入到集合中 for (int x = 0; x < 3; x++) { int i = x + 1; System.out.println("第" + i + "个学生信息录入开始................................"); // 创建一个Scanner对象 Scanner sc = new Scanner(System.in); System.out.println("请您输入第" + i + "个学生的姓名: "); String name = sc.nextLine(); System.out.println("请您输入第" + i + "个学生的语文成绩: "); double chineseScoreStr = sc.nextDouble(); System.out.println("请您输入第" + i + "个学生的数学成绩: "); double mathScoreStr = sc.nextDouble(); System.out.println("请您输入第" + i + "个学生的英语成绩: "); double englishScoreStr = sc.nextDouble(); Student student = new Student(name, chineseScoreStr, mathScoreStr, englishScoreStr); students.add(student); } // 创建一个高效的字符流输出对象 BufferedWriter bw = new BufferedWriter(new FileWriter("studentInfo.config")); //\t\t是制表符 bw.write("姓名\t\t总分\t\t语文成绩\t\t数学成绩\t\t英语成绩"); bw.newLine(); bw.flush(); for (Student s : students) { bw.write(s.getName() + "\t\t" + s.getTotal() + "\t\t" + s.getChineseScore() + "\t\t" + s.getMathScore() + "\t\t" + s.getEnglishScore()); bw.newLine(); bw.flush(); } bw.close(); System.out.println("已录完"); } } //首先创建一个学生类 class Student { private String name; private double chineseScore; private double mathScore; private double englishScore; public double getTotal() { return chineseScore + mathScore + englishScore; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getChineseScore() { return chineseScore; } public void setChineseScore(double chineseScore) { this.chineseScore = chineseScore; } public double getMathScore() { return mathScore; } public void setMathScore(double mathScore) { this.mathScore = mathScore; } public double getEnglishScore() { return englishScore; } public void setEnglishScore(double englishScore) { this.englishScore = englishScore; } public Student() { } public Student(String name, double chineseScore, double mathScore, double englishScore) { this.chineseScore = chineseScore; this.name = name; this.mathScore = mathScore; this.englishScore = englishScore; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。