Java基础学习 —— io
1 /** 2 解决数据与数据之间的传输问题。 3 字节流: 4 输入字节流: 5 -------| InputStream 所有输入字节流的基类。抽象类。 6 -----------| FileInputStream 读取文件的输入字节流。 7 -----------| BufferedInputStream 缓冲输入字符的字节流 该类内部 维护了一个8kb的字节数组。该类出现的目的 是为了提高读取文件数据的效率。 8 9 输出字节流: 10 -------| OutputStream 所有输出字节流的基类。抽象类。 11 -----------| FileOutputStream 向文件输出数据 的输出字节流。 12 -----------| BufferedOutputStream 缓冲输出字节流,为了提高写入文件的效率。类内部也是维护了一个8kb的字节数组。 13 14 什么情况使用字节流? 15 字节流都是为了读取到2进制的数据。 16 读取到的数据 不需要经过编码 解码的情况下, 可以使用字节流 such as: 图片数据 图片数据 不需要变成我们可以读懂的字符流。不需要进过解码 17 如果读到的数据 需要转换成 我们读的懂的字 那就必须要转换成字符流 18 字符流=字节流+编码(解码) 19 20 21 字符流: 22 输入字符流: 23 -------| Reader 所有输入字符流的基类。抽象类。不可以直接使用 24 -----------| FileReader 读取文件字符的输入字符流 25 -----------| BufferedReader 缓冲输入字符流 该类出现的目的 是为了提高读取文件字符的效率。内部是维护了一个8192个长度字符数组。除了提高效率,并且还拓展了功能, 多了个readline()的功能 26 27 输出字符流: 28 -------| Writer 所有输出字符流的基类。抽象类 29 -----------| FileWriter 向文件输出字符数据的输出字符流。 30 -----------|BufferedWriter 缓冲输出字符流。为了提高写入文件的效率和拓展了功能newline() 31 32 什么时候用到字符流呢? 33 读取到的字节数据需要被转换成字符数据,这时候我们就使用字符流,如果是读写的都是字符数据这时候我们需要用字符流。 34 35 36 转换流: 37 -------|InputStreamReader 输入字节流的转换流。可以吧一个输入字节流 转换成输入字符流,(前面字节,后面字符) 38 -------|OutputStreamReader 输出字节流的转换流 39 40 转换流的作用: 41 1.可以吧对应的字节流转换成字符流使用。 42 2. 43 44 */ 45 public class demo1 { 46 public static void main(String[] args) throws Exception { 47 testInput(); 48 } 49 public static void testInput() throws Exception{ 50 51 //标准输入流,默认读取控制台。用in来读控制台的内容 52 InputStream in = System.in; 53 int read = in.read(); 54 System.out.println(read); 55 } 56 }
该demo输出的是字节流
abc
97
如果想要将输入内容完整的输出到控制台 那么我们就需要将字节流转换为字符流。
1 public class demo1 { 2 public static void main(String[] args) throws Exception { 3 testInput(); 4 } 5 public static void testInput() throws Exception{ 6 7 //标准输入流,默认读取控制台。用in来读控制台的内容 8 System.out.println("输入:"); 9 InputStream in = System.in; 10 //int read = in.read(); 11 12 //将in转换为字符流 13 InputStreamReader iReader = new InputStreamReader(in); 14 15 BufferedReader bReader = new BufferedReader(iReader); 16 System.out.println("输出:"+bReader.readLine()); 17 } 18 }public class demo1 { 19 public static void main(String[] args) throws Exception { 20 testInput(); 21 } 22 public static void testInput() throws Exception{ 23 24 //标准输入流,默认读取控制台。用in来读控制台的内容 25 System.out.println("输入:"); 26 InputStream in = System.in; 27 //int read = in.read(); 28 29 //将in转换为字符流 30 InputStreamReader iReader = new InputStreamReader(in); 31 32 BufferedReader bReader = new BufferedReader(iReader); 33 System.out.println("输出:"+bReader.readLine()); 34 } 35 }
输入:
abc
输出:abc
转换流将输出字节流 转换为输出字符流。
1 public static void testOutput() throws Exception, IOException { 2 Socket socket = new Socket(InetAddress.getLocalHost(), 9090); 3 //获取到字节流 4 OutputStream outputStream = socket.getOutputStream(); 5 //将输出字节流转化为输出字符流。 6 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); 7 outputStreamWriter.write("ok"); 8 }
转换流的第二个作用
2.读写文件的时候FileReader,FileWriter默认使用的是GBK编码表,不能由自己来指定码表来读写数据。而转换流可以指定码表的读写转换数据。
1 public static void writeFile() throws IOException{ 2 FileOutputStream fileOutputStream2 = new FileOutputStream("D:\\a.txt"); 3 OutputStreamWriter outputStreamWriter2 = new OutputStreamWriter(fileOutputStream2,"utf-8"); 4 outputStreamWriter2.write("sony是猪"); 5 outputStreamWriter2.close(); 6 } 7 public static void ReadFile() throws IOException{ 8 FileInputStream fileInputStream = new FileInputStream("D:\\a.txt"); 9 //创建转换流并且创建码表 10 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8"); 11 int content = 0; 12 while((content = inputStreamReader.read())!=-1){ 13 System.out.print((char)content); 14 } 15 fileInputStream.close(); 16 }
sony是猪