InputStreamReader是从字节流到字符流的桥梁,它读取字节并使用指定的字符集将其解码为字符,通常将InputStreamReader包装在BufferedReader中使用。PrintStream为另一个输出流添加了功能,即方便地打印各种数据。
一、转换流
/*
* 转换流
* 输入流:InputStreamReader,将字节输入流转换成字符输入流
* 输出流:OutputStreamWriter,将字节输出流转换成字符输出流
* 特点:字节流向字符流转换
*
* 构造方法:
* InputStreamReader(InputStream in): 创建一个使用默认字符集的对象
* InputStreamReader(InputStream in, Charset cs):创建使用给定字符集的对象
* InputStreamReader(InputStream in, CharsetDecoder dec):创建使用给定字符集解码器的对象
* InputStreamReader(InputStream in, String charsetName):创建使用指定字符集的对象
*
* 常用方法:
* void close(): 关闭流释放资源
* String getEncoding(): 返回此流使用的字符编码的名称
* int read(): 读取的单个字符
* int read(char[] cbuf, int offset, int length): 将字符读入数组中的一部分
* boolean ready(): 判断此流是否已经准备好用于读取
* */
public class _01_InputStreamReader {
public static void main(String[] args) {
try (
// 创建字节输入流对象
FileInputStream fis = new FileInputStream(
"./SE/src/com/tianl/IO/_01_FileInputStream/_03_IO_FileInputStream.java");
// 创建转换流对象,把字节流传入,转换为字符流
InputStreamReader isr = new InputStreamReader(fis);
// 创建字符缓冲流,把转换流传入
BufferedReader br = new BufferedReader(isr)
){
// 读取一行
System.out.println(br.readLine());
// 循环读取
String temp = null;
while ((temp= br.readLine())!=null){
System.out.println(temp);
}
} catch (Exception e){
e.printStackTrace();
}
}
}
二、打印流
/*
* 打印流:打印流是输出最方便的类
* 字节打印流:PrintStream,是OutputStream的子类。把一个输出流的实例传递到打印流之后
* 可以更加方便的输出,相当于把输出流重新包装了一下
* 该类中的print()方法被重载了很多次,根据参数的不同有不同的输出
* 字符打印流:PrintWriter
*
* 标准输入/输出
* java的标准输入/输出分别通过System.in和System.out来表示,默认代表键盘和显示器
* 当程序通过System.in类获得输入时,时通过键盘获取。
* 当程序通过System.out类执行输出时,总是输出到屏幕。
*
* System类中提供了三个重定向标准输入/输出方法
* static void setErr(PrintStream err),重定向”标准“错误输出流
* static void setIn(PrintStream in),重定向”标准“输入流
* static void setOut(PrintStream out),重定向”标准“输出流
* */
public class _01_PrintStream {
public static void main(String[] args) throws FileNotFoundException {
// 标准打印流,打印到控制台
System.out.println("今天天气好吗");
// 保存标准打印流对象
PrintStream control = System.out;
System.out.println(control);
// 创建输出流
FileOutputStream fos = new FileOutputStream("D:/log.txt");
// 创建打印流,并传入输出流
PrintStream ps = new PrintStream(fos);
// 调用打印方法,打印到指定文件
ps.println("日志系统111");
// 设置System中的out
System.setOut(ps);
// 设置System中的out后,在使用打印语句,会打印到指定文件
// 设置打印到指定文件后,如何在设置打印到控制台?
// 先保存标准输出流对象,指定打印到文件使用结束后可根据标准输出流对象重新设置
System.out.println("hahahhhahh----------");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
System.out.println("test方法开始执行:"+simpleDateFormat.format(new Date()));
test();
System.out.println("test方法执行结束:"+simpleDateFormat.format(new Date()));
// 重设置会控制台输出
System.setOut(control);
System.out.println("重新设置完成");
}
public static void test(){
System.out.println("test方法执行!");
}
}
三、使用打印流完成文件复制
/*
* 使用打印流完成文件复制
* 实例:将D:/111.txt文件 复制到 D:JavaTest/111.txt
* 1 复制:就只输入和输出
* 2 先获取数据
* 3 再输出数据
* */
public class _02_PrintStreamTest {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream("D:/111.txt");
FileOutputStream fos = new FileOutputStream("D:/JavaTest/111.txt");
PrintStream ps = new PrintStream(fos);
){
byte[] bytes = new byte[1024];
int temp;
while ((temp=fis.read(bytes))!=-1){
ps.println(new String(bytes,0,temp));
}
} catch (Exception e){
e.printStackTrace();
}
}
}
扩展:非打印流实现 压缩包复制
/*
* D盘下一个压缩包test.zip
* 使用程序复制到另一个文件夹D:/JavaTest
* 非打印流实现
* 1 复制:就只输入和输出
* 2 先获取数据
* 3 在输出数据
* */
public class CopyTest2 {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream("D:/test1.zip");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("D:/JavaTest/test1.zip");
BufferedOutputStream bos = new BufferedOutputStream(fos)
){
byte[] bytes = new byte[1024];
int temp;
while ((temp= bis.read(bytes))!=-1){
bos.write(bytes,0,temp);
}
bos.flush();
System.out.println("完成");
} catch (Exception e){
e.printStackTrace();
}
}
}
扩展:zip流实现
/*
* D盘下一个压缩包test.zip,压缩包中默认无下级目录
* 使用程序复制到另一个文件夹D:/JavaTest
* 非打印流实现
* 1 复制:就只输入和输出
* 2 先获取数据
* 3 在输出数据
* */
public class CopyTest {
public static void main(String[] args) throws IOException {
try (
FileInputStream fis = new FileInputStream("D:/test.zip");
FileOutputStream fos = new FileOutputStream("D:/JavaTest/test.zip");
// zip输入流,传入文件输入流
ZipInputStream zis = new ZipInputStream(fis);
// zip输出流,传入文件输出流
ZipOutputStream zos = new ZipOutputStream(fos)
){
// zip压缩包中子文件
ZipEntry entry = null;
while ((entry= zis.getNextEntry())!=null){
// 子文件文件名
String name = entry.getName();
// 子文件非目录
if (!entry.isDirectory()){
// zip输出流中设置文件名
zos.putNextEntry(new ZipEntry(name));
int temp;
byte[] bytes = new byte[1024];
// zip输出流读取bytes
while ((temp=zis.read(bytes))!=-1){
// zip输出流写入
zos.write(bytes,0,temp);
}
}
}
System.out.println();
} catch (Exception e){
e.printStackTrace();
}
}
}