1.字符输出流

字符输出流---Writer类---抽象类---不能new---子类

1.1 FileWriter类

       (1)构造方法

FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)给一个String对象构造一个是否允许追加FileWriter对象。

例:

import java.io.File;

import java.io.FileWriter;

import java.io.Writer;



public class FileWriteTest1 {



   public static void main(String[] args) throws Exception {

      //FileWriter(File file) 给一个File对象构造一个FileWriter对象

      String pathname1="E:"+File.separator+"mytest"+File.separator+"test1.txt";

      File file1=new File(pathname1);

      FileWriter filewriter1=new FileWriter(file1);

      Writer filewriter11=new FileWriter(file1);//或者上转型

      //FileWriter(File file, boolean append) 给一个File对象构造一个是否允许追加FileWriter对象。

      String pathname2="E:"+File.separator+"mytest"+File.separator+"test1.txt";

      File file2=new File(pathname2);

      FileWriter filewriter2=new FileWriter(file2,true);

      Writer filewriter22=new FileWriter(file2,true);//或者上转型

      //FileWriter(String fileName) 给一个String对象构造一个FileWriter对象

      String pathname3="E:"+File.separator+"mytest"+File.separator+"test1.txt";

      FileWriter filewriter3=new FileWriter(pathname3);

      Writer filewriter33=new FileWriter(pathname3);//或者上转型

      //FileWriter(String fileName, boolean append)给一个String对象构造一个是否允许追加FileWriter对象

      String pathname4="E:"+File.separator+"mytest"+File.separator+"test1.txt";

      FileWriter filewriter4=new FileWriter(pathname4,true);

      Writer filewriter44=new FileWriter(pathname4,true);//或者上转型

     

   }



}

(2)实例方法

   

void     write(char[] cbuf) 写入一个字符数组。
      void     write(char[] cbuf, int off, int len) 写入字符数组的一部分。
      void     write(int c) 写一个字符
      void     write(String str) 写一个字符串
      void     write(String str, int off, int len) 写一个字符串的一部分。
      void     close() 关闭流,先刷新。
      void     flush() 刷新流。

例:

import java.io.File;

import java.io.FileWriter;

import java.io.Writer;



public class FileWriteTest2 {



   public static void main(String[] args) throws Exception {

      //FileWriter(File file) 给一个File对象构造一个FileWriter对象

      String pathname1="E:"+File.separator+"test"+File.separator+"test1.txt";

      File file1=new File(pathname1);

      FileWriter filewriter1=new FileWriter(file1);



  

      //void write(char[] cbuf) 写入一个字符数组。

      /*

       *  String info="hello,world";

          char ch1[]=info.toCharArray();

          filewriter1.write(ch1);

          filewriter1.flush();

          filewriter1.close();

      */

      //void write(char[] cbuf, int off, int len) 写入字符数组的一部分。

         /*

          String info="hello,world";

          char ch1[]=info.toCharArray();

          filewriter1.write(ch1, 2, 8);//llo,wor

          filewriter1.flush();

          filewriter1.close();

          */

      //void write(String str) 写一个字符串

             String info="hello,world";

             filewriter1.write(info);

      //void write(String str, int off, int len) 写一个字符串的一部分。

             filewriter1.write(info, 0, 4);

            

      //void write(int c) 写一个字符

             filewriter1.write(97); //a

          //写出hello,world

          char ch[]=info.toCharArray();

          for(char c:ch){

             filewriter1.write(c);

          }

             filewriter1.flush();

             filewriter1.close();

   }



}

1.2 BufferedWriter类

       (1)构造方法

BufferedWriter(Writer  out)通过字符输出流的对象创建BufferedWriter

      (2)实例方法

     

void     write(char[] cbuf, int off, int len) 写入字符数组的一部分。
      void     write(int c) 写一个字符
      void     write(String s, int off, int len) 写一个字符串的一部分。
      void     close() 关闭流,先刷新。
      void     flush() 刷新流。

多一个

      void     newLine() 写一行行分隔符,跳转到下一行。

例:

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;



public class BufferedWriterTest {



   public static void main(String[] args) throws Exception{

      //BufferedWriter(Writer  out)通过字符输出流的对象创建BufferedWriter

      String pathname1="E:"+File.separator+"test"+File.separator+"test2.txt";

      File file1=new File(pathname1);

      FileWriter fileWriter = new FileWriter(file1,true);

      BufferedWriter buffeinput=new BufferedWriter(fileWriter);

      /*

       * 和FileWriter都一样

      //void write(char[] cbuf, int off, int len) 写入字符数组的一部分。

      //void write(int c) 写一个字符

      //void write(String s) 写一个字符串

      //void write(String s, int off, int len) 写一个字符串的一部分。

      //void close() 关闭流,先刷新。

      //void flush() 刷新流。

      */

      //void newLine() 写一行行分隔符,跳转到下一行。

      String str1="hello,zhangsan";

      buffeinput.write(str1);

      buffeinput.newLine();

      String str2="hello,lisi ";

      buffeinput.write(str2);

      buffeinput.flush();

      buffeinput.close();

   }



}

1.3 OutputStreamWriter类

       (1)构造方法

OutputStreamWriter(OutputStream out)将字节输出流转换成字符输出流

例:

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStreamWriter;



public class OutputStreamWriterTest {



   public static void main(String[] args) throws Exception {

      //之前我们需要向文件写出一个字符串数据,使用字节输出流,需要将字符串数据转换成字节数组

      /*

      String pathname1="E:"+File.separator+"test"+File.separator+"test3.txt";

      File file1=new File(pathname1);

      FileOutputStream fileOutputStream = new FileOutputStream (file1);

      String info="hello,world";

      fileOutputStream.write(info.getBytes());

      fileOutputStream.close();

      */

     

      //将字节输出流转换成字符输出流,好一次性直接写出字符串

      String pathname1="E:"+File.separator+"test"+File.separator+"test3.txt";

      File file1=new File(pathname1);

      FileOutputStream fileOutputStream = new FileOutputStream (file1);

      OutputStreamWriter out=new OutputStreamWriter(fileOutputStream);

      String info="hello,world";

      out.write(info);

      out.close();

      fileOutputStream.close();

   }

}

2.字符输入流

字符输入流---Reader类---抽象类---不能new---子类

2.1 FlieReader类

       (1)构造方法

      FileReader(File file) 给一个File对象构造一个FileReader对象。

      FileReader(String fileName)

      (2)实例方法

     int  read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1

      int  read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1

      void     close()

例:

import java.io.File;

import java.io.FileReader;



public class FileReaderTest {



   public static void main(String[] args) throws Exception {

      //构造方法

      //FileReader(File file) 给一个File对象构造一个FileReader对象。

      String pathname1="E:"+File.separator+"test"+File.separator+"test1.txt";

      File file1=new File(pathname1);

      FileReader fileReader1 = new FileReader(file1);

      //FileReader(String fileName) 给一个String对象构造一个FileReader对象。

      FileReader fileReader2 = new FileReader(pathname1);

     

      //实例方法

      //int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1

      //int readnumber=fileReader1.read();

      //System.out.println((char)readnumber);

      //循环读出所有的

      /*

      int num=0;//定义保存数据的变量

      char ch2[]=new char[(int) file1.length()];

      int index=0;

      while((num=fileReader1.read())!=-1){

          ch2[index]=(char)num;

          index++;

      }

      String str=new String(ch2);

      System.out.println(str);

      */

      //int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1

      char ch3[]=new char[(int)file1.length()];

      int len=fileReader1.read(ch3);

      String str1=new String(ch3,0,len);

      System.out.println(str1);

      //void close() 关闭流并释放与之相关联的任何系统资源。

      fileReader1.close();

   }

}

2.2 BufferedReader类

       (1)构造方法

BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader

      (2)实例方法

int read()
nt  read(char[] cbuf)
void     close() 关闭流并释放与之相关联的任何系统资源。
String   readLine() 读一行文字。

例:

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.io.Reader;



public class BufferedReaderTest {



   public static void main(String[] args) throws Exception{

      //BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader

      String pathname1="E:"+File.separator+"test"+File.separator+"test2.txt";

      File file1=new File(pathname1);

      Reader reader=new FileReader(file1);

      BufferedReader bufferedReader = new BufferedReader(reader);

     

     

      //int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1。

          //int read = bufferedReader.read();

          //System.out.println((char)read);

          //读全部遍历

          /*

          int num=0;

          int index=0;

          char ch1[]=new char[(int)file1.length()];

          while((num=bufferedReader.read())!=-1){

                ch1[index]=(char)num;

                index++;

          }

          String str1=new String(ch1);

          System.out.println(str1);

          */

      //int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1

     

      //String  readLine() 读一行文字。

          //这个就更快

          String info=null;

          while((info=bufferedReader.readLine())!=null){

             System.out.println(info);

          }

  

      //void close() 关闭流并释放与之相关联的任何系统资源。

      bufferedReader.close();

      reader.close();

   }

}

2.3 InputStreamReader类【字节输入流转成字符输入流】

       BufferedReader 类中的readLine()方法和 Scanner类中的nextLine()方法都可以读一行数据,不同的是readLine()从文件中读取取,nextLine()从键盘输入中读取。

      那我们能不能通过BufferedReader读取键盘输入的数据?????Scanner的nextLine()方法为什么可以读取键盘输入????因为Scanner对象在创建的时候使用了System.in,System.in默认就是键盘输入。

      所以只要在创建BufferedReader对象的时候,使用System.in就可以完成键盘输入。System.in是InputStream类型字节输入流,而BufferedReader(Reader in)参数是Reader字符输入流。

解决问题的关键就是将InputStream类型字节输入流转换成Reader字符输入流。InputStreamReader类解决此问题。

      构造方法

InputStreamReader(InputStream in)字节输入流转成字符输入流。

例:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;



public class InputStreamReaderTest {

   //字节输入流转成字符输入流

   public static void main(String[] args) throws Exception {

      InputStreamReader inputStreamReader = new InputStreamReader(System.in);

      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

      System.out.println("请输入姓名:");

      String name=bufferedReader.readLine();//键盘输入

      System.out.println("name==="+name);

      bufferedReader.close();

      inputStreamReader.close();

   }



}

3.补充字节流----序列化和反序列化

3.1 序列化定义

       我们做操作的java对象可能需要在多台计算机之间传递。

序列化------将一个java对象转换成二进制流数据过程。

3.2 如何实现序列化

序列化接口【Serializable】。

                  public interface Serializable

                  特殊----该接口中一个方法都没有。

类的序列化由实现java.io.Serializable接口的类启用。

不实现此接口的类将不会使任何状态序列化或反序列化。

            可序列化类的所有子类型都是可序列化的。

(2)通过java提供的ObjectOutputStream类的writeObject(Object  obj)。

        构造方法:

      ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。

实例方法:

      void    writeObject(Object obj) 将指定的对象写入ObjectOutputStream。

例:

import java.io.Serializable;

public class Student implements Serializable {

   public void getStudent(){

      System.out.println("Student类的实例方法");

   }

}





import java.io.File;

import java.io.FileOutputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

public class ObjectOutputStreamTest {

   public static void main(String[] args) throws Exception{

      //ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。

      String pathname1="E:"+File.separator+"test"+File.separator+"Student.txt";

      File file1=new File(pathname1);

      OutputStream outputStream = new FileOutputStream(file1);

      ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

      //void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。

      Student student=new Student();

      objectOutputStream.writeObject(student);

      objectOutputStream.close();

      outputStream.close();

   }

}

3.3 反序列化

当计算机a收到计算机b传过来的对象,计算机a现在需要拿这个对象的话,需要反序列化回去。

反序列化---将2进制流数据转换成java对象的过程。

ObjectInputStream类的Object  readObject()方法读取对象。

      构造方法:

      ObjectInputStream(InputStream  in) 创建从指定的InputStream读取的ObjectInputStream。

      实例方法:

      Object  readObject() 从ObjectInputStream读取一个对象。

例:

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.io.ObjectInputStream;



public class ObjectInputStreamTest {



   public static void main(String[] args) throws Exception{

      // ObjectInputStream(InputStream  in) 创建从指定的InputStream读取的ObjectInputStream。

      String pathname1="E:"+File.separator+"test"+File.separator+"Student.txt";

      File file1=new File(pathname1);

      InputStream in=new FileInputStream(file1);

      ObjectInputStream in1=new ObjectInputStream(in);

      // Object readObject() 从ObjectInputStream读取一个对象。

      Object readObject = in1.readObject();

      Student student=(Student)readObject;

      in1.close();

      in.close();

     

      //如果现在可以调用student里面的实例方法,证明反序列化成功

      student.getStudent();//Student类的实例方法

   }

}

4.输入输出流思维导图

 

java中同一行如何输入多个字符串 java多行输入输出_java中同一行如何输入多个字符串