Java基础篇/IO流的介绍和了解

news2024/9/21 8:01:54

一、java的IO是基于流(stream)概念的,什么是流:

       在Java中,流(Stream)是一种抽象的数据传输方式,它代表了数据的序列。流可以用于表示来自各种源的数据输入,以及向各种目的地发送数据的输出。Java的IO(输入/输出)系统是基于流的概念构建的,这些流可以是字节流或字符流。

      IO流,即输入/输出流(Input/Output Stream),是计算机科学中用于数据传输的一种抽象概念。在编程中,IO流允许程序以统一的方式处理数据的输入和输出,无论数据来自何处或去向何方。IO流的概念在多种编程语言中都有应用,包括Java。

(以下图片均来自转载)

#IO流的基本概念:

1. **数据流**:数据流是数据的序列,可以是输入流或输出流。输入流用于从数据源读取数据,输出流用于向数据目的地写入数据。

2. **字节流**:字节流处理原始字节数据,适用于二进制数据的读写。

3. **字符流**:字符流处理字符数据,通常用于文本数据的读写。字符流在处理文本时会涉及到字符编码的转换。

4. **节点流(Node Stream)**:直接连接到数据源或数据目的地的流,如文件流。

5. **处理流(Filter Stream)**:对其他流进行包装,提供额外功能的流,如缓冲流、转换流等。

6. **管道流**:用于线程间通信的流,允许一个线程将数据写入管道,另一个线程从管道读取数据。

# Java中的IO流:

Java的IO流主要分为两大类:字节流和字符流。Java提供了一套丰富的类库来支持不同类型的IO操作:

- **字节流**:以字节为单位进行数据的读写,如`InputStream`和`OutputStream`。
- **字符流**:以字符为单位进行数据的读写,如`Reader`和`Writer`。

Java IO流的层次结构如下:

- **InputStream/Reader**:所有输入流的基类。
- **OutputStream/Writer**:所有输出流的基类。
- **FileInputStream/FileReader**:用于从文件读取字节或字符。
- **FileOutputStream/FileWriter**:用于向文件写入字节或字符。
- **BufferedInputStream/BufferedReader**:提供缓冲区的输入流,提高读写效率。
- **DataInputStream/DataOutputStream**:提供读写基本数据类型的功能。
- **ObjectInputStream/ObjectOutputStream**:用于对象的序列化和反序列化。
- **PipedInputStream/PipedOutputStream**:用于线程间的通信。
- **RandomAccessFile**:提供对文件的随机访问。

IO流的使用可以简化数据传输的编程工作,提高代码的可读性和可维护性。通过使用IO流,开发者可以不必关心底层的数据传输细节,只需通过流的API来实现数据的读写操作。

二、 流的分类:

1. 按数据类型分类:

  • 字节流(Byte Streams):处理原始字节数据,适用于二进制数据。
  • 字符流(Character Streams):处理字符数据,通常用于文本数据,支持字符编码。
  • 字节流,一般是带有Stream字样的,如InputStream,FileInputStream等等,这组流处理的最小单位之字节。

  •  字符流,一般是带有Reader或Writer字样的,如InputStreamReader等等,它们处理的最小单位是字符。    

2. 按流向分类:

  • 输入流(Input Streams):用于从数据源读取数据。
  • 输出流(Output Streams):用于向数据目的地写入数据。
  •  输入流,模样很好记,一般情况下,输入流是带有Input字样或Reader字样的,如FileInputStream和BufferedReader等等,这些都是输入流。

  •  输出流,一般情况下,是带有Output字样或Writer的,如FileOutputStream和FileWriter等等。

3. 按数据源和目的地分类:

  • 节点流(Node Streams):直接连接到数据源或数据目的地的流,如文件流。
  • 处理流(Filter Streams):对其他流进行包装,提供额外功能的流,如缓冲流、转换流。

4. 按功能分类:

  • 缓冲流(Buffered Streams):提供内部缓冲区以提高读写效率。
  • 转换流(Conversion Streams):在字节流和字符流之间进行转换。
  • 数据流(Data Streams):提供读写基本数据类型的功能。
  • 对象流(Object Streams):用于对象的序列化和反序列化。
  • 打印流(Print Streams):提供格式化输出功能。
  • 管道流(Piped Streams):用于线程间通信。

5. 按访问方式分类:

  • 顺序访问流(Sequential Access Streams):数据只能顺序读取或写入。
  • 随机访问流(Random Access Streams):可以随机访问数据流中的任意位置。

6. 按操作方式分类:

  • 只读流(Read-only Streams):只能读取数据,不能写入。
  • 只写流(Write-only Streams):只能写入数据,不能读取。
  • 读写流(Read-Write Streams):既可以读取数据,也可以写入数据。

7. 特定用途的流:

  • 内存映射文件流(Memory-Mapped File Streams):将文件或文件的一部分映射到内存中,提高访问速度。
  • 压缩流(Compression Streams):用于数据的压缩和解压缩,如ZIP或GZIP流。

Java中的流分类:

在Java中,流的分类通常基于它们的基类和功能。Java的流类主要分为两大类:字节流和字符流,每类都有相应的输入和输出流,以及各种特殊功能的流。

  • InputStreamOutputStream:字节流的基类。
  • ReaderWriter:字符流的基类。
  • FileInputStreamFileOutputStreamFileReaderFileWriter:用于文件的读写。
  • BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter:提供缓冲功能的流。
  • DataInputStreamDataOutputStream:用于读写基本数据类型。
  • ObjectInputStreamObjectOutputStream:用于对象的序列化和反序列化。
  • PipedInputStreamPipedOutputStream:用于线程间通信。
  • RandomAccessFile:提供对文件的随机访问。

每种流都有其特定的用途和特点,开发者可以根据实际需求选择合适的流类型。

三、流的使用:

1、字节流常用类的用法:

1. InputStream

  • 抽象类,是所有输入字节流的超类。
  • 提供了基本的读取字节数据的方法。

2. OutputStream

  • 抽象类,是所有输出字节流的超类。
  • 提供了基本的写入字节数据的方法。

3. FileInputStream

  • 用于从文件中读取字节数据。
  • 用法示例:
    FileInputStream fis = new FileInputStream("example.bin"); 
    int byteRead;
     while ((byteRead = fis.read()) != -1) {
     // 处理读取的字节
     }
     fis.close();

4. FileOutputStream

  • 用于向文件写入字节数据。
  • 用法示例:
    FileOutputStream fos = new FileOutputStream("output.bin"); 
    byte[] data = "Hello, World!".getBytes(); 
    fos.write(data); 
    fos.close();

5. ByteArrayInputStream

  • 包装一个字节数组,提供对数组内容的输入流访问。
  • 用法示例:
    byte[] byteArray = {10, 20, 30, 40}; 
    ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); 
    int value;
     while ((value = bais.read()) != -1) { 
    // 处理读取的字节 
    }

6. ByteArrayOutputStream

  • 提供一个可扩展的字节数组,用于收集字节数据。
  • 用法示例:
  • ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    baos.write(72); 
    // 写入字节数据 
    byte[] buffer = baos.toByteArray();
     // 获取字节数组 
    baos.close();

7. DataInputStream

  • InputStream读取基本数据类型。
  • 用法示例:
  • DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"));
     int number = dis.readInt();
     dis.close();

8. DataOutputStream

  • 写入基本数据类型到OutputStream
  • 用法示例:
  • DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin")); 
    dos.writeInt(123); 
    dos.close();

9. PipedInputStreamPipedOutputStream

  • 用于线程间的通信。
  • 用法示例:
  • PipedOutputStream pos = new PipedOutputStream();
     PipedInputStream pis = new PipedInputStream(pos);
     // 将pis连接到一个线程,将pos连接到另一个线程

10. SequenceInputStream

  • 允许将多个InputStream合并成一个单一的输入流。
  • 用法示例:
  • InputStream is1 = ...; InputStream is2 = ...; 
    SequenceInputStream sis = new SequenceInputStream(is1, is2);
     while (sis.available() > 0) {
     int b = sis.read(); 
    // 处理读取的字节 
    }

11. ObjectInputStreamObjectOutputStream

  • 用于对象的序列化和反序列化。
  • 用法示例(序列化):
  • ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat")); 
    MyObject obj = new MyObject();
     oos.writeObject(obj);
     oos.close();

12. FilterInputStreamFilterOutputStream

  • 抽象类,用于添加功能到其他输入/输出流。
  • 比如,BufferedInputStreamBufferedOutputStream就是从这些类继承的。

注意事项:

  • 总是使用try-catch块来捕获可能发生的IOException
  • 使用try-with-resources语句来自动关闭流,避免资源泄露。
  • 根据需要选择合适的字节流类,以提高代码的效率和可读性。

2.字符流常用类的用法: 

1. Reader

  • 抽象类,是所有用于读取字符数据的类的超类。

2. Writer

  • 抽象类,是所有用于写入字符数据的类的超类。

3. FileReader

  • 用于从文件中读取字符数据。
  • 用法示例:
    FileReader fr = new FileReader("example.txt");
     int charRead; 
    while ((charRead = fr.read()) != -1) 
    { 
    System.out.print((char) charRead);
     // 打印字符
     } 
    fr.close();

4. FileWriter

  • 用于向文件写入字符数据。
  • 用法示例:
    FileWriter fw = new FileWriter("output.txt"); 
    fw.write("Hello, World!");
     fw.close();

5. BufferedReader

  • 包装一个字符输入流,并提供一个字符数组缓冲区以提高效率。
  • 用法示例:
    BufferedReader br = new BufferedReader(new FileReader("example.txt"));
     String line;
     while ((line = br.readLine()) != null)
     { 
    System.out.println(line);
     } 
    br.close();

6. BufferedWriter

  • 包装一个字符输出流,并提供一个字符数组缓冲区以提高效率。
  • 用法示例:
    BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt")); 
    bw.write("Hello, World!");
     bw.newLine();
     // 写入换行符 
    bw.close();

7. CharArrayReader

  • 包装一个字符数组,并提供对数组内容的输入流访问。
  • 用法示例:
    char[] charArray = {'H', 'e', 'l', 'l', 'o'}; 
    CharArrayReader car = new CharArrayReader(charArray);
     int value; 
    while ((value = car.read()) != -1)
     {
     System.out.print((char) value);
     }

8. CharArrayWriter

  • 提供一个可扩展的字符数组,用于收集字符数据。
  • 用法示例:
    CharArrayWriter cw = new CharArrayWriter(); 
    cw.write("Hello, World!".toCharArray());
     String buffer = cw.toString(); 
    // 获取字符串 
    cw.close();

9. StringReader

  • 包装一个String,并提供对字符串内容的输入流访问。
  • 用法示例:
    StringReader sr = new StringReader("Hello, World!");
     int value; 
    while ((value = sr.read()) != -1) {
     System.out.print((char) value);
     }

10. StringWriter

  • 提供一个String作为字符数据的输出目的地。
  • 用法示例:
    StringWriter sw = new StringWriter(); 
    sw.write("Hello, World!"); 
    String output = sw.toString(); 
    // 获取字符串
     sw.close();

11. PipedReaderPipedWriter

  • 用于线程间的字符数据通信。
  • 用法示例:
    PipedWriter pw = new PipedWriter(); 
    PipedReader pr = new PipedReader(pw);
     // 将pr连接到一个线程,将pw连接到另一个线程

12. PrintWriter

  • 用于打印格式化的字符数据到输出流。
  • 用法示例:
    PrintWriter pw = new PrintWriter(new FileWriter("output.txt")); 
    pw.println("Hello, World!"); 
    pw.close();

注意事项:

  • 确保字符流的编码与文件的编码一致,以避免字符编码错误。
  • 使用try-with-resources语句自动管理资源,确保流在使用后被关闭。
  • 根据需要选择合适的字符流类,以提高代码的效率和可读性。

3.FilterInputStream的各种类型:

 3.1 用于封装以字节为导向的InputStream

 1) DataInputStream:从stream中读取基本类型(int、char等)数据。

 2) BufferedInputStream:使用缓冲区

 3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)

 4) PushbackInputStream:很少用到,一般用于编译器开发

 3.2 用于封装以字符为导向的InputStream

 1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream

 2) BufferedReader:与BufferedInputStream对应

 3) LineNumberReader:与LineNumberInputStream对应

 4) PushBackReader:与PushbackInputStream对应

 2.3 FilterOutStream的各种类型

 3.3 用于封装以字节为导向的OutputStream

 1) DataIOutStream:往stream中输出基本类型(int、char等)数据。

 2) BufferedOutStream:使用缓冲区

 3) PrintStream:产生格式化输出

 3.4 用于封装以字符为导向的OutputStream

 1) BufferedWrite:与对应

 2) PrintWrite:与对应

 3.5 RandomAccessFile

 1) 可通过RandomAccessFile对象完成对文件的读写操作

 2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写

 3) 可以直接跳到文件中指定的位置

4.流的使用涉及几个基本步骤,无论是在Java还是其他支持流的编程语言中。以下是使用流的一般步骤:

1. **创建流对象**:
  确定数据源和目的地,然后创建相应的流对象。例如,如果需要从文件读取数据,则创建`FileInputStream`或`FileReader`对象。

2. **打开流**:
   - 对于某些类型的流,如文件流,需要显式打开流。这通常通过调用流对象的`open()`方法来完成。

3. **读写数据**:
   - 使用流对象提供的方法来读取或写入数据。对于字节流,可以使用`read()`和`write()`方法。对于字符流,可以使用`read(char[] cbuf)`、`write(String str)`等方法。

4. **处理异常**:
   - IO操作可能会抛出异常,如`IOException`。使用`try-catch`块来捕获和处理这些异常。

5. **关闭流**:
   - 完成数据读写后,应该关闭流以释放系统资源。这可以通过调用流对象的`close()`方法来完成。为了确保流总是被关闭,即使发生异常,可以使用`try-with-resources`语句(Java 7及以上版本)。

6. **使用装饰者模式**:
   - 利用装饰者模式,可以为流添加额外的功能,如缓冲、数据转换等,而不需要修改现有的代码。

### 示例:使用Java进行文件读取和写入

以下是一个简单的Java示例,演示如何使用字符流读取和写入文件:

import java.io.*;

public class StreamExample {

    public static void main(String[] args) {
        // 定义文件路径
        String filePathRead = "example.txt";
        String filePathWrite = "output.txt";

        try (BufferedReader reader = new BufferedReader(new FileReader(filePathRead));
             BufferedWriter writer = new BufferedWriter(new FileWriter(filePathWrite))) {

            // 读取文件内容并写入到另一个文件
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // 写入换行符
            }

            System.out.println("文件读取和写入完成。");

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

在这个示例中,我们使用了BufferedReaderBufferedWriter来提高文件读写的效率。使用try-with-resources语句确保了流在使用后能够自动关闭。

注意事项:

  • 确保处理所有可能的异常情况。
  • 总是关闭流以释放系统资源,避免资源泄露。
  • 使用适当的异常处理机制,确保程序的健壮性。
  • 根据需要选择合适的流类型,以提高代码的效率和可读性。

 

四、在Java中,进行文件的读写操作通常涉及以下步骤:

  1. 创建文件输入/输出流对象:根据需要读写的文件类型(文本或二进制)和操作(读或写),选择适当的流类。

  2. 打开文件:对于文件流,通常在创建流对象时指定文件路径,Java会自动打开文件。

  3. 读写数据:使用流对象提供的方法来读取或写入数据。

  4. 处理异常:IO操作可能会抛出IOException,需要使用try-catch块来捕获和处理这些异常。

  5. 关闭流:完成读写操作后,应该关闭流以释放系统资源。可以使用try-finally块或Java 7及以上版本的try-with-resources语句来确保流被正确关闭。

以下是一些具体的示例:

读取文本文件:

import java.io.*;

public class StreamExample {
    public static void main(String[] args) {
        // 定义文件路径
        String filePathRead = "example.txt";
        String filePathWrite = "output.txt";

        try (BufferedReader reader = new BufferedReader(new FileReader(filePathRead));
             BufferedWriter writer = new BufferedWriter(new FileWriter(filePathWrite))) {

            // 读取文件内容并写入到另一个文件
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // 写入换行符
            }

            System.out.println("文件读取和写入完成。");

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

写入文本文件:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class WriteTextFile {
    public static void main(String[] args) {
        String filePath = "output.txt";
        String content = "Hello, World!";

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

读取二进制文件:

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

public class ReadBinaryFile {
    public static void main(String[] args) {
        String filePath = "example.bin";
        byte[] fileContent = new byte[1024]; // 假设文件内容不超过1024字节

        try (FileInputStream fis = new FileInputStream(filePath)) {
            int bytesRead = fis.read(fileContent);
            while (bytesRead != -1) {
                // 处理读取的数据
                System.out.println(new String(fileContent, 0, bytesRead));
                bytesRead = fis.read(fileContent);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

写入二进制文件:

import java.io.FileOutputStream;
import java.io.IOException;

public class WriteBinaryFile {
    public static void main(String[] args) {
        String filePath = "output.bin";
        byte[] data = "Hello, World!".getBytes(); // 将字符串转换为字节数组

        try (FileOutputStream fos = new FileOutputStream(filePath)) {
            fos.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这些示例中,使用了BufferedReaderBufferedWriter来提高读写效率,它们分别包装了FileReaderFileWriter。对于二进制文件的读写,使用了FileInputStreamFileOutputStream

请注意,示例中的try-with-resources语句确保了每个资源(在这种情况下是流)在使用后都被自动关闭。这是一种推荐的做法,因为它可以减少资源泄露的风险。

五、实例测试代码:

建立一个基本的Java项目:

在src包下面建立一个data1.txt文件空白也可以,方便观察

建议写入再读取更方便观察结果,体会两个流的不同

字节流输出流:

写数据OutputStream即测试代码:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class OutputStream1 {
    public static void main(String[] args) {
        String data="hello!java";
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream("src/data1.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            fileOutputStream.write(data.getBytes());
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }

    }
}

字节流输入流:

读数据即Inputstream测试代码:


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStream1 {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("src/data1.txt");//对应文件的位置
            int data;
//读取文件内容
            while ((data=fileInputStream.read())!=-1){
                System.out.println((char) data);
            }
//异常处理
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }
}

字符流输出流:

Outputwriter字符流的测试代码:


import java.io.FileWriter;
import java.io.IOException;

public class Outputwriter {
    public static void main(String[] args) throws IOException {
        String data="hello!java";
        FileWriter fileWriter = new FileWriter("src/data1.txt");
        fileWriter.write(data);
        fileWriter.flush();
        fileWriter.close();
    }
}

字符流输入流:

 inputReader字符流的测试代码:


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

public class inputReader1 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("src/data1.txt");
        int chars;
        while ((chars=fileReader.read())!=-1){
            System.out.println((char) chars);
        }
    }
}

六、文件输入输出流举例:

1.File类的list Files无参方法举例

Fail 类list fails无参方法。这个方法会返回一个file类的数组,它的作用是当一个file类的对象指向一个特定的路径。这个对象去调用list files无参方法时,将会返回file类的数组,这个数组里边的每一个元素将会指向一个特定的文件

import java.io.File;
import java.io.IOException;
import java.util.Date;

public class TestFile1 {
    public static void main(String[] args) throws IOException {
        File dir2=new File("D:/Workspaces");
        File fileName2[]=dir2.listFiles();
        File s=null;
        for (int i = 0; i <fileName2.length ; i++) {
            if (fileName2[i].getName().endsWith(".txt")){
                if (s==null)
                    s=fileName2[i];
                    System.out.println(fileName2[i].getName());

            }
        }
        System.out.println("Name:"+s.getName()+"\nParent:"+s.getParent()
        +"\nPath:"+s.getPath()+"\nAbsolutePath?"+s.getAbsolutePath()+
                "\nAbsolute?"+s.isAbsolute()+
                "\nCan read:"+s.canRead()+
                "\nCan write"+s.canWrite()+"\nExist:"+s.exists()+
                "\nLength:"+s.length()+"\nLast Modified:"+
                new Date(s.lastModified()));
        s=new File("D:\\Workspaces\\a3.txt");
        s.createNewFile();
    }
}

2.文件字节流举例:

package IO;

import java.io.*;
import java.util.*;
//文件字节流为什么要用try catch一块呢?写文件流write方法,读文件流read方法,都会抛出输入输出异常,write和read方法在声明的时候都要抛出异常
public class zijieliu {
    public static void main(String[] args) {
        {
            File f = new File("lianxi1.txt");
            try {
                FileOutputStream out = new FileOutputStream(f, true);
//构造方法中为file类的对象f,说明Out对象可以向F所指定的当前路径下面lianxi1.txt写文件

                Scanner reader = new Scanner(System.in);
                String s = "";
                System.out.println("请输入内容:");

                s = reader.nextLine();
                //从键盘上通过reader对象调用next line 方法,输接收字符串
               //Next line,它的特点是遇到回车即截止,遇到空格不截止,所以接收字符串里面可以包含空格,如果是next(),接受的字符串不允许有空格
                while (!s.equals("finish"))//判断接收的字符串是否为finish,
                {
                    byte[] c = s.getBytes();
                    out.write(c);
                    //将接收的字符串通过调用string类的方法getBytes把字符串解析成一个字节数组C,之后再通过文件字节输出流对象out,把C这个数组里面的内容写到指定的文件当中
                    out.write((int) '\r');//回车不换行
                    out.write((int) '\n');//\r\n回车换行
//int类型,将一个字符转换成在unicode表当中的位置,然后再将这个位置作为参数写到文件里,实际上是记下了这个字符所对应的位置
//调用了参数不同的两类write写方法,一个是写一批数据,另外一个是只写一个字符所对应的位置数据
                    s = reader.nextLine();
                }
                reader.close();
                out.close();

                FileInputStream in = new FileInputStream(f);//文件中有中文,读取回出错,调用read方法每次只能读取一个字节
                int a;
                while ((a = in.read()) != -1)//读取一个内容,返回这个字节所对应的整形值,然后把它赋给a,它返回的值和-1进行比较的时候,如果不等于-1,说明文件里面内容没有读完
                {
                    System.out.print((char) a);
                }
                in.close();
            } catch (IOException ioe) {
                System.out.println("输入输出错误!");
            }
        }
    }
}

3.文件字符流举例:

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class TextFileRW {
    public static void main(String[] args) {
        File f=new File("Lianxi.txt");
        try {
            FileWriter out=new FileWriter(f,true);
            Scanner reader = new Scanner(System.in);
            String s="";
            System.out.println("请输入内容");
            s=reader.nextLine();
            while (!s.equals("finish")){
                out.write(s);
                out.write((int)'\r');
                out.write((int)'\n');
                s= reader.nextLine();
            }
            reader.close();
            out.close();
            FileReader in = new FileReader(f);
            int a;
            while ((a=in.read())!=-1){
                System.out.println((char)a);
            }
            in.close();
        } catch (IOException ioe) {
            System.out.println("输入输出错误");
        }
    }
}

补充:

1.IO 流的作用:

实现数据的输入和输出:通过 IO 流,可以从外部源中读取数据到程序中,或

者将程序中的数据写入到外部源中。

处理文件操作:可以通过 IO 流读取、写入文件,实现文件的读取、写入和操

作。

网络通信:通过 IO 流可以实现网络通信,包括建立 Socket 连接、传输数据等。

2. IO 流的使用场景:

文件操作:读取、写入和处理文件。

网络编程:建立 Socket 连接,进行网络通信。

数据处理:通过 IO 流实现数据的输入、输出和处理,包括序列化、反序列化

等操作。

图像处理:读取、写入图像文件,并进行图像处理操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商品信息采集技巧大公开:五种高效采集方法分享

摘要&#xff1a; 面对日益激烈的电商竞争&#xff0c;高效采集淘宝商品信息成为商家致胜的关键。本文将揭秘2024年最实用的五种淘宝商品信息采集技巧&#xff0c;助您在大数据时代抢占先机&#xff0c;提升市场竞争力。 一、为何淘宝商品信息采集如此重要&#xff1f; 在电…

新闻稿件管理系统

TOC springboot109新闻稿件管理系统 系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理新…

社区团购独立源码最新版,包含小程序前端、管理后台、数据库

介绍&#xff1a; 社区拼团&#xff0c;社区电商等形式的新型社交电商平台源码。独创双模式&#xff1a;以团长为中心&#xff0c;以小区为中心&#xff0c;首款支持社区团购加社群团购模式的团购小程序&#xff0c;线上线下双模式&#xff0c;后台自由配置配送方式。 更新说…

五分钟学会辨别葡萄酒的优劣

不论是买什么商品&#xff0c;人们都十分关心品质。比如&#xff0c;要买葡萄酒&#xff0c;你首先要确认的就是这款酒好不好。那么&#xff0c;如何才能做到快速识别葡萄酒的好坏呢&#xff1f; 一、观察外观 首先&#xff0c;观察干红葡萄酒的外观是初步判断其品质的第一步。…

IP基础(通俗易懂版)

IP 位于 TCP/IP 参考模型的第三层&#xff0c;也就是⽹络层。 ⽹络层的主要作⽤是&#xff1a;实现主机与主机之间的通信&#xff0c;也叫点对点通信。 1 、网络层&#xff08; IP) 与数据链路层 (MAC) 有什么关系呢&#xff1f; MAC 的作用&#xff1a; 实现【直连】的两个…

【乐吾乐大屏可视化组态编辑器】条件修改属性

条件修改属性 在线使用&#xff1a;https://v.le5le.com/ 如图所示&#xff0c;右边文本图元数值一直在发生变化&#xff0c;当数值大于等于600、或者小于等于200的时候&#xff0c;左侧正方形图元背景颜色变成红色&#xff0c;产生告警效果&#xff1b;当数值在200到600之间…

海康相机二次开发学习笔记1-环境配置

因为最近可以用一段时间海康加密狗,Visionpro二次开发暂时停更一段时间,开始记录一下海康相机二次开发的学习笔记. 环境配置 1. 创建项目 打开Visual Studio,新建.NetFramework项目,选择WindowsForms,点击下一步,选择项目名称,点击下一步,点击确定打开项目属性,点击生成选项…

系统编程-认识Linux及常用指令

1 认识Linux及常用指令 主要学习函数 一、认识linux Linux 是由 UNIX 发展而来的&#xff0c;UNIX 是由程序员设计&#xff0c;它的主要服务对象也是程序员。Linux 继承了 UNIX 的设计目标。 1、linux系统的主要特性 多用户多任务开源 免费 大家都可以用庞大的社区群支持多…

Linux os下制作deb包

在 linux os下制作 .deb 包涉及以下几个主要步骤。假设已经有一个应用程序或软件项目&#xff0c;并且希望将它打包为一个 .deb 包。 1. 准备源代码和构建环境 首先&#xff0c;需要准备好应用程序的源代码&#xff0c;并确保它可以在开发环境中成功编译和运行。 2. 创建目录…

Istio学习整理

一、Service Mesh Service Mesh 的中文译为 “服务网格” &#xff0c;是一个用于处理服务和服务之间通信的基础设施层&#xff0c;它负责为构建复杂的云原生应用传递可靠的网络请求&#xff0c;并为服务通信实现了微服务所需的基本组件功能&#xff0c;例如服务发现、负载均衡…

【嵌入式】指针与整数的桥梁、跨平台编程的黄金钥匙:揭开 uintptr_t 和 intptr_t 的神秘面纱

目录 一、intptr_t 和 uintptr_t 详解二、适用场景三、示例四、写在最后 一、intptr_t 和 uintptr_t 详解 intptr_t 和 uintptr_t&#xff0c;这两个数据类型是ISO C99定义的。主要用于处理指针和整数之间的转换。它们在需要将指针转换为整数进行操作&#xff0c;或者将整数转…

spring boot入门案例

一、案例需求 请求Controller中的方法&#xff0c;并将返回值响应到页面 二、代码实现 1.依赖管理——pom.xml文件 &#xff08;1&#xff09;引入 &#xff08;2&#xff09;引入依赖集合 &#xff08;3&#xff09;引入插件&#xff1a;为了方便运行&#xff0c;将project…

[Meachines] [Medium] Haircut Curl命令注入+TRP00F自动化权限提升+Screen4.5.0权限提升

信息收集 IP AddressOpening Ports10.10.10.24TCP:22,80 $ nmap -p- 10.10.10.24 --min-rate 1000 -sC -sV ORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 e9:75:c1:e4:b3:63…

驱动开发系列10 - Linux Graphics 图形栈介绍

目录 一:Linux 图形栈总体结构 1. 整体图形栈: 2. 现代3D图形栈: 二:Xorg 介绍 Xorg 概述: Xorg的发展历史: Xorg绘制原理: Xorg的缺点: 三:Wayland 介绍 一:Linux 图形栈总体结构 1. 整体图形栈: 应用程序->桌面环境->GUI框架->Display Client->Displ…

探索边缘计算与云计算之间的区别

IT管理员不需要在边缘和云之间进行选择&#xff0c;但需要了解每种技术的优缺点&#xff0c;以便最好地将它们融入到企业运营中。 许多组织使用云作为其整体IT平台的一部分。资源管理的灵活性和更高的整体利用率的承诺可以等同于节省成本。 此外&#xff0c;对许多人而言&…

聚焦巴黎奥运会 | AI技术如何成为赛场上的智能明星?

备受关注的2024年巴黎奥运会已圆满落幕&#xff01; 本届巴黎奥运会不仅是全球瞩目的体育盛事&#xff0c;更是展示中国科技创新实力的重要舞台。从精彩的赛事转播到精密的比赛设备&#xff0c;再到先进的场馆建设&#xff0c;中国的"黑科技"正伴随着中国运动员的矫健…

达梦DSC集群部署.docx

1. 前期规划 1.1. 集群规划 节点1节点2业务服务名DSC业务IP192.168.25.101192.168.25.102内部数据交换网络IP10.10.10.110.10.10.2dmdcr_cfgCSSDCR_EP_NAMECSS0CSS1DCR_EP_HOST10.10.10.110.10.10.2DCR_EP_PORT11286ASMDCR_EP_NAMECSS0CSS1DCR_EP_HOST10.10.10.110.10.10.2DC…

服务器数据恢复—raid5阵列热备盘未全部启用导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EMC某型号存储中有一组RAID5磁盘阵列。该raid5阵列中有12块硬盘&#xff0c;其中2块硬盘为热备盘。 服务器存储故障&#xff1a; 该存储raid5阵列中有两块硬盘离线&#xff0c;只有1块热备盘启用替换掉其中一块离线盘&#xff0c;另外…

如何让RStudio使用不同版本的R

下面内容摘录自&#xff1a; 专栏问答&#xff1a;管理和选择不同的R&#xff0c;如何做好R的笔记_rstudio如何在不同的r版本中进行切换-CSDN博客 欢迎订阅我们专栏 问题一&#xff1a;如何发现RStudio需要安装和使用不同版本的R。这是为什么呢&#xff1f; R允许用户在同一系统…

Spring容器启动的过程(main)

大体流程如下 1、初始化 首先&#xff0c;Spring会通过用户提供的配置信息&#xff08;例如XML文件或者注解&#xff09;来初始化一个BeanFactory&#xff0c;这个BeanFactory是Spring容器的核心&#xff0c;它负责创建和管理所有的Bean。 2、读取配置生成并注册BeanDefini…