字节和字符的桥梁
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);
}
}