Cangjie_仓颉编程-文件和I/O

文件与IO

随机读写(fseek/ftell),随机读写 可以理解为跳跃读写‌

异常处理:文件操作可能会因为多种原因失败,比如文件不存在、没有足够的权限、磁盘空间不足等。
          因此,在进行文件操作时,我们需要捕获并处理可能发生的异常。
文件锁定:当多个进程或线程同时访问同一个文件时,为了避免数据冲突,可能需要对文件进行锁定。
性能优化:在大量读写文件时,我们需要考虑文件的存储方式、索引、缓冲区等因素,以优化性能。
安全性:确保文件操作的安全性,防止未授权的访问和数据泄露。

学习不同的文件格式:了解并掌握不同的文件格式,如文本文件、二进制文件、JSON、XML等。
深入了解文件系统:了解文件系统的原理和结构,比如FAT32、NTFS、ext4等。
性能调试:学习使用性能分析工具,比如Profiling工具,来分析和优化文件操作的性能。
   step by step 

Cangjie

1)明确要操作的数据是数据源还是数据目的(要读还是要写) 3)明确数据所在的具体设备
2)明确要操作的设备上的数据是字节还是文本 4)明确是否需要额外功能
I/O 机制--磁盘的 I/O 操作 内存的 I/O 
    import std.io.InputStream
    import std.io.OutputStream
     仓颉编程语言所有的 I/O 机制都是基于数据流进行输入输出-将输入输出抽象为流(Stream
        Stream 主要面向处理原始二进制数据,Stream 中最小的数据单元是 Byte 将 Stream 定义成了 interface
     仓颉编程语言将标准输入输出、文件操作、网络数据流、字符串流、加密流、压缩流等等形式的操作,统一用 Stream 描述
        Stream
    	   InputStream
    	       read 函数,这个函数会将可读的数据写入到 buffer 中,返回值表示了该次读取的字节总数
    	   OutputStream
    	         write 函数,这个函数会将 buffer 中的数据写入到绑定的流中
    			 flush 的默认实现,一定的缓冲策略,只有当符合条件或主动调用 flush 时才会真实写入,目的是提高性能
				 
	缓冲流和字符串流。
	    带缓冲的数据流,可以多次读写数据,但不触发磁盘 I/O 操作,只是先放到内存里。
	       等凑够了缓冲区大小的时候再一次性操作磁盘,这种方式可以显著减少磁盘操作次数,从而提升性能表现
	        BufferedInputStream、BufferedOutputStream
			本质上 BufferedInputStream 是通过一个内部缓冲数组实现的。
		仓颉编程语言提供了 StringReader 和 StringWriter 来添加字符串处理能力。
    			 
标准流(StdIn、StdOut、StdErr)、文件流(File)、网络流(Socket)
    import std.console.*


fs 包来支持通用文件系统任务
    import std.fs.*
	  File   Path 和 Directory
	   public class File <: Resource & IOStream & Seekable
	    常规文件操作和文件流两类功能
	    File 静态函数 openRead/create  例如 Append、Create、Truncate、Open 以及其它便捷的复合操作。
		File 实现了 Resource 接口,在大多数时候都可以使用 try-with-resource 语法来简化使用	   

Python

数据类型:

     文本数据:字符  with open('somefile.txt', 'rt') as f:
	 字节数据: 二进制文件,比如图片,声音文件--典型的如--结构体
	         使用模式为 rb 或 wb 的 open() 函数来读取或写入二进制数据
			 二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码操作
		进制I/O还有一个鲜为人知的特性就是数组和C结构体类型能直接被写
		  硬盘-文件-内存-缓存
		    字长和字节顺序(高位优先和低位优先)
		固定大小的数据块--可变数据块--canbus 以及定位等信息--结构化数据
		可变数据数据块--可变数据块--点云和图像--非结构化数据--二进制数据
		   **可变数据长度字段列表:**可变数据长度除了包含呢VARCHAR、TEXT等变长类型
		 文件格式: cyberRT record 以及ROS  ROSbag 
		可变缓冲区- 字节数小于缓冲区大小,表明数据被截断或者被破坏了 

网络数据传输:

    Protobuf-二进制格式
	json--半结构化数据	 
 I/O通道(比如文件、管道、套接字等)的整型文件描述

python

    w  不存在则创建,存在则覆盖
	a  不存在则创建,存在则追加
    x文件模式: 不存在才能创建写入,文件存在则报错
 I/O系统以层级结构的形式构建而成。 文本文件是通过在一个拥有缓冲的二进制模式文件上增加一个Unicode编码/解码层来创建
    file.seek()方法标准格式是:
	    seek(offset,whence=0)
		offset:开始的偏移量,也就是代表需要移动偏移的字节数
		whence:表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认为0
 open、read、write与close
   raw binary files, buffered binary files and text files.
      Text I/O    io.StringIO
	  Binary I/O  io.BytesIO
	  
    听音乐时的进度条而随机读写就是随机跳跃移动光标,或是进度滚动条	

readline  readlines

seekable() 
   Return True if the stream supports random access. If False, seek(), tell() and truncate() will raise OSError.

C语言

 顺序读写(fgetc/fputc,fgets/fputs,fprintf/printf),
    每次读取数据后,读取指针会自动向后移动到下一个数据的位置。
 
     随机的读写通常涉及到文件指针的定位,可以根据需要在文件中的不同位置进行读写操作。
	    C语言提供了两个函数来进行文件的随机读写,它们分别是fseek和ftell
	int fseek ( FILE * stream, long int offset, int origin )
    long int ftell ( FILE * stream );		
 文件结束判断(feof)及文件缓冲区
缓冲
  当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写
  当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。
  标准出错情况stderr是典型代表
C语言的文件操作中,需要使用文件指针来对硬盘上的文件进行操作
     对一个文件进行读写操作之前先打开该文件,操作完后需要关闭文件。在C语言中,使用 fopen 打开文件,使用 fclose 关闭文件
	   文件的顺序读写
	   文件的随机读写,有三个函数提供服务:fseek、ftell和rewind
	     SEEK_SET:文件的开头  SEEK_CUR:文件指针当前位置   SEEK_END:文件的末尾

C++

C++定义了I/O标准类库,这些每个类都称为流/流类
   flush
   文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。
    file.seekg (0, ios::beg);
   
 IO库大致可操作三类数据: 控制台流(stream) , 文件(file) , 字符串 (string)。
 操作类型又可分三类:输入(in), 输出(out) ,输入与输出(in/out) 
   
   mode 是以下标志符的一个组合:
       ios::in	为输入(读)而打开文件
       ios::out	为输出(写)而打开文件
       ios::ate	初始位置:文件尾
       ios::app	所有输出附加在文件末尾
       ios::trunc	如果文件已存在则先删除该文件
       ios::binary	二进制方式	   

其他开发语言

  在 Rust 中,这项任务是通过标准库中的文件系统模块(std::fs)
     Go 语言文件操作相关的包:os、io/ioutil、path/filepath
Rust
   要涉及的模块包括std::fs、std::io等
    顺序读取使用了BufReader来缓存读取,而随机读取使用了seek方法来移动到文件的指定位置,然后使用read_line方法来读取一行

Java java.io
       输入流	输出流
       字节流	字节输入流 InputStream	字节输出流 OutputStream
       字符流	字符输入流 Reader	字符输出流 Writer
    字符流本质其实就是基于字节流读取时,去查了指定的码表
      关闭close和刷新flush
      转换流  InputStreamReader类-----(字节流到字符流的桥梁)
              OutputStreamWriter类-----(字符流到字节流的桥梁)
    序列化流--Java 提供了一种对象序列化的机制
	java.nio包及子包下
	NIO 弥补了同步阻塞I/O 的不足,它在标准Java 代码中提供了非阻塞、面向缓冲、基于通道的I/O,
	   可以使用少量的线程来处理多个连接,大大提高了I/O 效率和并发
	   Channel(通道) Buffer(缓冲区) Selector(选择器)
posted @ 2024-11-20 17:20  辰令  阅读(283)  评论(0)    收藏  举报