字符流---Day32
时隔多久,我又回来写博客了,最近忙于两个课设,五周,搞得头发都不知道掉了多少根了,还没成为程序员就开始掉了,等我成为一名程序员的时候岂不是要秃头了,IT界的人会不会帮我当成大佬了,哈哈哈哈,希望我以后也可以成为一名IT界的大佬,虽然有点不现实,但是梦想还是要有的,万一不经意间就实现了也说不定,加油~
字符流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件
字符输入流[Reader]
java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入 流的基本共性功能方法
public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 从输入流读取一个字符。
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader类
java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。 idea中UTF-8
2. 字节缓冲区:一个字节数组,用来临时存储字节数据。
构造方法:
FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
读取字符数据:
1. 读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取
package demosummary.file.filereader; import java.io.FileReader; public class FileReader_02 {
public static void main(String[] args) throws Exception{
//使用文件名创建流对象
FileReader fr = new FileReader(".\\src\\demosummary\\file\\a.txt");
//定义变量,保存数据
int a;
//循环读取
while ((a = fr.read())!= -1) {
System.out.println((char) a);
}
//释放资源
fr.close();
}
/**
* 输出结果
* 黑
* 马
* 程
* 序
* 员
*/
}
2. 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数, 读取到末尾时,返回 -1
package demosummary.file.filereader; import java.io.FileReader; public class FileReader_03 {
public static void main(String[] args) throws Exception{
//创建流对象
FileReader fr = new FileReader(".//src//demosummary//file//a.txt");
//定义变量
int len;
//定义字符数组,作为装字符的容器
char[] l = new char[2];
//循环读取
while ((len = fr.read(l)) != -1) {
System.out.println(new String(l, 0, len));
}
fr.close();
}
/**
* 输出结果
* 黑马
* 程序
* 员
*/
}
字符输出流[writer]
java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节 输出流的基本共性功能方法
void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len 写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个 数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。
FileWriter类
java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区
构造方法
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称
基本写出数据
写出字符: write(int b) 方法,每次可以写出一个字符数据
package demosummary.file.filereader; import java.io.FileWriter; public class FileReader_04 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//b.txt");
//写入数据
fw.write(97);
fw.write('b');
fw.write('C');
fw.write(30000);
fw.write(40000); //刷新缓冲
fw.flush();
//释放资源
fw.close();
}
/**
* 输出结果
* abC田鱀
*/
}
注意:
1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。
关闭和刷新
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据 的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。
flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
package demosummary.file.filereader; import java.io.FileWriter; public class FileReader_05 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//c.txt"); //写入数据并刷新
fw.write("刷");
fw.flush();
fw.write("新");
fw.flush(); //写入数据,并关闭
fw.write("关");
fw.close();
fw.write("闭");//报错(流已关闭): Stream closed
fw.close(); //释放资源
fw.close();
}
/**
* 输出结果
* 刷新关
*/
}
注意:即便是flush方法写出了数据,操作的后还是要调用close方法,释放系统资源。
写出其他数据
1. 写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数 组中的数据,用法类似FileOutputStream
package demosummary.file.filereader; import java.io.FileWriter; public class FileReader_06 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//d.txt"); char[] chars = "黑马程序员".toCharArray(); fw.write(chars);//黑马程序员 fw.write(chars,2,2);//程序
//释放资源
fw.close();
}
/**
* 输出结果
* 黑马程序员
* 程序
*/
}
2. 写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的 数据,更为方便
package demosummary.file.filereader; import java.io.FileWriter; public class FileReader_07 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//e.txt"); String string = "传智播客"; fw.write(string);//传智播客 fw.write(string,2,2);//播客
//释放资源
fw.close();
}
/**
* 输出结果
* 传智播客播客
*/
}
3. 续写和换行:操作类似于FileOutputStream
package demosummary.file.filereader; import java.io.FileWriter; public class FileReader_08 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//f.txt"); //写入字符串
fw.write("黑马");
//写入换行
fw.write("\r\n");
//写入字符串
fw.write("程序员");
//释放资源
fw.close();
}
/**
* 输出结果
* 黑马
* 程序员
*/
}
注意:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流
字符流---Day32的更多相关文章
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- Java IO之字符流和文件
前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...
- IO流中将字节流转成字符流的方法
//字节流--->字符流 1. public class TestIO { public static void main(String[] args) throws IOException { ...
- JAVA之IO流(字符流)
字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...
- java IO输入输出流中的各种字节流,字符流类
字节流字节流主要是操作byte类型数据,也byte数组为准,主要操作类就是·字节输出流:OutputStream·字节输入流:InputStream字符流在程序中一个字符等于2个字节,那么java提供 ...
- Java字节流和字符流区别
1.字节流:直接操作文件本身. 2.字符流:通过缓冲区来操作文件. 所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节 ...
- 用字符流实现每个文件夹中创建包含所有文件信息的readme.txt
package com.readme; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; i ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
- [Java IO]03_字符流
Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类. 它的定义如下: public abstra ...
随机推荐
- C 语言实现面向对象编程
转载 https://blog.csdn.net/onlyshi/article/details/81672279 C 语言实现面向对象编程1.引言面向对象编程(OOP)并不是一种特定的语言或者工具, ...
- CDH安装时,无法纳管全部的节点的一个bug
问题描述: 使用CDH 5.2版本安装时,agent节点有12个.按照安装说明,在各个节点启动cm-agent之后,发现只有6个节点能被纳管.其它的节点总是无法加入纳管中. 在确认防火墙已经关闭后 ...
- XSS常见攻击与防御
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...
- Laravel Vuejs 实战:开发知乎 (5)设计问题表
1.执行命令: php artisan make:model Models/Question -cm 2.设计问题的数据库迁移文件中的字段: <?php use Illuminate\Datab ...
- 【Python】如何处理Excel中的数据
我们平时在做自动化测试的时候,可能会涉及到从表格中去读取或者存储数据,我们除了可以使用openpyxl来操作excel,当然也可以利用pandas来完成,这篇随笔只是我在学习过程中的简单记录,其他的功 ...
- IDF-CTF-简单的Elf逆向Writeup
ElfCrackMe1 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...
- tkinter学习(4)frame、pack、canvas学习
1.frame和pack学习 1.1 代码: import tkinter as tk window = tk.Tk() window.title('my window') window.geomet ...
- 【C语言】创建一个函数,并调用比较两个数的大小
#include <stdio.h> int max(int x,int y) { if(x>=y) return x; else return y; } main() { int ...
- MTSQL主主同步方案
** MySQL主主+Keepalived **MySQL+DRBD+Heartbeat 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主主方案,一主多从,读写分离等,但是 ...
- 获取SqlServer存储过程定义的三种方法
declare @p_text varchar(max) SELECT @p_text= text FROM syscomments WHERE id = ( SELECT id FROM sysob ...