java的数据流

目录

一.定义:(入门)

1.数据流:

2.数据流类型:

二.详细介绍:(升级)

1.字节流:

2.字符流:


一.定义:(入门)

1.数据流:

数据流是一种用于输入输出基本数据类型的工具,它提供了将这些数据类型转换成字节流或字符流的方法,以方便进行输入输出操作。

在Java中的数据流指的是在处理输入、输出数据时通过内存缓冲区实现的读取和写入操作。Java中常用的数据流有字节流和字符流,可以根据具体需求选择使用。

2.数据流类型:

1.字节流:

字节流以字节(8位)为单位读取和写入数据。它通常用于处理二进制文件(如图像、音频、视频等),或者处理数据流中的原始字节数据。 在 Java 中,字节流主要由两个抽象基类组成:

  • InputStream(字节输入流):提供了读取数据的方法。
  • OutputStream(字节输出流):提供了写入数据的方法。

▲注意:这两个类提供了一些基本方法,可以读写字节数组、单个字节或者跳过某些字节等操作。

2.字符流:

字符流以字符为单位读取和写入数据。它通常用于读写文本文件,或者处理字符数据流。 在 Java 中,字符流主要由两个类组成:

  • Reader(字符输入流):提供了读取数据的方法。
  • Writer(字符输出流):提供了写入数据的方法。

▲注意:字符流底层仍然是使用字节流实现的,因此读取或写入字符时会涉及到编码和解码的过程。Java提供了一些标准的字符集(如UTF-8、GBK等)来支持不同的文本编码格式。

二.详细介绍:(升级)

1.字节流:

字节流是 Java 中用于读写二进制数据的一种流,它按照 8 位字节的方式传输数据。字节流主要用于处理二进制数据,例如图像、音频、视频等文件。

<1>常用的 InputStream 子类有:

  • FileInputStream:从文件中读取字节数据。
  • ByteArrayInputStream:从内存中的字节数组中读取数据。
  • ObjectInputStream:从对象序列化数据中读取对象。

代码示例:FileInputStre

import java.io.FileInputStream;
import java.io.IOException;
public class project//草稿类
{
    public static void main(String[] args)throws IOException
    {
        String path="D:\\java\\ProjectFile.txt";

        try {
            // 创建一个 FileInputStream 对象
            FileInputStream fis = new FileInputStream(path);
            // 定义一个字节数组,用于存储读取到的数据
            byte[] buffer = new byte[1024];
            // 定义一个变量,记录实际读取的字节数
            int len;
            // 循环读取数据
            while ((len = fis.read(buffer)) != -1) {
                // 将读取到的字节转换成字符串,并打印输出
                System.out.print(new String(buffer, 0, len));
            }
            fis.close();// 关闭流
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

//文件里面的内容

解释:首先,我们创建了一个 FileInputStream 对象,并传入要读取的文件路径。然后定义了一个 byte 数组作为缓冲区,用于存储读取到的数据。接着进入循环进行读取,每次读取 buffer.length 长度的数据,并将实际读取到的字节数保存在 len 变量中。最后将读取到的字节转换成字符串并打印输出。

注意,在读取完成后,一定要记得关闭流,以释放相关的资源。如果没有关闭流,可能会导致资源泄露和程序崩溃。可以使用 try-with-resources 语句来自动关闭流,也可以在 finally 块中手动关闭流。

代码示例:ByteArrayInputStream

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Arrays;
public class project
{
    public static void main(String[] args) throws IOException 
    {
        // 创建一个字节数组
        byte[] bytes = {0x1, 0x2, 0x3, 0x4, 0x5};

        // 将字节数组封装成为 ByteArrayInputStream 对象
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

        // 定义一个字节型数组,用于存储读取到的数据
        byte[] buffer = new byte[10];

        // 从输入流中读取数据,并存储到缓冲区中,len记录了从输入流 bais 中读取的数据的字节数,以便程序在之后的处理中使用
        int len = bais.read(buffer);

        // 打印输出读取到的数据
        System.out.println(Arrays.toString(buffer));
    }
}

//输出:[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

首先,我们创建了一个字节数组,并将其封装成为一个 ByteArrayInputStream 对象。然后定义了一个 byte 数组作为缓冲区,用于存储从 ByteArrayInputStream 中读取到的数据。接着调用了 read() 方法从 ByteArrayInputStream 中读取数据,并将其存储到缓冲区中。最后打印输出了读取到的数据。

注意,在执行 read() 方法时,如果字节数组中没有数据可读,则该方法会返回 -1。因此,可以在循环中判断返回值是否为 -1,以确定是否已经读取到了字节数组的末尾。

使用 ByteArrayInputStream 从字节数组中读取数据时,不需要手动关闭流,因为它并没有打开任何底层资源。

代码示例:ObjectInputStream

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStreamExample 
{
    public static void main(String[] args) 
    {
        // 创建一个 ObjectInputStream 对象
        try (FileInputStream fis = new FileInputStream("person.dat");
             ObjectInputStream ois = new ObjectInputStream(fis)) 
        {
            // 从文件中读取 Person 对象
            Person person = (Person)ois.readObject();
            System.out.println("Name: " + person.getName());
            System.out.println("Age: " + person.getAge());
            System.out.println("Gender: " + person.getGender());
        } 
        catch (IOException | ClassNotFoundException e) 
        {            
            e.printStackTrace();
        }
    }
}

// Person 类,为了演示方便,属性全部为公有
class Person implements java.io.Serializable 
{
    private static final long serialVersionUID = 1L;
    public String name;
    public int age;
    public String gender;
    public Person(String name, int age, String gender) 
    {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public String getName() 
    {
        return name;
    }
    public int getAge() 
    {
        return age;
    }
    public String getGender() 
    {
        return gender;
    }
}

在这个示例中,我们创建了一个 ObjectInputStream 对象,用于从文件中读取保存的 Person 对象。然后使用 ois.readObject() 方法读取对象,并将其强制转换为 Person 类型。最后,将 Person 对象的属性值输出到控制台。

注意,我们需要为 Person 类实现 java.io.Serializable 接口才能将其保存到文件中并使用 ObjectInputStream 读取。此外,我们使用了 Java 7 中的 try-with-resources 语句来自动关闭输入流,并且使用了多重捕获语句处理可能出现的异常。

<2>常用的 OutputStream 子类有:

  • FileOutputStream:向文件中写入字节数据。
  • ByteArrayOutputStream:将字节数据写入到内存中的字节数组中。
  • ObjectOutputStream:将对象序列化数据写入到流中。

代码示例:FileOutputStream

import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample 
{
    public static void main(String[] args) 
    {
        // 创建一个字符串
        String message = "Hello, World!";

        try (FileOutputStream fos = new FileOutputStream("output.txt")) 
        {
            // 将字符串转换为字节数组
            byte[] data = message.getBytes();

            // 将字节数组写入文件
            fos.write(data);
            System.out.println("数据已写入文件");
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们创建了一个包含字符串 "Hello, World!"message 变量。然后,我们使用 FileOutputStream 类创建了一个名为 "output.txt" 的文件输出流,并将 message 字符串转换为字节数组。最后,我们使用 fos.write(data) 方法将字节数组写入文件。需要注意的是,我们使用了 Java 7 中的 try-with-resources 语句来自动关闭输出流,并且使用了单重捕获语句处理可能出现的异常。

如果运行成功,程序将会在控制台输出 "数据已写入文件"。此时,在项目根目录下应该会出现一个名为 "output.txt" 的文件,其中包含了字符串 "Hello, World!" 的字节表示形式。

字节流在读写数据时通常需要使用缓冲区,这样可以提高性能。Java 中提供了BufferedInputStream 和 BufferedOutputStream 这两个字节流的缓冲区实现。

2.字符流:

字符流是 Java 中的一类处理字符数据的 I/O 流。与字节流不同,字符流的单位是char,它适合用于文本处理和国际化应用程序。Java 中的字符流继承自Reader和Writer两个抽象类,提供了一系列处理字符数据的方法。

java字符流主要包括以下几种:

  1.  FileReader 和 FileWriter:用于读取和写入字符文件。
  2. BufferedReader 和 BufferWriter:提供了缓冲区功能,能够减少磁盘操作次数,提高效率。
  3. InputStreamReader 和 OutputStreamWriter:在字节流和字符流之间进行转换,将字节流转换为字符流或将字符流转换为字节流。其中InputStreamReader将字节输入流转换为字符输入流OutputStreamWriter将字符输出流转换为字节输出流。
  4. CharArrayReader 和 CharArrayWriter:用于读写字符数组。
  5. StringReader 和StringWriter:用于读写字符串。

代码示例:FileReader

import java.io.FileReader;
import java.io.IOException;

public class FileReaderExample 
{
    public static void main(String[] args)
    {
        try (FileReader reader = new FileReader("input.txt")) 
        {
            int data = -1;
            while ((data = reader.read()) != -1) 
            {
                System.out.print((char) data);
            }
        } 
        catch (IOException e)     
        {
            e.printStackTrace();
        }
    }
}

 

在这个示例中,我们使用 FileReader 类创建了一个字符输入流对象,用于读取名为 "input.txt" 的文件。然后,我们使用 read() 方法逐个字符地读取文件的内容,并将其转换为 char 类型,并输出到控制台。需要注意的是,在这个示例中,我们使用了 Java 7 中的 try-with-resources 语句来自动关闭输入流,并且使用了单重捕获语句处理可能出现的异常。

如果运行成功,程序将会按照原始文件的格式逐个字符地输出到控制台。

 

NO.20 未完结,持续更新中~~~

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 数据流的 String 是指将数据流中的内容读取到一个 String 对象中。常见的数据流包括字节流(InputStream 和 OutputStream)、字符流(Reader 和 Writer)和缓冲流等。使用 String 对象可以方便地对数据流进行操作和处理。 在 Java 中,可以使用 BufferedReader 类来读取字符流中的数据,并将其存储到一个字符串中。例如,以下代码演示了如何从标准输入中读取数据,并将其存储到一个字符串中: ``` import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String str = ""; String line; while ((line = reader.readLine()) != null) { str += line; } System.out.println(str); } } ``` 在上述代码中,我们使用 BufferedReader 类从标准输入中读取数据,并将每行数据存储到一个字符串中。由于 BufferedReader 的 readLine() 方法可以返回 null,表示已经读取到了流的末尾,因此我们可以在 while 循环中不断读取数据,直到读取完毕。 除了 BufferedReader,还可以使用 Scanner 类来读取数据流中的数据,并将其存储到一个字符串中。例如,以下代码演示了如何使用 Scanner 从标准输入中读取数据,并将其存储到一个字符串中: ``` import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.useDelimiter("\\A").next(); System.out.println(str); } } ``` 在上述代码中,我们使用 Scanner 类从标准输入中读取数据,并使用 useDelimiter() 方法将分隔符设置为整个输入流。然后,使用 next() 方法将读取到的数据存储到一个字符串中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木鳶戾天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值