当前位置:   article > 正文

Java学习笔记(3.31)_学习java

学习java

目录

一、IO流

1、IO流的分类

2、字节流

1、字节流写数据

2、字节流写数据的方式

3、字节流写数据的两个小问题

 4、字节流写数据的异常处理

5、字节流读数据

6、字节缓冲流

二、字符流

1、编码表

2、字符串中的编码解码问题

3、字符流中的编码解码问题

4、字符流写数据

5、字符流读数据

6、字符缓冲流


一、IO流

概述:

IO指输入输出(Input/Output)

流是一种抽象概念,是对数据传输的总称。也就是说数据在设备之间的传输称为流,流的本质是传输数据。

IO流就是用来处理设备间数据传输问题的,常见应用有:文件复制、文件下载、文件上传。

1、IO流的分类

     按数据的流向----输入流:读数据/输出流:写数据。

     按数据类型----字节流:字节输入流、字节输出流 / 字符流:字符输入流、字节输出流。

两种流的使用选择:

如果通过Windows自带的记事本打开,能读懂里面的内容,就使用字符流。否则使用字节流。使用字节流居多。

2、字节流

1、字节流写数据

字节流抽象基类

InputStream:这个抽象类是表示字节输入流的所有类的超类。

OutputStream:这个抽象类表示字节输出流的所有类的超类。

子类名称特点:子类名称都是以其父类名作为子类名的后缀。

FileOutputStream(String name):创建文件输出流以指定的名称写入文件。

• 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

• 调用字节输出流对象的写数据方法

• 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)

2、字节流写数据的方式

  1. package myByteStream002;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class ByteStreamDemo {
  5. public static void main(String[] args) throws IOException {
  6. FileOutputStream fos=new FileOutputStream("fos.txt");
  7. fos.write(97);
  8. fos.write(98);
  9. //将指定的字节写入此文件输出流
  10. byte[]bys= {97,98};
  11. fos.write(bys);
  12. //将bys.length字节从指定的字节数组写入此文件输出流
  13. byte[] b="abcde".getBytes();
  14. //byte[] getBytes();返回字符串对应的字节数组
  15. fos.write(b);
  16. fos.write(b, 0,b.length);
  17. //将b.length字节从指定的字节数组开始,从偏移量off开始写入此文件输出流。一次写一个字节数组的部分数据
  18. fos.close();
  19. }
  20. }

3、字节流写数据的两个小问题

1、如何换行:

         Windows--->\r\n

         linux--->\n

         mac--->\r

2、如何实现追加写入:

使用如下方法构造新的FileOutputStream类型数据

public FileOutputStream(Stringname,boolean append);

创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头

  1. package myByteStream003;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class ByteStreamDemo {
  5. public static void main(String[] args) throws IOException {
  6. FileOutputStream fos=new FileOutputStream("C:\\Users\\yushimin\\eclipse-workspace\\myByteStream\\fos.txt");
  7. for(int i=0;i<10;i++) {
  8. fos.write("hello".getBytes());
  9. fos.write("\r\n".getBytes());
  10. }
  11. fos.close();
  12. FileOutputStream fos2 =new FileOutputStream("fos.txt",true);
  13. for(int i=0;i<10;i++) {
  14. fos2.write("hello".getBytes());
  15. fos2.write("\r\n".getBytes());
  16. }
  17. fos2.close();
  18. }
  19. }

 4、字节流写数据的异常处理

finally:在异常处理时提供finally块来执行所有清除操作。

比如说IO流中的释放资源特点:被finally控制的语句一定会执行,除非NVM退出

  1. package myByteStream004;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class ByteStreamDemo {
  5. public static void main(String[] args) {
  6. FileOutputStream fos=null;
  7. try {
  8. fos=new FileOutputStream("fos.txt");
  9. fos.write("hello".getBytes());
  10. }catch(IOException e) {
  11. e.printStackTrace();
  12. }finally {
  13. if(fos!=null) {
  14. try {
  15. fos.close();
  16. } catch (IOException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. }
  23. }

5、字节流读数据

把文件中的内容读取出来,在控制台输出。

使用字节输入流读数据的步骤:

1- 创建字节输入流对象

2- 调用字节输入流对象的读数据方法

3- 释放资源

1、一次读一个字节数据

FilelnputStream:从文件系统中的文件获取输入字节。

•FilelnputStream(String name):通过打开与实际文件的连接来创建一个 FilelnputStream,该文件由文件系統中的路径名 name命名
 

  1. package myByteStream005;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. public class ByteStreamDemo {
  5. public static void main(String[] args) throws IOException {
  6. FileInputStream fis=new FileInputStream("fos.txt");
  7. int by;
  8. while((by=fis.read())!=-1) {
  9. //System.out.println(by);
  10. System.out.print((char)by);
  11. }
  12. //文件达到末尾输出 -1
  13. fis.close();
  14. }
  15. }

2、一次读一个字节数组数据

  1. package myByteStream006;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. public class ByteStreamDemo {
  5. public static void main(String[] args) throws IOException {
  6. FileInputStream fis=new FileInputStream("fos.txt");
  7. byte[] b=new byte[1024];//一般为1024的整数倍
  8. int len;
  9. while((len=fis.read(b))!=-1) {
  10. System.out.print(new String(b,0,len));
  11. }
  12. fis.close();
  13. }
  14. }

6、字节缓冲流

  1. package myByteStream007;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. public class ByteStreamDemo {
  8. public static void main(String[] args) throws IOException {
  9. //字节缓冲输出流
  10. /*
  11. * FileOutputStream fos=new FileOutputStream("bos.txt");
  12. * BufferedOutputStream bos=new BufferedOutputStream(fos);
  13. */
  14. BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream ("bos.txt"));
  15. bos.write("hello".getBytes());
  16. bos.close();
  17. //字节缓冲输入流
  18. BufferedInputStream bis=new BufferedInputStream(new FileInputStream ("bos.txt"));
  19. // int by;
  20. // while((by=bis.read())!=-1) {
  21. // System.out.print((char)by);
  22. // }
  23. byte [] byt=new byte[1024];
  24. int len;
  25. while((len=bis.read(byt))!=-1) {
  26. System.out.print(new String(byt,0,len));
  27. }
  28. bis.close();
  29. }
  30. }

二、字符流

由于字节流操作中文不是特别的万便,所以Java就提供字符流

• 字符流=字节流+编码表

用字节流复制文本文件时,文本文件也会有中文,最终底层操作会自动进行字节拼接成中文, 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。

  1. package myCharStream001;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. public class CharStreamDemo {
  5. public static void main(String[] args) throws IOException {
  6. FileInputStream fis=new FileInputStream("fos.txt");
  7. int by;
  8. while((by=fis.read())!=-1) {
  9. System.out.print((char)by);
  10. }
  11. fis.close();
  12. }
  13. }

1、编码表

基础知识:

 计算机中储存的信息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果

 按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。

这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会导致乱码现象。

字符集:

是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。

常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

2、字符串中的编码解码问题

编码:

●byte[]getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中

●byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

解码:

●String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String

●String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

  1. package myCharStream001;
  2. import java.io.UnsupportedEncodingException;
  3. import java.lang.reflect.Array;
  4. import java.util.Arrays;
  5. public class CharStreamDemo001 {
  6. public static void main(String[] args) throws UnsupportedEncodingException {
  7. String s="中国";
  8. byte [] bys1=s.getBytes("UTF-8");
  9. System.out.println(Arrays.toString(bys1));
  10. byte [] bys2=s.getBytes("GBK");
  11. System.out.println(Arrays.toString(bys2));
  12. byte[] bys3=s.getBytes();
  13. String ss=new String(bys3);
  14. System.out.println(ss);
  15. //使用何种编码方式编码,就要用何种方式解码
  16. }
  17. }

3、字符流中的编码解码问题

字符流抽象基类

• Reader:字符输入流的抽象类

• Writer: 字符输出流的抽象类

字符流中和编码解码问题相关的两个类:

•InputStreamReader

•OutputStreamWriter

  1. package myCharStream002;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStreamWriter;
  8. public class CharStreamDemo {
  9. public static void main(String[] args) throws IOException {
  10. FileOutputStream fos=new FileOutputStream("C:\\Users\\yushimin\\eclipse-workspace\\myCharStream\\bin\\myCharStream002\\ows.txt");
  11. OutputStreamWriter osw=new OutputStreamWriter(fos,"GBK");
  12. osw.write("中国");
  13. osw.close();
  14. FileInputStream fis=new FileInputStream("C:\\Users\\yushimin\\eclipse-workspace\\myCharStream\\bin\\myCharStream002\\ows.txt");
  15. InputStreamReader isr=new InputStreamReader(fis,"GBK");
  16. int by;
  17. while((by=isr.read())!=-1) {
  18. System.out.print((char)by);
  19. }
  20. fis.close();
  21. }
  22. }

4、字符流写数据

  1. package myCharStream003;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStreamWriter;
  5. public class CharStreamDemo {
  6. public static void main(String[] args) throws IOException {
  7. OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("ows.txt"));
  8. osw.write(97);
  9. osw.flush();
  10. //刷新流
  11. osw.write(100);
  12. char[] ch= {'a','b','c','d'};
  13. osw.write(ch);
  14. osw.write(ch, 1, 3);
  15. //写入字符数组的一部分
  16. osw.write("hello");
  17. osw.write("java", 1, 2);
  18. osw.close();
  19. }
  20. }

5、字符流读数据

  1. package myCharStream003;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. public class CharStreamDemo {
  8. public static void main(String[] args) throws IOException {
  9. InputStreamReader isr=new InputStreamReader(new FileInputStream("ows.txt"));
  10. int ch;
  11. while((ch=isr.read())!=-1) {
  12. System.out.print((char)ch);
  13. }
  14. System.out.println("\n");
  15. System.out.println("---------------------");
  16. char []chr=new char [1024];
  17. int len;
  18. while((len=isr.read(chr))!=-1) {
  19. System.out.println(new String(chr,0,len));
  20. }
  21. isr.close();
  22. }
  23. }

6、字符缓冲流

字符缓冲流:

• BufferedWiter: 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符申的高效写

入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

• BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以

指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途

构造方法:

BufferedWriter (Writert Out);

BufferedReader (Reader Out);

  1. package myCharStream004;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. public class CharStreamDemo {
  8. public static void main(String[] args) throws IOException {
  9. FileWriter fw=new FileWriter("bw.txt");
  10. BufferedWriter bw=new BufferedWriter(fw);
  11. bw.write("hello");
  12. bw.write("\n");
  13. bw.write("java");
  14. bw.close();
  15. fw.close();
  16. BufferedReader br=new BufferedReader(new FileReader("bw.txt"));
  17. char[] ch=new char[1024];
  18. int len;
  19. while(( len=br.read(ch))!=-1) {
  20. System.out.print(new String (ch,0,len));
  21. }
  22. br.close();
  23. }
  24. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/630712
推荐阅读
相关标签
  

闽ICP备14008679号