2017-12-26 40 views
1

메모리와 시간 효율적인 방법으로 파일에서 UTF-8 텍스트를 읽으려고합니다. 노드의 ReadStream에서 동기식으로 읽는 방법

  • fs.readSync 파일에서 바이트의 일련의 금액을 읽고 반환됩니다

    • fs.readFileSync 전체 파일을 읽고 파일의 전체 내용을 포함하는 버퍼를 반환합니다 : 동 기적으로 파일에서 직접 읽을 수있는 두 가지 방법이 있습니다 그것은 쉬운 때문에 버퍼를 포함하는 바로 그 내용이

    나는 처음에 단지 fs.readFileSync을 사용하지만 효율적으로 한 번에 텍스트의 덩어리로 읽어 잠재적으로 큰 파일을 처리 할 수 ​​있도록하고 싶습니다. 그래서 대신 fs.readSync을 사용하기 시작했습니다. 그런데 fs.readSync은 UTF-8 디코딩을 처리하지 않는다는 것을 깨달았습니다. UTF-8은 간단하므로 일부 논리를 수동으로 디코딩 할 수는 있지만 Node에는 이미 서비스가 있으므로 가능한 경우이를 피하고 싶습니다.

    fs.createReadStream이 정확히 목적으로 사용할 수있는 ReadStream을 반환하지만 불행히도 비동기 작업 모드에서만 사용할 수있는 것처럼 보입니다.

    동기식으로 ReadStream에서 읽을 방법이 있습니까? 나는 이미이 스택 위에 막대한 스택을 가지고 있으며, 비동기 적이기 위해 리팩토링 할 필요가 없다.

  • +0

    스트림이 비동기입니다. 그건 바꿀 수 없어요. 물론 스트림에서 파일 핸들을 가져 와서'readSync()'와 동 기적으로 읽을 수는 있지만 스트림 인터페이스를 전혀 사용하지 않고 이미 시도한 것보다 좋지는 않습니다. – jfriend00

    +1

    필자는 인코딩과'readSync()'문제는 파일에서 임의의 바이트를 읽는 것이 멀티 바이트 문자의 정렬을 알 수 없으므로 UTF- 8 인코딩. 반면에 스트림이나'fs.readFileSync()'는 파일의 시작부터 시작하여 정렬을 보장 할 수 있습니다. – jfriend00

    +0

    네, 이것이 정확하게 문제입니다. 기본적으로 파일에서 개별적으로 디코딩 된 문자를 읽을 수있는 방법을 찾고 있지만 동기식입니다. 앞서 말했듯이'readSync'를 통해 직접 디코딩 로직을 구현할 수 있습니다.이 작업은 Node의 상자에서 이미 가능하다면 궁금합니다. – jchitel

    답변

    0

    내가 작성해야 할 모든 UTF-8 디코딩 로직을 처리하는 string_decoder 모듈을 발견했습니다. 이 시점에서, 내가 찾던 동기 동작을 얻으려면 fs.readSync 위에 이것을 사용하는 것이 당연한 것처럼 보입니다.

    기본적으로 바이트를 계속 입력하면 문자를 성공적으로 디코딩 할 수 있으므로 출력 할 수 있습니다. Node documentation은 어떻게 작동하는지 설명하는 데 충분합니다.