Character Stream, read file Character by Character
BufferedWriter is inherited from Writer BufferedReader is inherited from Reader Both are good for reading Character by Character
    public static void writeToFile(String name, ArrayList list){
        if(name != null && list != null){
            try{
                BufferedWriter bw = new BufferedWriter(new FileWriter(name));
                for(String s : list){
                    bw.write(s + "\n");
                }
                bw.close();
            }catch(IOException io){
                io.printStackTrace();
            }
        }
    }

    public static void readFile(String name, ArrayList list){
        try{
            if(name != null && list != null){
                BufferedReader br = new BufferedReader(new FileReader(name));        
                String line = null;
                while( (line = br.readLine()) != null){
                    list.add(line);
                }
            }
        }catch(IOException io){
            io.printStackTrace();
        }
    }
FileInputStream is herited from InputStream FileOutputStream is herited from OutputStream Both are good for reading raw or binary files.
    public static void readWriteFileStream(String fromFile, String toFile){
        if(fromFile != null && toFile != null){
            try{
                FileInputStream inStream = new FileInputStream(fromFile);
                FileOutputStream outStream = new FileOutputStream(toFile);
                int byteChar = -1;
                while((byteChar = inStream.read()) != -1){
                    outStream.write(byteChar); 
                }
                if(outStream != null)
                    outStream.close();
                if(inStream != null)
                    inStream.close();

            }catch(IOException io){
                io.printStackTrace();
            }
        }
    }
Java Stream class structure
The picture shows a bit of the hirerarchy structure of Stream class in Java