81ce3eb0创建于 2025年7月31日历史提交
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs, WriteOptions, ReadOptions } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { util, buffer } from '@kit.ArkTS';
import { router } from '@kit.ArkUI';
import { TitleBar } from './MainPage';

@Entry
@Component
struct Index {
  @State message: string = 'Welcome To Arkui_x';
  @State title: string = ''

  aboutToAppear(): void {
    let params = router.getParams() as Record<string, string>
    console.info('router.getParams() title is ' + params.title)
    this.title = params.title
  }
  build() {
    Column({ space: 20 }) {
      TitleBar({ title: this.title }).size({ height: '10%' })
      Column() {
        Text(this.message)
          .fontSize(20)
          .textAlign(TextAlign.Center)
      }
      .width('100%')
      .height('60%')
      .backgroundColor('#F5DEB3')
      .justifyContent(FlexAlign.Center)
      Grid() {
        GridItem() {
          Button("createStream")
            .type(ButtonType.Capsule)
            .fontSize(16)
            .width(180).height(40)
            .backgroundColor("#0000FF")
            .onClick(() => {
              this.message = ' ';
              let context = getContext(this) as common.UIAbilityContext;
              let pathDir = context.filesDir;
              try {
                let filePath = pathDir + "/test1.txt";
                fs.createStream(filePath, "w+").then((stream: fs.Stream) => {
                  let writeOption: WriteOptions = {
                    offset: 5,
                    length: 12,
                    encoding: 'utf-8'
                  };

                  stream.write("hello, world", writeOption).then((number: number) => {
                    console.info("write succeed and size is:" + number);

                    stream.flush((err: BusinessError) => {
                      if (err) {
                        console.error("flush stream failed with error message: " + err.message + ", error code: " + err.code);
                      } else {
                        console.info("flush succeed");
                      }
                    });

                    let arrayBuffer = new ArrayBuffer(4096);
                    let readOption: ReadOptions = {
                      offset: 11,
                      length: 6
                    };

                    stream.read(arrayBuffer, readOption).then((readLen: number) => {
                      console.info("read data succeed");
                      let buf = buffer.from(arrayBuffer, 0, readLen);
                      this.message = buf.toString();
                      stream.close();
                    }).catch((err: BusinessError) => {
                      console.error("read data failed with error message: " + err.message + ", error code: " + err.code);
                    });
                  }).catch((err: BusinessError) => {
                    console.error("write failed with error message: " + err.message + ", error code: " + err.code);
                  });

                }).catch((err: BusinessError) => {
                  console.error("createStream failed with error message: " + err.message + ", error code: " + err.code);
                });
              } catch (err) {
                console.error('AtomicFile failed! err :' + err.message);
              }
            })
        }
        GridItem() {
          Button("createStreamSync")
            .type(ButtonType.Capsule)
            .fontSize(16)
            .width(180).height(40)
            .backgroundColor("#0000FF")
            .onClick(() => {
              this.message = ' ';
              let context = getContext(this) as common.UIAbilityContext;
              let pathDir = context.filesDir;
              try {
                let filePath = pathDir + "/test2.txt";
                let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                fs.closeSync(file);

                let stream = fs.createStreamSync(filePath, "r+");
                console.info("createStream succeed");
                let writeOption: WriteOptions = {
                  offset: 5,
                  length: 11,
                  encoding: 'utf-8'
                };
                let num = stream.writeSync("hello, world", writeOption);
                stream.flushSync();
                let readOption: ReadOptions = {
                  offset: 5,
                  length: 5
                };
                let buf = new ArrayBuffer(4096);
                num = stream.readSync(buf, readOption);
                let decoder = util.TextDecoder.create('utf-8');
                let str = decoder.decodeToString(new Uint8Array(buf));
                this.message = str;
                stream.closeSync();
              } catch (err) {
                console.error('stream failed! , Cause: %{public}s', JSON.stringify(err) ?? '');
              }
            })
        }
        GridItem() {
          Button("fdopenStreamSync")
            .type(ButtonType.Capsule)
            .fontSize(16)
            .width(180).height(40)
            .backgroundColor("#0000FF")
            .onClick(() => {
              try {
                let context = getContext(this) as common.UIAbilityContext;
                let pathDir = context.filesDir;
                let filePath = pathDir + "/test3.txt";
                let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                let stream = fs.fdopenStreamSync(file.fd, "r+");
                console.info("openStream succeed");
                let writeOption: WriteOptions = {
                  offset: 5,
                  length: 12,
                  encoding: 'utf-8'
                };
                console.info("CJ openStream writeSync");
                let num = stream.writeSync("hello, world", writeOption);
                let readOption: ReadOptions = {
                  offset: 5,
                  length: 12
                };
                let buf = new ArrayBuffer(4096);
                num = stream.readSync(buf, readOption);
                let decoder = util.TextDecoder.create('utf-8');
                let str = decoder.decodeToString(new Uint8Array(buf));
                this.message = str;
                stream.closeSync();
              } catch (err) {
                console.error('stream failed Cause: %{public}s', JSON.stringify(err) ?? '');
              }
            })
        }
        GridItem() {
          Button("fdopenStream")
            .type(ButtonType.Capsule)
            .fontSize(16)
            .width(180).height(40)
            .backgroundColor("#0000FF")
            .onClick(() => {
              try {
                let context = getContext(this) as common.UIAbilityContext;
                let pathDir = context.filesDir;
                let filePath = pathDir + "/test4.txt";
                let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                fs.fdopenStream(file.fd, "r+").then((stream: fs.Stream) => {
                  console.info("openStream succeed");
                  let writeOption: WriteOptions = {
                    offset: 5,
                    length: 9,
                    encoding: 'utf-8'
                  };
                  let num = stream.writeSync("hello ABC", writeOption);
                  let readOption: ReadOptions = {
                    offset: 5,
                    length: 9,
                  };
                  let buf = new ArrayBuffer(4096);
                  num = stream.readSync(buf, readOption);
                  let decoder = util.TextDecoder.create('utf-8');
                  let str = decoder.decodeToString(new Uint8Array(buf));
                  this.message = str;
                  stream.closeSync();
                }).catch((err: BusinessError) => {
                  console.error("openStream failed with error message: " + err.message + ", error code: " + err.code);
                  fs.closeSync(file);
                });
              } catch (err) {
                console.error('stream failed Cause: %{public}s', JSON.stringify(err) ?? '');
              }
            })
        }
        GridItem() {
          Button("createRead/WriteStream")
            .type(ButtonType.Capsule)
            .fontSize(16)
            .width(180).height(40)
            .backgroundColor("#0000FF")
            .onClick(() => {
              this.message = ' ';
              let context = getContext(this) as common.UIAbilityContext;
              let pathDir = context.filesDir;

              try {
                let filePath1 = pathDir + "/test5.txt";
                let filePath2 = pathDir + "/test6.txt";
                let file = fs.openSync(filePath1, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                fs.writeSync(file.fd, "hello world");
                fs.closeSync(file);
                const rs = fs.createReadStream(`${filePath1}`);
                const ws = fs.createWriteStream(`${filePath2}`);
                const curOff = rs.seek(5, fs.WhenceType.SEEK_SET);
                console.info(`current offset is ${curOff}`);

                rs.on('readable', () => {
                  const data = rs.read();
                  if (!data) {
                    return;
                  }
                  const curOff = ws.seek(5, fs.WhenceType.SEEK_SET);
                  ws.write(data, "utf-8", ()=>{
                    setTimeout(()=> {
                      let fileContext = fs.readTextSync(filePath2);
                      this.message = fileContext;
                      ws.close();
                    },1000)
                  })
                });
              } catch (err) {
                console.error('stream failed! , Cause: %{public}s', JSON.stringify(err) ?? '');
              }
            })
        }
        GridItem() {
          Button("返回")
            .type(ButtonType.Capsule)
            .fontSize(16)
            .width(180)
            .height(40)
            .backgroundColor("#0000FF")
            .onClick(() => {
              router.back();
            })
        }
      }
      .rowsTemplate('1fr 1fr 1fr')
      .columnsTemplate('1fr 1fr')
      .height('33%')
      .width('98%')
    }
    .height('100%')
    .width('100%')
  }
}