java之IO流(四)

计算机如何存储中文的?
  当前平台默认编码集 :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();
}
}


猜你喜欢

转载自blog.csdn.net/wt5264/article/details/80579265