学习Java第十六天:Java中的输入流和输出流

  1. 输入输出流

    输入输出流 --- 读写文件

    输入---读取文件中数据到自己的程序中接受处理

    输出---将自己的程序中处理好的数据写入文件中

  1. 流的分类

    按照数据的移动轨迹将流分为:输入流,输出路

    按照每一次读/写数据量的大小将流分为:字节流,字符流

    字节流:每一次可以读写一个字节的数据量,一个字节就是8位2进制(图片,视频,mp3...)

    字符流:每一次可以读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的数据。

    详细划分:字节输入流,字节输出流 | 字符输入流,字符输出流

  1. 字节流相关类的使用

    字节输出流 --- OutputStream --- 抽象类 --- 不能new --- 子类

    1. FileOutputStream类

      构造方法:

      FileOutputStream(File file) --- 通过File对象创建一个不可追加的字节输出流。

      File file = new File("D:" + File.separator + "20220202" + "test.txt")
      FileOutputStream fos = new FileOutputStream(file);

      FileOutputStream(File file,boolean append) --- 通过File对象创建一个是否追加的字节输出流。

      File file = new File("D:" + File.separator + "20220202" + "test.txt")
      FileOutputStream fos = new FileOutputStream(file,true);

      FileOutputStream(String name) --- 通过String对象创建一个不可追加的字节输出流。

      FileOutputStream fos = new FileOutputStream("D:" + File.separator + "20220202" + "test.txt");

      FileOutputStream(String name,boolean append) --- 通过String对象创建一个是否追加的字节输出流。

      String str = "D:" + File.separator + "20220202" + "test.txt";
      FileOutputStream fos = new FileOutputStream(str,true);
      public class TestFile {
          public static void main(String[] args) throws Exception{
              //输出
              File file =new File("E:" + File.separator + "20220202" +File.separator +  "test.txt");
              OutputStream fos = new FileOutputStream(file);
              String info = "Hello,world1";
              byte[] bytes = info.getBytes();
              fos.write(bytes,0,5);
              fos.close();
              System.out.println("输出成功");
      }

      注意:append参数如果是true就是追加(不覆盖原有的),创建输入输出流对象的时候,会自动创建出实体文件。

      常用方法

      void write(byte[] b)将b.length个字节从指定的字节数组写入此文件输出流。

      void write(byte[] b,int off,int len)将len字节从位于偏移量offf的指定字节数组写入此文件输出流。

      void write(int b)将指定的字节写入此文件输出流。

      void close()关闭此文件输出流并释放与此流相关联的任务系统资源。

    2. FileInputStream类

      构造方法

      FileInputStream(File file)通过File对象创建一个字节输入流

      FileImputStream(String name)通过String对象创建一个字节输入流

      常用方法

      int read() --- 从该输入流读取一个字节的数据。

      返回值:读取到具体字节数据的int型,如果到达文件末尾返回-1.

      int read(byte[] b)从该输入流读取最多b.length个字节的数据为字节数组。

      返回值:读取的总字节数,如果到达文件末尾返回-1.

      void close()关闭此文件输入流并释放与流相关联的任务系统资源。

      public class TestFile {
          public static void main(String[] args) throws Exception{
              //输入流
              File file = new File("E:"+ File.separator + "20220202"+ File.separator + "test.txt");
              FileInputStream fis = new FileInputStream(file);
              byte[] bytes = new byte[(int)file.length()];
              int temp = 0;
              int index = 0;
              while((temp = fis.read()) != -1){
                  bytes[index] = (byte) temp;
                  index ++;
              }
              String str= new String(bytes,0,index);
              System.out.println(str);
              fis.close();
          }
      }

    3. DataOutputStream类

      构造方法

      DataOutputStream(OutputStream out)创建一个新的数据输出流,将数据写入指定的底层输出流。

      常用方法

      void writeBoolean(boolean v)---将boolean写入底层输出流作为1字节值。

      void writeByte(int v)---将byte作为1字节值写入底层输出流。

      void writeChar(int v)---将char写入底层输出流作为2字节值,高字节优先。

      void writeDouble(double v)---双参数传递给转换long使用doubleToLongBits方法Double,然后写入改long值基础输出流作为8字节的数量,高字节。

      void writeFioat(float v)---浮点参数的转换int使用floatToIntBits方法在类Float,然后写入改int值基础输出流作为一个4字节的数量,高字节。

      void writeInt(int v)---将底层输出流写入int作为 四字节,高位字节。

      void writeLong(long v)---将long写入底层输出流,为8字节,高字节为首。

      void writeShort(int v)---将short写入底层输出流作为两个字节,高字节优先。

      void writeUTF(String str)---使用modified UTF-8编码以机器无关的方式将字符串写入基础输出流。

      void flush()---刷新此数据输出流。

      void close()---关闭此输出流并释放与此流相关联的任务系统资源。

      优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组

      缺点:保存到文件中的数据是乱码。

    4. DataInputStream类

      构造方法

      DataInputStream(InputStream in)创建使用指定的底层InputStream的DataInputStream

      常用方法

      同上

  2. 字符流相关的操作类(处理文本数据)

    字符输出流 --- Writer类 --- 抽象类 --- 不能new --- 子类

    1. FileWriter类

      构造方法

      FileWriter(File file)给一个File对象构造一个FileWriter对象。

      FileWriter(File file,boolean append)给一个File对象构造一个是否允许追加FileWriter对象。

      FileWriter(String fileName)给一个String对象构造一个FileWriter对象。

      FileWriter(String fileName,boolean append)给一个String对象构造一个是否允许追加FileWriter对象。

      常用方法

      void write(char[] cbuf)写入一个字符数组。

      void write(char[] cbuf,int off,int len)写入字符数组的一部分。

      void write(int c)写一个字符。

      void write(String str)写一个字符串。

      void write(String str,int off,int len)写一个字符串的一部分。

      void close()关闭流,先刷新。

      void flush()刷新流。

    public class FileWriterTest {
        public static void main(String[] args) throws IOException {
            String str = "E:" + File.separator + "20220202" + File.separator  + "test.txt";
            FileWriter fileWriter = new FileWriter(str);
            String info = "你好,世界";
            char[] chars = info.toCharArray();
            fileWriter.write(chars);
            fileWriter.flush();
            fileWriter.close();
            System.out.println("写入成功");
        }
    1. 字符输入流 --- Reader类 --- 抽象类 --- 不能new --- 子类

      FileReader类

      构造方法

      FileReader(File file)给一个File对象构造一个FileReader对象。

      FileReader(String fileName)给一个String对象构造一个FileReader对象。

      常用方法

      int read()---读一个字符。返回值是读取的真实字符数据的整数值,如果已经大道流的末尾,则为-1。

      int read(char[] cbuf)---将字符读入数组。返回总字符数,如果到达文件末尾返回-1;

      void close()---关闭流并释放与之相关联的任务系统资源。

    public class FileWriterTest {
        public static void main(String[] args) throws IOException {
            File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt");
            FileReader fileReader = new FileReader(file);
            char[] chars = new char[(int)file.length()];
            int temp = 0;
            int index = 0;
            while((temp =fileReader.read()) != -1){
            chars[index] = (char)temp;
            index ++;
            }
            String result = new String(chars, 0, index);
            System.out.println(result);
        }
    }

  3. BufferedWriter类

    构造方法

    BufferedWriter(Writer out)---通过字符输出流的对象创建BufferedWriter

    常用方法

    void newLine()---写一行行分隔符。

    void write(char[] cbuf,int off,int len)---写入字符数组的一部分。

    void write(int c)---写一个字符。

    void write(String s,int off,int len)---写一个字符串的一部分。

    void close()--关闭流,先刷新。

    void flush()--刷新流。

  4. BufferedReader类

    构造方法

    BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader

    常用方法

    int read()---读一个字符,返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1.

    int read(char[] cbuf)---将字符读入数组,返回总字符数,如果到达文件末尾返回-1.

    void close()---关闭流并释放与之相关联的任何系统资源。

    String readLine()---读一行文字。

    BufferedReader ---------Scanner

    readLine() nextLine()

    从文件中读取 从键盘输入中读取

    问:我们能不能通过BuferedReader读取键盘输入的数据?Scanner的nextLine()方法为什么可以读取键盘输入?

    答:因为Scanner对象在创建的时候使用过了System.in,System.in默认就是键盘输入,只要在创建BufferedReader对象的时候,使用System.in就可以完成键盘输入,BufferedReader(Reader in)参数是Reader字符输入流,System.in是InputStream类型字节输入流。

    解决问的关键就是将InPutStream类型字节输入流转换成Reader字符输入流。下面介绍:

  5. InputStreamReader类(字节输入流转换成字符输入流)

    构造方法

    InputStreamReader(InputStream in)---字节输入流转换成字符流(属于字符流的字符输入流)

    public class Buffered {
        public static void main(String[] args) throws IOException {
    ​
            InputStreamReader inputStreamReader = new InputStreamReader(System.in);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            System.out.println("从键盘输入一些东西吧");
            String s = bufferedReader.readLine();
            System.out.println(s);
        }
    }

  6. OutputStreamWriter类(字节输出流转换成字符输出流)

    构造方法

    OutputStreamWriter(OutputStream out)---将字节输出流转换成字符输出流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 下面是一个简单的示例代码,展示了如何使用 Java 将 PCM 数据转换为 TRMP 数据: ``` import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.audio.mp3.MP3AudioHeader; import org.jaudiotagger.audio.mp3.MP3File; public class PCMToTRMP { public static void main(String[] args) throws Exception { // 定义 PCM 数据的格式 AudioFormat pcmFormat = new AudioFormat(44100, 16, 2, true, false); // 读取 PCM 数据 AudioInputStream pcmStream = AudioSystem.getAudioInputStream(pcmFile); // 将 PCM 数据转换为 TRMP 数据 ByteArrayOutputStream trmpStream = new ByteArrayOutputStream(); AudioSystem.write(pcmStream, AudioFileFormat.Type.MP3, trmpStream); pcmStream.close(); // 将 TRMP 数据写入文件 File trmpFile = new File("output.mp3"); FileOutputStream fos = new FileOutputStream(trmpFile); fos.write(trmpStream.toByteArray()); fos.close(); } } ``` 在这段代码,我们首先读取了一个 PCM 数据,然后使用 `AudioSystem.write()` 方法将其转换为 TRMP 数据,最后将转换后的 TRMP 数据写入文件。 请注意,这段代码使用的是 javax.sound 包的类,因此在使用这段代码之前,你需要在项目添加对 javax.sound 包的引用。 希望这段代码能够帮助你。如果你有任何疑问,请随时追问。 ### 回答2: Java可以通过使用FFmpeg库来实现PCM转为MP3的示例代码。下面是一个简单的示例代码: ```java import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacv.*; public class PCM2MP3Converter { public static void main(String[] args) { // 输入PCM文件路径 String pcmFilePath = "path_to_pcm_file"; // 输出MP3文件路径 String mp3FilePath = "path_to_mp3_file"; // 初始化FFmpegFrameGrabber FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(pcmFilePath); grabber.setAudioChannels(2); // 设置声道数 grabber.setSampleRate(44100); // 设置采样率 grabber.setAudioCodec(avcodec.AV_CODEC_ID_PCM_S16LE); // 设置音频编码器 grabber.start(); // 初始化FFmpegFrameRecorder FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp3FilePath, 2); recorder.setAudioChannels(2); // 设置声道数 recorder.setSampleRate(44100); // 设置采样率 recorder.setAudioCodec(avcodec.AV_CODEC_ID_MP3); // 设置音频编码器 recorder.setFormat("mp3"); // 设置输出格式 recorder.start(); Frame frame; // 逐帧读取PCM并转码为MP3 while ((frame = grabber.grabFrame()) != null) { recorder.record(frame); } recorder.stop(); grabber.stop(); } } ``` 在上述示例代码,我们使用了JavaCV库,该库提供了对FFmpeg的Java封装,在Java实现了PCM转MP3的功能。首先,我们使用`FFmpegFrameGrabber`打开PCM文件,设置了声道数、采样率和音频编码器。然后,我们再使用`FFmpegFrameRecorder`创建一个MP3文件,并设置了相同的声道数、采样率和音频编码器。接着,我们逐帧读取PCM,并通过`recorder`将其转码为MP3。最后,我们分别停止`recorder`和`grabber`的运行。 需要注意的是,这里只是给出了一个简单的示例代码,实际使用时,你可能还需要根据自己的需求进行更多的配置和错误处理。 ### 回答3: 要实现将PCM转为MP3,我们可以借助第三方库来实现。以下是一个示例代码: ```java import java.io.*; import javax.sound.sampled.*; public class PCMtoMP3Converter { public static void main(String[] args) { File inputFile = new File("input.pcm"); File outputFile = new File("output.mp3"); convertPCMtoMP3(inputFile, outputFile); } public static void convertPCMtoMP3(File inputFile, File outputFile) { try { AudioInputStream pcmStream = AudioSystem.getAudioInputStream(inputFile); AudioFormat pcmFormat = pcmStream.getFormat(); AudioFormat mp3Format = new AudioFormat(AudioFormat.Encoding.MPEG_1_LAYER_3, pcmFormat.getSampleRate(), 16, pcmFormat.getChannels(), pcmFormat.getChannels() * 2, pcmFormat.getSampleRate(), false); AudioInputStream mp3Stream = AudioSystem.getAudioInputStream(mp3Format, pcmStream); AudioSystem.write(mp3Stream, AudioFileFormat.Type.MP3, outputFile); pcmStream.close(); mp3Stream.close(); System.out.println("转换完成!"); } catch (UnsupportedAudioFileException | IOException e) { e.printStackTrace(); } } } ``` 在上面的代码,我们首先指定输入的PCM文件路径和输出的MP3文件路径。然后,通过调用`convertPCMtoMP3()`方法,我们将PCM转换为MP3输出到指定的文件。这里使用了`AudioSystem`类提供的方法来获取PCM和MP3,并通过`AudioSystem.write()`方法将MP3写入文件。 请注意,上述代码需要依赖Java的音频处理库,如Java Sound API。你可能需要在项目添加相应的库文件。另外,由于PCM和MP3之间的转换涉及到音频编码和解码的复杂过程,所以在实际应用可能需要更多的处理和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

互联网农民工001

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

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

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

打赏作者

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

抵扣说明:

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

余额充值