Java教程

Java的IO流处理与线程

本文主要是介绍Java的IO流处理与线程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

今天内容: (1)I/O流 (2)线程

1.I/O流

1.1 FileOutputStream类(重中之重)
(1)基本概念
java.io.FileOutputStream类**主要用于将图像数据之类的原始字节流写入输出流(写)**中。
在这里插入图片描述

(2)常用的方法
在这里插入图片描述

1.2 FileInputStream类(重中之重)
(1)基本概念
java.io.FileInputStream类主要用于从输入流中读取图像数据之类的原始字节流(读)

(2)常用的方法
在这里插入图片描述
DEMO1:
读取方法一

  			1:构造FileInputStream类型对象
            FileInputStream fo1 = new FileInputStream("E:/a.txt");
//            2:通过输入流从文件读取数据内容
            int res=fo1.read();
            System.out.println("读取到的单个字节是:"+res+"对应的字符是:"+(char)res);
//            没读完毕一个字节后,可以继续读取下一个字节
            res=fo1.read();
            System.out.println("读取到的单个字节是:"+res+"对应的字符是:"+(char)res);

读取方法二:

int res=0;
while ((res=fo1.read())!=-1){
      System.out.println("读取到的单个字节是:"+res+"对应的字符是:"+(char)res);
      }

读取方法三:

  byte[] sArr=new byte[20];
//            read(byte类型的数据,开始下标,读取的字节长度)
            int res =fo1.read(sArr,3,11);
            System.out.println("读取到的数据内容是:"
                    + new String(sArr, 3, res)
                    + ",实际读取到的数据大小是:" + res);
            fo1.close();

String回顾:

package Three;

import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;

public class StringTest {
    public static void main(String[] args) {
        // 1.使用无参方式构造String类型的对象并打印  ""  null
        String str1 =new String();
        System.out.println("str1="+str1);//str1 = 啥也没有
        System.out.println("--------------------------------");
        // 2.使用字节数组来构造String对象并打印
        byte[] bArr={97,98,99,100,101};
        // 表示使用bArr数组中下标从1开始的3个字节来构造字符串对象
        String str2=new String(bArr,1,3);
        System.out.println("str2="+str2);//str2 = bcd
        String str3=new String(bArr);
        System.out.println("str3="+str3);//str3 = abcde

        System.out.println("--------------------------------");
        // 3.使用字符数组来构造String对象并打印
        char[] cArr={'h','e','l','l','o'};
        String str4=new String(cArr,1,4);
        System.out.println("str4="+str4);//str4 = el
        String str5=new String(cArr);
        System.out.println("str5="+str5);//str5 = hello
        System.out.println("--------------------------------");
        // 4.使用字符串来构造String对象并打印
        String str6 = new String("world");
        System.out.println("str6 = " + str6); //str6 = world
    }

}

应用:

package StreamTEst;

import java.io.FileInputStream;


public class FileInputStreamTest {
    public static void main(String[] args)   {
        try {
//            1:构造FileInputStream类型对象
            FileInputStream fo1 = new FileInputStream("E:/a.txt");
//          
            byte[] sArr=new byte[20];
//            read(byte类型的数据,开始下标,读取的字节长度)
            int res =fo1.read(sArr,3,11);
            System.out.println("读取到的数据内容是:"
                    + new String(sArr)
                    + ",实际读取到的数据大小是:" + res);
            fo1.close();//读取到的数据内容是:   a97helloa97      ,实际读取到的数据大小是:11
            byte[] s={101,102};
            String x=new String(s,0,1);
            System.out.println("x:"+x);

        }catch (Exception e ){
            e.printStackTrace();
        }
    }
}

作业要求:
使用I/O流实现c:/a.txt到c:/b.txt文件的拷贝功能

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Coyetest {
    public static void main(String[] args)  {
        try {
            FileInputStream str1=new FileInputStream("E:/a.txt");
            FileOutputStream str2=new FileOutputStream("E:/b.txt");

            System.out.println("输出ing");
//                方式一
//            int res=0;
//            while ((res=str1.read())!=-1) {
//                str2.write(res);
//
//            }
//            方式二:准备一个和目标文件一样大的缓冲区,一次性全部拷贝完毕
//                   获取该输入流所关联文件的大小
//            该方式的缺点:当文件很大时,无法申请和文件大小一样的缓冲区
//            int len =str1.available();
//            System.out.println("获取文件的大小是:"+len);
//            byte[] bArr=new byte[len];
//            // 表示一次性将文件中的所有内容读取出来放入缓冲区
//            int res =str1.read(bArr);
//            System.out.println("实际写入文件的大小是:"+res);
//            // 表示一次性将缓冲区的所有内容写入到输出流中
//            str2.write(res);
            // 方式三:准备一个适当的缓冲区,每次将缓冲区读满就写入输出流中
            // 以后开发中推荐该方式
            byte[] bArr =new byte[1024*8];
            int res=0;
            while ((res=str1.read())!=-1){
                str2.write(bArr,0,res);
            }
//            后创建的先关闭
        System.out.println("拷贝文件成功");
        str2.close();
        str1.close();
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}



1.3 BufferedWriter类(重点)
(1)基本概念
java.io.BufferedWriter类主要用于向输出流中写入单个字符、字符数组以及字符串

(2)常用的方法

1.4 BufferedReader类(重点)
(1)基本概念
java.io.BufferedReader类主要用于从输入流中读取单个字符、字符数组以及一行字符串内容。

(2)常用的方法

1.5 PrintStream类(重点)
(1)基本概念
java.io.PrintStream类主要用于方便地打印各种数据内容并且自动刷新。

(2)常用的方法

1.6 ObjectOutputStream类(重点)
(1)基本概念
java.io.ObjectOutputStream类主要用于将Java语言中的对象整体写入输出流中。
只能将支持 java.io.Serializable 接口的对象写入流中。
类通过实现 java.io.Serializable 接口以启用其序列化功能。
所谓序列化就是指将一个对象相关的所有信息有效组织成字节序列的转化过程。

(2)常用的方法

1.7 ObjectInputStream类(重点)
(1)基本概念
java.io.ObjectInputStream类主要用于从输入流中一次性将一个对象的内容读取出来
实现了从字节序列到对象的转化过程,叫做反序列化。

(2)常用的方法

经验分享:
当需要写入多个对象到文件中时,建议先将多个对象放入一个集合对象中,然后将集合对象看做一个整体只需要调用一次writeObject方法就可以写入所有内容,此时只需要调用一次readObject方法就可以将所有内容读取出来,这样就避免了通过返回值来判断是否读取到文件的末尾。

作业:
1.重点掌握IO流的框架和FileCopyTest.java文件的代码。
2.不断地提示用户输入要发送的内容,若发送的内容是"bye"则聊天结束,
否则将用户输入的内容写入到文件c:/a.txt中。
要求使用BufferedReader类来读取键盘的输入 System.in代表键盘输入
要求使用PrintStream类负责将数据写入文件
3.复习所学的所有内容准备下周三的阶段考试。

作业代码:https://shimo.im/docs/8DGHQxPJGC9GQWgD

这篇关于Java的IO流处理与线程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!