计算机如何存储中文的?
当前平台默认编码集 :GBK 一个中文两个字节
第一个字节:一定是负数
编码:
简单理解:将能看懂的东西--->看不懂的东西
解码:
看不懂的东西---能看懂的东西
举例: 谍战片
今天老地方见...
编码:
今---->字节---->二进制数据
解码:二进制数据-->十进制数据--->字节---->字符串
今
编码: 将字符串变成一个字节数组
public byte[] getBytes() :平台默认编码集(默认的是Gbk)
public byte[] getBytes(Charset charset) ;"指定编码格式
解码:将字节数组--->字符串
public String(byte[] bytes) :使用平台默认编码集(gbk)
字符输入流:Reader
字符输出流:Writer
字符输出流/字符输入流:都是抽象类
使用一个子类:转换流
字符输出流的构造方法
public OutputStreamWriter(OutputStream out):使用默认的编码格式构造一个字符转换输出流对象
public OutputStreamWriter(OutputStream out, Charset cs):使用指定编码格式构造一个字符转换输出流对象
转换流的构成=字节流+编码格式(平台默认/指定)
转换流的对象的创建,格式比较长,非常麻烦,Java--->转换流的便捷类
Reader:抽象类:字符输入流
inputStreamReader(字符转换输入流 :inputStream+编码格式)
便捷类:FileReader,这个类可以直接对文件进行操作
Writer:抽象类:字符输出流
outputStreamWriter(字符转换输出流:outputStream+编码格式)
便捷类:FileWriter,这个类可以直接对文件进行操作
InputStreamReader(InputStream in) :构造一个字符转换输入流,默认编码
public InputStreamReader(InputStream in,Charset cs) 构造一个字符转换输入流,指定编码
文本文件:优先采用字符流
源文件:a.txt---->Reader---->InputStreamReader---->FileReader
public void write(int c):写单个字符
public void write(char[] cbuf):写字符数组
public abstract void write(char[] cbuf, int off, int len):写字符数组的一部分
public void write(String str):写字符串
public void write(String str,int off, int len):写字符串的某一部分
flush和close方法的区别?
close:关闭该流,关闭该流对象以及它关联 的资源文件,关闭之后,不能再对流对象进行操作了,否则会有异常
flush:刷新该流,为了防止一些文件(图片文件/音频文件),缺失,或者没有加载到流对象中,刷新了该流,还是可以流对象进行操作
字符缓冲输入流/字符缓冲输出流
杂七杂八的流(properties:属性集合类/合并流/序列化Serializable/内存操作流)
int read():读取单个字符
字符缓冲输入流
字符缓冲输出流
BufferedWrier:文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
构造方法
BufferedWriter(Writer out) :默认缓冲区大小构造字符缓冲输出流对象
BufferedWriter(Writer out,int size):指定缓冲区大小
举例:
构造方法
public BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
public BufferedReader(Reader in, int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。
举例:
字符缓冲输出流:
特有功能:public void newLine():写入一个行的分隔符
字符缓冲输入流:
当前平台默认编码集 :GBK 一个中文两个字节
第一个字节:一定是负数
第二个字节:一般是负数,可能也会是正数,不会影响的结果.
举例:
public class StringDemo1 {
public static void main(String[] args) {
String s="我喜欢你";
byte[] b = s.getBytes();
System.out.println(Arrays.toString(b));
}
}
编码和解码:前后的编码格式要一致!
编码:
简单理解:将能看懂的东西--->看不懂的东西
解码:
看不懂的东西---能看懂的东西
举例: 谍战片
今天老地方见...
编码:
今---->字节---->二进制数据
解码:二进制数据-->十进制数据--->字节---->字符串
今
编码: 将字符串变成一个字节数组
public byte[] getBytes() :平台默认编码集(默认的是Gbk)
public byte[] getBytes(Charset charset) ;"指定编码格式
解码:将字节数组--->字符串
public String(byte[] bytes) :使用平台默认编码集(gbk)
public String(byte[] bytes,Charset charset):用指定的编码格式来解码
举例:
public class StringDemo2 {
public static void main(String[] args) throws IOException {
String s="我新欢你";
// 编码
byte[] b=s.getBytes("utf-8");
System.out.println(Arrays.toString(b));
// 解码
String s1=new String(b,"utf-8");
System.out.println(s1);
}
}
字符流:
字符输入流:Reader
字符输出流:Writer
字符输出流/字符输入流:都是抽象类
使用一个子类:转换流
字符输出流的构造方法
public OutputStreamWriter(OutputStream out):使用默认的编码格式构造一个字符转换输出流对象
public OutputStreamWriter(OutputStream out, Charset cs):使用指定编码格式构造一个字符转换输出流对象
转换流的构成=字节流+编码格式(平台默认/指定)
转换流的对象的创建,格式比较长,非常麻烦,Java--->转换流的便捷类
Reader:抽象类:字符输入流
inputStreamReader(字符转换输入流 :inputStream+编码格式)
便捷类:FileReader,这个类可以直接对文件进行操作
Writer:抽象类:字符输出流
outputStreamWriter(字符转换输出流:outputStream+编码格式)
便捷类:FileWriter,这个类可以直接对文件进行操作
需求:将a.txt文件中的内容进行复制,复制到当前项目下(b.txt)
举例:
public class WriteDemo {
public static void main(String[] args) throws IOException {
//创建一个字符输出流
// Writer w=new OutputStreamWriter(new FileOutputStream("w"));
OutputStreamWriter osw=new OutputStreamWriter(
new FileOutputStream("osw.txt"));
osw.write("您好,hello");
osw.close();
}
}
字符转换输入流:InputStreamReader
InputStreamReader(InputStream in) :构造一个字符转换输入流,默认编码
public InputStreamReader(InputStream in,Charset cs) 构造一个字符转换输入流,指定编码
字符转换输入流=字节流+编码格式
举例:
public class ReaderDemo {
public static void main(String[] args) throws IOException {
InputStreamReader isr=new InputStreamReader(
new FileInputStream("osw.txt"));
char[] c=new char[1024];
int len=0;
while((len=isr.read(c))!=-1) {
System.out.println(new String(c,0,len));
}
isr.close();
}
}
需求:将a.txt文件中的内容进行复制,复制到当前项目下(b.txt)
文本文件:优先采用字符流
源文件:a.txt---->Reader---->InputStreamReader---->FileReader
目的的文件:b.txt--->Writer-->OutputStreamWriter---->FileWriter
举例:
public class CopyDemo {
public static void main(String[] args) throws IOException {
//封装源文件和目的文件
InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"));
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("copy5.txt"));
char[] c=new char[1024];
int len=0;
while((len=isr.read(c))!=-1) {
osw.write(new String(c,0,len));
}
isr.close();
osw.close();
//方法二:使用便捷类进行操作
FileReader fr=new FileReader ("a.txt");
FileWriter fw=new FileWriter("copy6.txt");
char[] c1=new char[1024];
int len2=0;
while((len=fr.read(c1))!=-1) {
fw.write(c1);
}
fr.close();
fw.close();
}
}
字符输出流写数据的功能:
public void write(int c):写单个字符
public void write(char[] cbuf):写字符数组
public abstract void write(char[] cbuf, int off, int len):写字符数组的一部分
public void write(String str):写字符串
public void write(String str,int off, int len):写字符串的某一部分
flush和close方法的区别?
close:关闭该流,关闭该流对象以及它关联 的资源文件,关闭之后,不能再对流对象进行操作了,否则会有异常
flush:刷新该流,为了防止一些文件(图片文件/音频文件),缺失,或者没有加载到流对象中,刷新了该流,还是可以流对象进行操作
字符缓冲输入流/字符缓冲输出流
杂七杂八的流(properties:属性集合类/合并流/序列化Serializable/内存操作流)
public class WriterDemo2 {
public static void main(String[] args) throws IOException {
//创建字符输出流对象
FileWriter fw=new FileWriter("fw.txt");
fw.write('a');
fw.write(97);
fw.flush();
fw.write(98);
//写一个字符串数组
char[] c= {'a','b','c','d'};
fw.write(c);
String s="我喜欢你";
fw.write(s);
fw.flush();
fw.close();
}
}
注释:字符流在使用时必须刷新一下
字符输入流读数据的方法:
int read(char[] chs):读取一个字符数组int read():读取单个字符
public class ReaderDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader ("a.txt");
char [] c=new char[1024];
int len=0;
while((len=fr.read(c))!=-1) {
System.out.println(new String(c,0,len));
}
fr.close();
}
}
在字符流中提供了一个更高效的流-->字符缓冲流
字符缓冲输入流
字符缓冲输出流
BufferedWrier:文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
构造方法
BufferedWriter(Writer out) :默认缓冲区大小构造字符缓冲输出流对象
BufferedWriter(Writer out,int size):指定缓冲区大小
举例:
public class BufferWriterDemo {
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(
new FileWriter("bw.txt"));
bw.write("hello");
bw.write("world");
bw.flush();
bw.close();
}
}
BufferedReader:字符缓冲输入流
构造方法
public BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
public BufferedReader(Reader in, int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。
举例:
public class BufferReaderDemo {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(
new FileReader("bw.txt"));
char[] c=new char[1024];
int len=0;
while((len=br.read(c))!=-1) {
System.out.println(new String(c,0,len));
}
br.close();
}
}
先使用字符缓冲输出流写数据,在使用字符缓冲输入读数据,显示控制台上
字符缓冲输出流:
特有功能:public void newLine():写入一个行的分隔符
字符缓冲输入流:
特有功能:public String readLine():一次读取一行
举例:
public class BufferDemo {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader (
new FileReader("bw.txt"));
String line=null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
}