c++怎么可以在二进制文件中读取带string的数据_java ----- 数据流读写文件(I/O)

本文介绍了如何使用Java的DataInputStream和DataOutputStream进行二进制文件的读写操作,特别是在处理包含字符串数据的情况下。这两个类能够实现平台无关性的数据读写,包括八大基本类型,并提到了readUTF()和writeUTF()方法用于读写UTF-8编码的字符串。
摘要由CSDN通过智能技术生成

读写二进制文件常用的类DataInputStream 和 DataOutputStream

1、使用字节流(DataInputStream ) 读二进制文件

步骤:
1、导入相关类,并抛出异常
2、构造一个数据输入流对象,将文件输入流对象 (fileInputStream )与源数据源(E:obgeObge.class)关联起来
  注意:要在路径 E:obgeObge.class  下弄点数据,如帅气的obge
3、利用数据输入流类的方法读取二进制文件中的数据
4、关闭流(close() 方法)

2、使用字节流(DataOutputStream )写二进制文件

步骤:
1、导入相关类,并抛出异常
2、构造一个数据输出流对象,将文件输出流对象 (fileOutpuStream)与源数据源(E:obgeObge.class)关联起来
  注意:要在路径E:obgeObge.class 下弄点数据,如帅气的obge
3、利用数据输出流类的方法读取二进制文件中的数据
4、关闭流(close() 方法)
 

不过DataInputStream类与 DataOutputStream 类搭配使用,从一个编译好的二进制文件 obge.class 中读取数据,然后复制到另一个二进制文件 CopyObge.class 文件中。

70f4718560b9f79d3772937b1e7f301d.png
package com.obge.test2;
/***
 * 从一个编译好的二进制文件 obge.class 中读取数据,然后复制到另一个二进制文件 CopyObge.class 文件中
 */
import java.io.*;
public class DataInputStreamStu {
    public static void main(String[] args) {
        try {
            //创建文件输入流与源文件关联 起来
            FileInputStream fileInputStream = new FileInputStream("E:obgeObge.class");
            //放到数据输入流中
            DataInputStream dataInputStream = new DataInputStream(fileInputStream);
            //创建文件输出流 关联源文件
            FileOutputStream fileOutputStream = new FileOutputStream("E:obgeCopyObge.class");
            //放到数据输出流中
            DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
            //读写二进制文件
            //定义一个变量做中转站
            int temp;
            //将 Obge.class  中的内容,赋予到 临时中转小小变量中
            while((temp = dataInputStream.read()) != -1) {
                //把读取的数据写到  CopyObge.class 文件中
                dataOutputStream.write(temp);
            }
            //关闭流
            fileInputStream.close();
            dataOutputStream.close();
            System.out.println("执行成功");
        }catch (IOException e){
            e.getMessage();
        }
    }
}

就是class 文件要通过jvm 识别运行,由于编码不同,你用记事本打开就是一个乱码,

c6378392762ac11a4a6b3c85db75e914.png
C:UsersAdministrator>E:

E:>cd obge

E:obge>javap -v class Obge.class     //将class 文件翻译成可读懂的字节码指令文件
错误: 找不到类: class
Classfile /E:/obge/Obge.class
  Last modified 2020-5-13; size 415 bytes
  MD5 checksum 0ff5abeea5271dbddb23724d92215439
  Compiled from "Obge.java"
public class Obge
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #18            // 浣犲ソObge
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // Obge
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               Obge.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Class              #23            // java/lang/System
  #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #18 = Utf8               浣犲ソObge
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               Obge
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public Obge();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String 浣犲ソObge
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 4: 0
        line 5: 8
}
SourceFile: "Obge.java"

E:obge>

java 文件

59fd2b3c38959c72189d5694372eb6f1.png

DataInputStream类与 DataOutputStream 类搭配使用,可以按照与平台无关的方式从流中读写基本数据类型(八大基本类型哦)的数据。

注意:

   DataInputStream 的 readUTF() 方法能读取采用UTF-8 字符集编码的字符串,

DataOutputStream 的 writeUTF() 方法写入采用UTF-8 字符集编码的字符串

3、读写文本文件

c2ece38b1a97ede2e82de752ff4a9fee.png
package com.obge.test2;

import java.io.*;

public class DataInputStreamReadStringStu  {
    public static void main(String[] args) throws IOException {

        //使用dataOutputStream.writeUTF 向datautf.txt 写文本
        FileOutputStream fileOutputStream = new FileOutputStream("E:obgedatautf.txt");
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);
        //采用utf-8 字符集编码编写字符串
        dataOutputStream.writeUTF("obge帅");
        //其他方式写
//        dataOutputStream.writeByte(1);
//        dataOutputStream.writeChar('d');
        dataOutputStream.close();
        bufferedOutputStream.close();
        fileOutputStream.close();
        
        //使用  dataInputStream.readUTF() 读 采用utf-8 字符集编码编写的 datautf.txt文本文件
        FileInputStream fileInputStream = new FileInputStream("E:obgedatautf.txt");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
        //读取采用utf-8 字符集编码编写字符串
        System.out.println(dataInputStream.readUTF());
        //其他方式 读
        //System.out.println(dataInputStream.readByte());
        dataInputStream.close();
        bufferedInputStream.close();
        fileInputStream.close();

    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值