IO(input 输入 ,output 输出)

IO流体系结构

屏幕截图 2022-04-13 212540.jpg

File类的使用

1.File类的一个对象,代表一个个文件或一个文件目录(俗称:文件夹)
2.File类声明在java.io包下
3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成
4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点”

创建File类的实例

File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)
屏幕截图 2022-04-11 101802.jpg

  1. public void test1(){
  2. //构造器1
  3. File file1 = new File("hello.txt");//相对于当前module
  4. File file2 = new File("F:\\code\\day01\\hi.txt");
  5. //构造器2
  6. File file3 = new File("F:\\code","day01");
  7. //构造器3
  8. File file4 = new File(file3,"hi.txt");
  9. }

路径分类

相对路径:相较于某个路径下,指明的路径
绝对路径:包含盘符在内的文件或文件目录的路径

路径分隔符

windows:\
unix:/

File类常用方法

屏幕截图 2022-04-11 105031.jpg

  1. public void test2(){
  2. File file1 = new File("hello.txt");
  3. File file2 = new File("E:\\IO\\hi.txt");
  4. System.out.println(file1.getAbsolutePath());
  5. System.out.println(file1.getPath());
  6. System.out.println(file1.getName());
  7. System.out.println(file1.getParent());
  8. System.out.println(file1.length());
  9. System.out.println(file1.lastModified());
  10. System.out.println();
  11. System.out.println(file2.getAbsolutePath());
  12. System.out.println(file2.getPath());
  13. System.out.println(file2.getName());
  14. System.out.println(file2.getParent());
  15. System.out.println(file2.length());
  16. System.out.println(file2.lastModified());
  17. }
  1. public void test3(){
  2. //如下的两个方法适用于文件目录
  3. //文件需真实存在
  4. File file = new File("F:\\code\\daily");
  5. String[] list = file.list();
  6. for (String s : list){
  7. System.out.println(s);
  8. }
  9. File[] files = file.listFiles();
  10. for (File f : files){
  11. System.out.println(f.toString());
  12. }
  13. }
  1. public void test4(){
  2. //要想保证返回true,需要file1在硬盘存在,且file2不能存在
  3. File file1 = new File("hello.txt");
  4. File file2 = new File("E:\\IO\\hi.txt");
  5. boolean renameTo = file1.renameTo(file2);
  6. System.out.println(renameTo);
  7. }

屏幕截图 2022-04-11 112659.jpg

  1. public void test5(){
  2. File file1 = new File("hello.txt");
  3. System.out.println(file1.isDirectory());
  4. System.out.println(file1.isFile());
  5. System.out.println(file1.exists());
  6. System.out.println(file1.canRead());
  7. System.out.println(file1.canWrite());
  8. System.out.println(file1.isHidden());
  9. System.out.println();
  10. File file2 = new File("E:\\IO");
  11. System.out.println(file2.isDirectory());
  12. System.out.println(file2.isFile());
  13. System.out.println(file2.exists());
  14. System.out.println(file2.canRead());
  15. System.out.println(file2.canWrite());
  16. System.out.println(file2.isHidden());
  17. }

屏幕截图 2022-04-11 133509.jpg

  1. public void test6() throws IOException {
  2. //文件创建
  3. File file1 = new File("hi.txt");
  4. if (!file1.exists()){
  5. file1.createNewFile();
  6. System.out.println("创建成功");
  7. }else{
  8. file1.delete();
  9. System.out.println("删除成功");
  10. }
  11. }
  12. @Test
  13. public void test7(){
  14. //文件目录的创建
  15. File file1 = new File("e:\\IO\\io1\\io3");
  16. boolean mkdir = file1.mkdir();
  17. if (mkdir) {
  18. System.out.println("创建成功1");
  19. }
  20. File file2 = new File("e:\\IO\\io1\\io4");
  21. boolean mkdir1 = file2.mkdirs();
  22. if (mkdir1) {
  23. System.out.println("创建成功2");
  24. }
  25. }

IO流

流的分类

1.操作数据单位:字节流、字符流
2.数据的流向:输入流、输出流
3.流的角色:节点流、处理流
屏幕截图 2022-04-11 151441.jpg

流的体系结构

抽象基类 节点流 缓冲流
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream
Reader FileReader BufferedReader
Witer FileWriter BufferedWriter

FileReader读入数据操作

说明:
1.read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
2.异常处理:为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally处理
3.读入的文件一定要存在,否则就会报FileNotFoundException

  1. public void testFileReader(){
  2. FileReader fr = null;
  3. try {
  4. //1.实例化File类的对象,指明要操作的文件
  5. File file = new File("hello.txt");
  6. //2.提供具体的流
  7. fr = new FileReader(file);
  8. //3.数据的读入
  9. //read():返回读入的一个字符。如果达到文件末尾,返回-1
  10. //方式一
  11. /*int data = fr.read();
  12. while (data != -1){
  13. System.out.println((char)data);
  14. data = fr.read();
  15. }*/
  16. //方式二 语法上针对于方式一的修改
  17. int data;
  18. while ((data = fr.read()) != -1){
  19. System.out.println((char) data);
  20. }
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }finally {
  24. //4.流的关闭操作
  25. try {
  26. if (fr != null)
  27. fr.close();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }

使用read(char[] cbuf)读入数据

  1. public void testFileReader1() {
  2. FileReader fr = null;
  3. try {
  4. //1.File类的实例化
  5. File file = new File("hello.txt");
  6. //2.FileReader流的实例化
  7. fr = new FileReader(file);
  8. //3.读入的操作
  9. //read(char[] cbuf):返回每次读入cbuf数组中的字符个数,如果达到文件末尾,返回-1
  10. char[] cbuf = new char[5];
  11. int len;
  12. while ((len = fr.read(cbuf)) != -1){
  13. //方式一:
  14. //错误的写法
  15. /* for (int i =0;i < cbuf.length;i++){
  16. System.out.print(cbuf[i]);
  17. }*/
  18. //正确的写法
  19. for (int i =0;i < len;i++){
  20. System.out.print(cbuf[i]);
  21. }
  22. //方式二:
  23. //错误的写法
  24. /*String str = new String(cbuf);
  25. System.out.print(str);*/
  26. //正确的写法
  27. String str = new String(cbuf,0,len);
  28. System.out.print(str);
  29. }
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }finally {
  33. if (fr != null)
  34. try {
  35. //4.资源关闭
  36. fr.close();
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

FileWriter写出数据操作

说明:
1.输出操作,对应的File可以不存在。并不会报异常
2.File对应的硬盘中的文件如果不存在,输出的过程中,会自动创建此文件
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false)/FileWriter(file):对原有文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容

  1. public void testFileWriter() {
  2. FileWriter fw = null;
  3. try {
  4. //1.提供File类的对象,指明写出到的文件
  5. File file = new File("hello1.txt");
  6. //2.提供FileWriter的对象,用于数据的写出
  7. fw = new FileWriter(file);
  8. //3.写出的操作
  9. fw.write("I have a dream!\n");
  10. fw.write("You need to have a dream!");
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. } finally {
  14. //4.流资源关闭
  15. try {
  16. if (fw != null){
  17. fw.close();
  18. }
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

FileReader和FileWriter实现文本的复制

  1. public void testFileReaderFileWriter() {
  2. FileReader fr = null;
  3. FileWriter fw = null;
  4. try {
  5. //1.创建File类的对象,指明读入和写出的文件
  6. File srcFile = new File("hello.txt");
  7. File destFile = new File("hello2.txt");
  8. //2.创建输入流和输出流的对象
  9. fr = new FileReader(srcFile);
  10. fw = new FileWriter(destFile);
  11. //3.数据的读入和写出操作
  12. char[] cbuf = new char[5];
  13. int len;//记录每次读入到cbuf数组中的字符的个数
  14. while ((len = fr.read(cbuf)) != -1){
  15. //每次写出len个字符
  16. fw.write(cbuf,0,len);
  17. }
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. //4.关闭流资源
  22. try {
  23. if (fw != null)
  24. fw.close();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. try {
  29. if (fr != null)
  30. fr.close();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }

FileInputStream和FileOutputStream的使用

结论:
1.文本文件(.txt , .java , .c , .cpp),使用字符流处理
2.非文本文件(.jpg , .mp3 , .avi , .doc , .ppt , …),使用字节流处理

FileInputStream和FileOutputStream读写文本文件

  1. public void testFileInputStream() {
  2. //使用字节流FileInputStream处理文本文件,可能出现乱码
  3. FileInputStream fis = null;
  4. try {
  5. //1.造文件
  6. File file = new File("hello.txt");
  7. //2.造流
  8. fis = new FileInputStream(file);
  9. //3.读数据
  10. byte[] buffer = new byte[5];
  11. int len;//记录每次读取的字节的个数
  12. while((len = fis.read(buffer)) != -1){
  13. String str = new String(buffer,0,len);
  14. System.out.print(str);
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. } finally {
  19. if (fis != null) {
  20. //4.关闭资源
  21. try {
  22. fis.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. }

FileInputStream和FileOutputStream读写非文本文件

  1. public void testFileInputOutputStream() {
  2. FileInputStream fis = null;
  3. FileOutputStream fos = null;
  4. try {
  5. File srcFile = new File("记.jpg");
  6. File destFile = new File("记1.jpg");
  7. fis = new FileInputStream(srcFile);
  8. fos = new FileOutputStream(destFile);
  9. //复制过程
  10. byte[] buffer = new byte[5];
  11. int len;
  12. while((len = fis.read(buffer)) != -1){
  13. fos.write(buffer,0,len);
  14. }
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } finally {
  18. if (fos != null){
  19. try {
  20. fos.close();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. if (fis != null){
  26. try {
  27. fis.close();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }
  33. }

FileInputStream和FileOutputStream复制文件

  1. //指定路径下文本的复制
  2. public void copyFile(String srcPath,String destPath){
  3. FileInputStream fis = null;
  4. FileOutputStream fos = null;
  5. try {
  6. File srcFile = new File(srcPath);
  7. File destFile = new File(destPath);
  8. fis = new FileInputStream(srcFile);
  9. fos = new FileOutputStream(destFile);
  10. //复制过程
  11. byte[] buffer = new byte[5];
  12. int len;
  13. while((len = fis.read(buffer)) != -1){
  14. fos.write(buffer,0,len);
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. } finally {
  19. if (fos != null){
  20. try {
  21. fos.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. if (fis != null){
  27. try {
  28. fis.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }
  35. @Test
  36. public void testCopyFile(){
  37. long start = System.currentTimeMillis();
  38. String srcPath = "hello.txt";
  39. String destPath = "hello3.txt";
  40. copyFile(srcPath,destPath);
  41. long end = System.currentTimeMillis();
  42. System.out.println("复制操作花费的时间为:" + (end - start));
  43. }

缓冲流的使用

作用:提高流的读取、写入的速度
原因:内部提供了一个缓冲区

实现非文本文件的复制

使用BufferedInputStream和BufferedOutputStream

  1. public void test1() throws FileNotFoundException {
  2. FileInputStream fis = null;
  3. FileOutputStream fos = null;
  4. BufferedInputStream bis = null;
  5. BufferedOutputStream bos = null;
  6. try {
  7. //1.造文件
  8. File srcFile = new File("记.jpg");
  9. File destFile = new File("记2.jpg");
  10. //2.造流
  11. //2.1 造节点流
  12. fis = new FileInputStream((srcFile));
  13. fos = new FileOutputStream((destFile));
  14. //2.2 造缓冲流
  15. bis = new BufferedInputStream((fis));
  16. bos = new BufferedOutputStream((fos));
  17. //3.复制的细节:读取、写入
  18. byte[] buffer = new byte[10];
  19. int len;
  20. while ((len = bis.read(buffer)) != -1){
  21. bos.write(buffer,0,len);
  22. }
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. } finally {
  26. //4.资源关闭
  27. //要求:先关闭外层的流,再关闭内层的流
  28. if (bos != null){
  29. try {
  30. bos.close();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. if (bis != null){
  36. try {
  37. bis.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. //说明:关闭外层流的同时,内层流也会自动进行关闭。关于内层流的关闭,我们可以省略
  43. /*fos.close();
  44. fis.close();*/
  45. }

实现文本文件复制

使用BufferedReader和BufferedWriter

  1. public void testBufferedReaderBufferedWriter(){
  2. BufferedReader br = null;
  3. BufferedWriter bw = null;
  4. try {
  5. //创建文件和相应的流
  6. br = new BufferedReader(new FileReader(new File("hello.txt")));
  7. bw = new BufferedWriter(new FileWriter(new File("hello4.txt")));
  8. //读写操作
  9. //方式一:使用char[]数组
  10. /*char[] cbuf = new char[1024];
  11. int len;
  12. while ((len = br.read(cbuf)) != -1 ){
  13. bw.write(cbuf,0,len);
  14. //bw.flush();
  15. }*/
  16. //方式二:使用String
  17. String data;
  18. while((data = br.readLine()) != null){
  19. //方法一:
  20. bw.write(data + "\n");//data中不包含换行符
  21. //方法二:
  22. bw.write(data);//data中不包含换行符
  23. bw.newLine();
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. } finally {
  28. //关闭资源
  29. if (bw != null){
  30. try {
  31. bw.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. if (br != null){
  37. try {
  38. br.close();
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. }

练习

图片加密

解密:将fis与fos中文件相互交换即可完成

  1. public void test2(){
  2. FileInputStream fis = null;
  3. FileOutputStream fos = null;
  4. try {
  5. fis = new FileInputStream("记.jpg");
  6. fos = new FileOutputStream("记secret.jpg");
  7. byte[] buffer = new byte[20];
  8. int len;
  9. while ((len = fis.read(buffer)) != -1){
  10. //字节数组进行修改
  11. //错误的
  12. /*for (byte b : buffer){
  13. b = (byte) (b ^ 5);
  14. }*/
  15. //正确的
  16. for (int i = 0;i < len;i++){
  17. buffer[i] = (byte) (buffer[i] ^ 5 );
  18. }
  19. fos.write(buffer,0,len);
  20. }
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. } finally {
  24. if (fis != null){
  25. try {
  26. fis.close();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. if (fos != null){
  32. try {
  33. fos.close();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }

转换流的使用

1.转换流:属于字符流
InputStreamReader:将一个字节的输入流转换为字符的输入流
OutputStreamWriter:将一个字符的输出流转换为字节的输出流
2.作用:提供字节流与字符流之间的转换
3.解码:字节、字节数组 —-> 字符数组、字符串
编码:字符数组、字符串 —-> 字节、字节数组

  1. public void test1() {
  2. InputStreamReader isr = null;
  3. try {
  4. FileInputStream fis = new FileInputStream("hello.txt");
  5. //参数二指明了字符集,具体使用哪个字符集,取决于文件保存时使用的字符集
  6. isr = new InputStreamReader(fis,"UTF-8");
  7. //InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符集
  8. char[] cbuf = new char[20];
  9. int len;
  10. while((len = isr.read(cbuf)) != -1){
  11. String str = new String(cbuf,0,len);
  12. System.out.println(str);
  13. }
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. } finally {
  17. if (isr != null){
  18. try {
  19. isr.close();
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }

实现读入与写出

  1. public void test2() {
  2. InputStreamReader isr = null;
  3. OutputStreamWriter osw = null;
  4. try {
  5. File file1 = new File("hello.txt");
  6. File file2 = new File("hello_gbk.txt");
  7. FileInputStream fis = new FileInputStream(file1);
  8. FileOutputStream fos = new FileOutputStream(file2);
  9. isr = new InputStreamReader(fis, "UTF-8");
  10. osw = new OutputStreamWriter(fos, "gbk");
  11. char[] cbuf = new char[20];
  12. int len;
  13. while ((len = isr.read(cbuf)) != -1) {
  14. osw.write(cbuf, 0, len);
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. } finally {
  19. if (isr != null){
  20. try {
  21. isr.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. if (osw != null){
  27. try {
  28. osw.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }

字符集

屏幕截图 2022-04-13 145539.jpg

对象流

序列化过程

将内存中的java对象保存到磁盘中或通过网络传输出去
使用ObjectOutputStream实现

  1. public void test1(){
  2. ObjectOutputStream oos = null;
  3. try {
  4. oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
  5. oos.writeObject(new String("我爱北京"));
  6. oos.flush();//刷新操作
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. } finally {
  10. if (oos != null){
  11. try {
  12. oos.close();
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }
  18. }

反序列化过程

将磁盘文件中的对象还原为内存中的一个Java对象
使用ObjectInputStream实现

  1. public void test2(){
  2. ObjectInputStream ois = null;
  3. try {
  4. ois = new ObjectInputStream(new FileInputStream("object.txt"));
  5. Object obj = ois.readObject();
  6. String str = (String) obj;
  7. System.out.println(str);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. } catch (ClassNotFoundException e) {
  11. e.printStackTrace();
  12. } finally {
  13. if (ois != null){
  14. try {
  15. ois.close();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }

自定义类的序列化与反序列化操作

自定义类的要求
1.需要实现接口:Serializable
2.当前类提供一个全局变量:serialVersionUID
3.除了当前类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的(默认情况下,基本数据类型可序列化)
补:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
过程与序列化和反序列化一致

serialVersionUID的说明

屏幕截图 2022-04-14 112932.jpg

RandomAccessFile的使用

1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
3.如果RandomAccessFile作为输出流时,写出到文件如果不存在,则在执行过程中自动创建,如果写出到文件存在,则会对原有文件内容进行覆盖。(默认情况下从头覆盖)
屏幕截图 2022-04-15 171456.jpg

实现读取与写入操作

  1. public void test1() {
  2. RandomAccessFile raf1 = null;
  3. RandomAccessFile raf2 = null;
  4. try {
  5. raf1 = new RandomAccessFile(new File("data.txt"),"r");
  6. raf2 = new RandomAccessFile(new File("data1.txt"),"rw");
  7. byte[] buffer = new byte[10];
  8. int len;
  9. while((len = raf1.read(buffer)) != -1){
  10. raf2.write(buffer,0,len);
  11. }
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. } finally {
  15. if (raf1 != null){
  16. try {
  17. raf1.close();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. if (raf2 != null){
  23. try {
  24. raf2.close();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. }

实现数据的插入

  1. public void test2() {
  2. RandomAccessFile raf1 = null;
  3. try {
  4. raf1 = new RandomAccessFile("hello.txt","rw");
  5. raf1.seek(3);//将指针调到角标为3的位置
  6. //保存指针3后面的所有数据到StringBuilder中
  7. StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());
  8. byte[] buffer = new byte[20];
  9. int len;
  10. while ((len = raf1.read(buffer)) != -1){
  11. builder.append(new String(buffer,0,len));
  12. }
  13. //调回指针,写入”xyz“
  14. raf1.seek(3);
  15. raf1.write("xyz".getBytes(StandardCharsets.UTF_8));
  16. //将StringBuilder中的数据写入到文件中
  17. raf1.write(builder.toString().getBytes(StandardCharsets.UTF_8));
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. if (raf1 != null){
  22. try {
  23. raf1.close();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }

其他流的使用

标准流的输入、输出流

1.System.in:标准的输入流,默认从键盘输入
System.out:标准的输出流,默认从控制台输出
2.System类的setIn(InputStream is) / setOut(PrintStream ps)重新指定输入和输出流
实例:将读取到的整行字符串转成大写输出,直至当输入”e“或”exit“时,退出程序
方法一:使用Scanner实现,调用next()返回一个字符串
方法二:使用System.in实现。System.in —-> 转换流 —-> BufferedReader的readLine()

  1. //方法二
  2. public class OtherStreamTest {
  3. public static void main(String[] args) {
  4. BufferedReader br = null;
  5. try {
  6. InputStreamReader isr = new InputStreamReader(System.in);
  7. br = new BufferedReader(isr);
  8. while (true) {
  9. System.out.println("请输入字符串:");
  10. String data = br.readLine();
  11. if ("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)){
  12. System.out.println("程序结束");
  13. break;
  14. }
  15. String upperCase = data.toUpperCase();
  16. System.out.println(upperCase);
  17. }
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. if (br != null){
  22. try {
  23. br.close();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }
  30. }

打印流

PrintStream和PrintWriter 都是输入流
提供了一系列重载的print()和println()

数据流

DataInputStream和DataOutputStream
作用:用于读取或写出基本数据类型的变量或字符串
实例:
注意:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致

  1. public void test1(){
  2. DataOutputStream dos = null;
  3. try {
  4. dos = new DataOutputStream(new FileOutputStream("data.txt"));
  5. dos.writeUTF("Y三角");
  6. dos.writeInt(19);
  7. dos.writeBoolean(true);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. } finally {
  11. if (dos != null){
  12. try {
  13. dos.close();
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  19. }
  20. public void test2() throws IOException {
  21. //将文件中存储的基本数据类型变量和字符串读取到内存中,保存在变量中
  22. DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
  23. String name = dis.readUTF();
  24. int age = dis.readInt();
  25. boolean isMale = dis.readBoolean();
  26. System.out.println("name:" + name);
  27. System.out.println("age:" + age);
  28. System.out.println("isMale:" +isMale);
  29. dis.close();
  30. }